1.连接池
1. 问题:之前的jdbc操作,每执行一个操作,就要获取一条连接对象(Connection对象),用完还要销毁,这样会耗费内存资源
过程:池子创建之后,如果来了任务,池子中有连接对象,就直接用,用完还回去,不用频繁的去创建连接对象,销毁连接对象
对于不同连接池的sun提供了一套标准接口图解
2. 连接池之C3p0(扩展)
1. .java为连接池提供了一个标准,公共接口:javax.sql.DataSource,不同的厂商如果想要实现自己的连接池,就需要实现DataSource接口
常用的连接池: C3p0, Druid(最常用)
2. 使用步骤
1.导jar包:c3p0-0.9.1.2.jar
2.在resources下面创建c3p0-config.xml->名字不能错
3.在xml中配置相关信息
4.编写工具类:
接口:DataSource
c3p0连接池实现类:ComboPooledDataSrouce
获取连接,是在连接池中获取:ComboPooledDataSrouce对象.getConnection()
代码示例:
1.创建c3p0工具类
public class C3p0Utils { private static DataSource dataSource; static { dataSource = new ComboPooledDataSource(); } public static Connection getConn(){ Connection conn = null; try { conn = dataSource.getConnection(); } catch (SQLException throwables) { throwables.printStackTrace(); } return conn; } public static void close(Connection conn, Statement stat, ResultSet res){ if (res != null){ try { res.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (stat != null){ try { stat.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
2.通过c3p0获取连接池中的对象,并使用
Connection conn = C3p0Utils.getConn(); String sql = "insert into category (cname) values (?)"; PreparedStatement stat = conn.prepareStatement(sql); stat.setObject(1, "手机"); stat.executeUpdate(); C3p0Utils.close(conn,stat, null);
3. 连接池之Druid(德鲁伊)
1. 概述:Druid连接池是阿里巴巴开发的
好处:性能好,抗造
使用: a.到jar包:druid-1.1.10.jar
b.在resources或者src下编写properties配置文件->druid.properties
2. 编写properties配置文件
3. 编写Druid的工具类:
DruidDataSourceFactory.createDataSource(Properties集合);返回的是DataSource接口的实现类
代码示例:
1.
public class DruidUtils { private static DataSource dataSource; static { Properties pro = new Properties(); InputStream in = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"); try { pro.load(in); dataSource = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConn(){ Connection conn = null; try { conn = dataSource.getConnection(); } catch (SQLException throwables) { throwables.printStackTrace(); } return conn; } public static DataSource getDataSource(){ return dataSource; } public static void close(Connection conn, Statement stat, ResultSet res){ if (res != null){ try { res.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (stat != null){ try { stat.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
2.通过druid工具类获取连接池中的对象,并使用
Connection conn = DruidUtils.getConn(); String sql = "delete from category where cid = ?"; PreparedStatement pst = conn.prepareStatement(sql); pst.setObject(1, 3); pst.executeUpdate(); DruidUtils.close(conn, pst, null);
2.DBUtils工具包
1. DBUtils的介绍
1.为什么要学DBUtils:使用原生的jdbc开发,代码很多,比较恶心,会影响我们的开发效率,而DBUtils可以大大的简化JDBC的开发
2.什么是DBUtils:是简化jdbc开发步骤的一个开发工具包
3.使用: 导jar包:commons-dbutils-1.6.jar
4.DBUtils工具包中三大核心对象:
a.QueryRunner:定义了执行sql的方法-> 主要用的
b.ResultSetHandlder:有很多处理结果集的对象 -> 主要用的
c.Dbutils:是DBUtils工具包中的一个类,里面定义了很多关闭资源以及操作事务等方法
2. QueryRunner
1. 空参的QueryRunner的介绍以及使用
1.QueryRunner()
a.特点:需要我们自己维护连接对象(需要自己获取连接对象,释放连接对象),支持sql中使用占位符?
2.方法:
a.int update(Connection conn, String sql, Object... params)->执行sql,针对于增删改操作
conn:连接对象
sql:sql语句
params:可变参数,给sql中的?赋值
第一个值,就是给第一个?赋值,自动匹配
第二个值,就是给第二个?赋值,自动匹配
比如:update(conn,"insert into category(cid,cname) values (?,?)",1,"蔬菜")
Object[] obj = {1,"蔬菜"}
update(conn,"insert into category(cid,cname) values (?,?)",obj)
b. T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)->针对于查询语句执行
conn:连接对象
sql:sql语句
rsh:处理结果集的方式
params:可变参数,给sql中的?赋值
第一个值,就是给第一个?赋值,自动匹配
第二个值,就是给第二个?赋值,自动匹配
2. 有参QueryRunner的介绍以及使用
1.使用有参QueryRunner特点:
不需要我们自己维护连接,QueryRunner会自动维护连接对象
说白了就是不需要自己从连接池中获取连接,也不需要我们自己关闭或者归还连接池
2.构造:
QueryRunner(DataSource ds)
DataSource:传递连接池对象
3.方法:
int update(String sql, Object... params)->针对于增删改操作
sql:sql语句
params:可变参数,给sql中的?赋值
第一个值,就是给第一个?赋值,自动匹配
第二个值,就是给第二个?赋值,自动匹配
T query(String sql, ResultSetHandler<T> rsh, Object... params)
sql:sql语句
rsh:处理结果集的方式
params:可变参数,给sql中的?赋值
第一个值,就是给第一个?赋值,自动匹配
第二个值,就是给第二个?赋值,自动匹配
3. ResultSetHandler结果集
1. 标准的JavaBean
什么是JavaBean:实体类
开发的过程中:JavaBean中的成员变量要和具体表中的字段要对应
一个标准的JavaBean如何编写:成员变量 构造 get/set 方法 hashcode和equals方法 toString,此类还需要实现Serializable
2. 注意事项:
1.要求:定义javabean的时候里面的字段类型都要是引用数据类型,基本类型的字段也要写成包装类
2.问题:为什么定义javabean的时候,要使用包装类呢?
a.因为包装类的默认值为NULL,如果我们的主键是自增,sql语句可以写成:
insert into category(cid,cname) values (NULL,'蔬菜');
b.使用包装类,如果有需要的话,可以直接调用包装类中的方法操作字段数据
3. javabean和数据库表联系图解
4. BeanHandler
1.作用:将查询出来的结果集中的第一行数据封装成javabean对象
2.方法:
query(String sql, ResultSetHandler<T> rsh, Object... params)>有参QueryRunner时使用
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)->空参QueryRunner时使用
3.构造:
BeanHandler(Class type)
传递的class对象其实就是我们想要封装的javabbean类的class对象
想将查询出来的数据封装成哪个javabean对象,就写哪个javabean的class对象
4.怎么理解:
将查询出来的数据为javabean中的成员变量赋值
5. BeanListHandler
1.作用:将查询出来的结果每一条数据都封装成一个一个的javabean对象,将这些javabean对象放到List集合中
2.构造:
BeanListHandler(Class type)
传递的class对象其实就是我们想要封装的javabbean类的class对象
想将查询出来的数据封装成哪个javabean对象,就写哪个javabean的class对象
3.怎么理解:
将查询出来的多条数据封装成多个javabean对象,将多个javabean对象放到List集合中
6. ScalarHandler
1.作用:主要是处理单值的查询结果的,执行的select语句,结果集只有1个
2.构造:
ScalarHandler(int columnIndex)->不常用->指定第几列
ScalarHandler(String columnName)->不常用->指定列名
ScalarHandler()->常用
3.注意:
ScalarHandler和聚合函数使用更有意义
7. ColumnListHandler
1.作用:将查询出来的结果中的某一列数据,存储到List集合中
2.构造:
ColumnListHandler(int columnIndex)->指定第几列
ColumnListHandler(String columnName)->指定列名
ColumnListHandler()-> 默认显示查询结果中的第一列数据
3.注意:
ColumnListHandler可以指定泛型类型,如果不指定,返回的List泛型就是Object类型