19-JDBC、代码优化

时间:2021-08-09 03:07:54

JDBC

Java Database Connectivity,Java数据库连接
JDBC的本质是Java对所有关系型数据库进行连接操作所制定的一套规则,就是接口。
不同的数据库针对这套规则制定了相对应的实现类,我们需要使用这些已经做好的实现类,来使用Java对数据库进行连接和操作。

实现步骤:

1、导入jar包

在项目的根目录中创建lib文件夹
将mysql-connector-java-5.1.37-bin.jar复制到lib中
数据库驱动的版本一定要和数据的版本是对应的,如果版本差距过大是会报错的。
右键点击该jar包,选择Build Path,点击Add to Build Path

2、注册驱动

Class.forName("com.mysql.jdbc.Driver");

3、获取连接对象

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名", "用户名", "密码");   
访问本地数据库路径的简写:jdbc:mysql:///库名

4、编写SQL语句
5、获取执行对象

Statement state = conn.createStatement();

6、执行SQL语句

state.executeUpdate(sql) 实现增删改
state.executeQuery(sql) 实现查询

7、处理执行结果

如果是增删改,判断是否执行成功
    executeUpdate方法返回int,用于判断增删改影响的记录数
如果是查询,获取结果集
    executeQuery方法返回ResultSet结果集,查询得到的结果被封装在了这个结果集中。
    需要遍历集合来获取所有查询的结果
    使用方法:
    1、next():判断是否有下一个可以获取的查询结果,返回布尔值
    2、getXxx(int):在指定的记录中,通过字段的位置获取字段值
    3、getXxx(String):在指定的记录中,通过字段名获取字段值
    
    代码:
    ResultSet set = state.executeQuery();
    while(set.next()){
        set.getXxx(int/String);
    }

8、释放资源

if(conn != null){
    try {
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
if(state !=null){
    try {
        state.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
package jdbc;
/**
*增加
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TeacherShow {

    public static void main(String[] args) {
        // 1.准备动作引入jar包
        Connection conn = null;
        Statement state = null;
        try {
            // 2.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 3. 获取连接对象
            // 参数1.要访问的数据库 参数2.数据库的用户名 参数3.数据库的密码
            conn = DriverManager.getConnection("jdbc:mysql:///company", "root", "root");
            // 4.编写SQL语句
            String sql = "insert into stu values (null,'ls',21)";
            // 5.获取执行对象
            state = conn.createStatement();
            // 6.执行SQL语句
            int row = state.executeUpdate(sql);
            // 7.处理执行结果
            if (row > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (ClassNotFoundException e) {
            System.out.println("驱动包加载失败");
        } catch (SQLException e) {
            System.out.println("数据库连接失败");
        } finally {
            // 8.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (state != null) {
                try {
                    state.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
package day18作业.No1;

import java.sql.*;
public class HomeworkQuery {
    public static void main(String[] args) {
        //写在外面因为finally要用
        Connection connection = null;
        Statement statement = null;
        ResultSet set = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql:///dbs", "root", "root");
            statement = connection.createStatement();
            set = statement.executeQuery("select * from student");
            while (set.next()) {
                System.out.println(set.getInt(1)   "  "   set.getString("sname")   "  "   set.getInt(3));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (set != null) {
                try {
                    set.close();
                } catch (SQLException e) {
                    System.out.println("查找失败");
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    System.out.println("执行失败");
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    System.out.println("连接失败");
                }

            }
        }
    }
}

额外

  • 在Java中资源释放要保持先开后关的原则。就是从里往外关,因为资源之间存在依赖关系。
  • 在Java中写sql命令的时候,注意字符不要使用双引号,会和字符串引号冲突。
  • 为什么把Connection conn = null;Statement state = null;写在try-catch外面?是因为作用域的问题,一旦写在try内部,finally就访问不了释放不了。
  • 为什么要把他的值为空?还记得只有成员变量有默认值,基本是0,引用时null这句话。所以局部变量是没有默认值的。null相当于完成了初始化,不赋值相当于没有完成初始化。
  • 为什么在sql命令拼接的时候使用" sql命令 "?其实这没事吗好奇妙的,也不是语法。你会发现第一个"是上一个字符串的结尾,在Java中 是作为字符串的拼接,而这中间的sql命令其实也是字符类型的,总结起来不过是字符串的拼接罢了。不管拼接的是什么类型都会变成字符类型。

二. PreparedStatement

预编译的SQL
作用:防止SQL的注入问题

例如:xxx‘ or ‘1‘=‘1,来完成登录功能。

使用步骤:
1、获取对象,并传入要执行的SQL语句

String sql = "";
PreparedStatement state = conn.prepareStatement(sql);

2、向SQL语句的占位符添加数据

state.setXxx(位置,数据);
例如:select * from 表名 where username = ? and password = ?
state.setString(1,用户名);
state.setString(2,密码);

3、执行SQL,不需要传入SQL语句

state.executeUpdate();
state.executeQuery();

三. 数据库连接池

概念:数据库连接池的本质是一个存储若干个数据库连接对象的容器(集合),用户在访问数据库时,可以直接从该容器中获取连接对象,对数据库进行操作,在使用完毕后将此连接对象归还到池中。

好处:
1、节省资源
2、提高访问效率

DataSource连接池接口
1、getConnection():获取连接

一般这个接口我们不会自己去实现,都用第三方做好的jar包
1、c3p0:Apache组织的

步骤:
1、导入c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar(c3p0要依赖这个包mchange-commons-java.jar)
2、在src下配置c3p0-config.xml文件
    在文件中配置:
        <c3p0-config>
            <named-config name="mypool">
                <property name="drvierClass">com.mysql.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql://localhost:3306/库名</property>
                <property name="user">root</property>
                <property name="password">root</property>
                <property name="initialPoolSize">5</property>
            </named-config>
        </c3p0-config>
3、获取连接池
    DataSource ds = new ComboPooledDataSource("mypool");
4、获取连接对象
    ds.getConntion();
5、归还连接
    ds.close();

2、druid:阿里巴巴的

步骤:
1、导入druid-1.0.9.jar
2、在项目的任意位置配置任意文件名的properties文件
    在文件中配置
        driverClassName=com.mysql.jdbc.Driver
        url=jdbc:mysql://localhost:3306/库名
        username=root
        password=root
        initialSize=5
3、使用连接池工厂创建连接池
    // 专门用于读取properties文件的类
    Properties pro = new Properties();
    // 使用load方法将properties文件载入
    pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
    // 使用DruidDataSourceFactory创建连接池
    ds = DruidDataSourceFactory.createDataSource(pro);
4、获取连接对象
    ds.getConntion();
5、归还连接
    ds.close();

QueryRunner类的使用

dbutils中提供的一些工具。

  1. BeanHandler (对象类.class):返回一个对象
  2. BeanListHandler (对象类.class):返回对象集合
  3. ScalarHandler (对象类.class):聚合函数查询
    这里一定要注意必须用long类型去接,不然int根本接不住啊,总是错,切记切记。