关于JDBC
··· 概念:
· JDBC是java数据库连接的一套标准规范,可以用一套API统一操作各种数据库。
··· 关系:
· java.sql.*中定义的是一套接口,各大数据库厂商提供的驱动来实现这个接口,从而达到兼容。
1,使用JDBC
··· 使用步骤:
1,注册驱动。将驱动jar包加载到JVM,Class.forName("com.mysql.jdbc.Driver");
2,创建连接。根据驱动创建数据库连接,DriverManager.getConnection(url, name, pwd);
3,创建执行语句的Statement。conn.createStatement();
4,执行SQL,获得结果。statement.execute(sql);
5,处理结果。
6,关闭资源。
··· 注意事项:
· 从jdk5之后就不需要注册驱动了,DriverManager会自己到CLASSPATH中找驱动。
· MySQL5的驱动是com.mysql.jdbc.Driver,MySQL6及以上是com.mysql.cj.jdbc.Driver。
· MySQL6及以上版本的连接url中要加时区,?serverTimezone=Asia/Shanghai,否则报错。
· 当数据库连接对象不再被引用时,也会被GC回收,但是GC回收的只是JVM内存中的连接对 象资源,而连接对象所关联的系统资源是不能被GC回收的,所以必须调用close()方法来关 闭系统资源。对于mysql数据库,在JVM退出后socket断开,服务器端会关闭数据库连接。
2,Statement
··· 作用:由数据库连接创建,用来执行SQL语句。
··· 实例方法:
· executeQuery(sql):用来执行查询语句,select。返回ResultSet类型的结果。
· executeUpdate(sql):用来执行更新语句,insert、update和delete。并返回影响的行数。
· execute(sql):可以执行上面两种类型语句,如果是select返回true。不推荐使用。
··· PreparedStatement:
· 预编译的Statement,可以完全避免SQL注入。推荐使用。
· 先编写SQL语句,并用?作为占位符;预编译后,再通过setObject()设置?占位符的传参数。
3,ResultSet
··· 作用:select语句返回的结果集类型。
··· 注意事项:
· getObject(String name);是根据select中列的别名来获取数据。
· 当调用ResultSet的close()方法后,不能再调用next()方法访问其中的数据。
4,JDBC控制事务
··· 概念:MySQL默认自动提交事务,即每条语句就是一个事务。
··· 使用步骤:
1,将connection的自动提交设为false。conn.setAutoCommit(false);
2,手动提交事务。conn.commit();
3,如果异常就回滚。conn.rollback();
5,DBCP数据库连接池
··· 作用:解决建立数据库连接需要消耗很多资源和时间的问题,可以提高性能。
··· DBCP:
· 准备:commons-pool.jar、commons-dbcp.jar;配置文件:dbcp.properties。
· 使用步骤:
1,加载配置文件:properties.load("dbcp.properties");
2,初始化DataSource:BasicDataSourceFactory.createDataSource(properties);
3,获得Connection:dataSource.getConnection();
··· 注意事项:
· 自定义数据库连接池要实现javax.sql.DataSource接口。
6,DBUtils
··· 作用:DBUtils是数据库操作实用工具,封装了对JDBC的操作。类似于ORM框架。
··· 优点:
· 对于数据表读操作,可以把结果转换为List,Array,Set等java集合,方便操作。
· 对于写操作也变得简单,只需要写SQL。
· 可以通过数据库连接池来优化性能(连接复用)。
··· 三个核心对象:QueryRunner类,ResultSetHandler接口,DBUtils类。
··· QueryRunner:
· 作用:提供对sql语句操作的API。导入commons-dbutils.jar
· 例子:QueryRunner queryRunner = new QueryRunner(dataSource);
· query():用来执行select操作。
· update():用来执行insert,update,delete操作。
· batch():批操作。
··· ResultSetHandler:
· 作用:用于select操作后,怎么封装结果集。
· 例子:Cat cat = queryRunner.query(sql, new BeanListHandler<>(Cat.class));
··· DBUtils:
· 作用:工具类,用来关闭资源,与事务的处理的方法。