今日内容
- 数据库连接池
- Spring JDBC : JDBC Template
1 数据库连接池
1.1 概念
其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
1.2 好处:
- 节约资源
- 用户访问高效
1.3 实现:
- 标准接口:DataSource javax.sql包下的
- 获取连接:getConnection()
- 归还连接:Connection.close()
*如果连接对象Connection是连接池中获取的,那么调用Connection.close()方法不会关闭连接,而是归还到连接池。
- 一般我们不去实现它,由数据库厂商来实现
- C3P0:连接池旧技术,不常用
- Druid:阿里巴巴提供的新技术,效率更高
1.4 C3P0:数据库连接池技术
- 导入jar包
- c3p0-0.9.5.2.jar
- mchange-commons-java-0.2.12.jar
- 数据库驱动jar包
- 定义配置文件:
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:直接放到src目录下即可
- 创建数据库连接池对象
ComboPooledDataSource - 获取连接:
getConnection//1. 创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); //2. 获取连接对象 Connection conn = ds.getConnection();
1.5 Druid:数据库连接池技术(阿里)
- 导入jar包
druid-1.0.9.jar - 定义配置文件
- 是properties形式的
- 可以叫任意名称,可以房子任意目录
- 加载配置文件。Properties
- 获取数据库连接池对象:通过DruidDataSourceFactory工厂来获取
- 获取连接:getConnection
//3. 加载配置文件 Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //4. 获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); //5. 获取连接 Connection conn = ds.getConnection();
- 定义工具类
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 获取连接池的方法
public class JDBCUtils { //1. 定义成员变量 DataSource private static DataSource ds; static { try { //1. 加载配置文件 Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); //2. 获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOEXception e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrance(); } } //获取连接 public static Connection getConnection() throw SQLException { return ds.getConnection(); } //释放资源 public static void close(Statement stmt,Connection conn){ /* if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } }*/ close(null,stmt,conn); } public static void close(ResultSet rs , Statement stmt, Connection conn){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } } } //获取连接池方法 public static DataSource getDataSource() { return ds; } }
2 Spring JDBC
Spring框架对JDBC的简单封装。提供了JDBCTemplate对象简化JDBC的开发
2.1 导入jar包
2.2 创建JdbcTemplate对象。依赖数据源DataSoure
JdbcTemplate template = new JdbcTemplate(ds);
2.3 调用JdbcTemplate的方法完成CRUD的操作
- update():执行DML增删改语句。
- queryForMap():查询并将这条结果封装为Map集合,列名作为key,值作为value
*查询的结果集长度只能是1 - queryForList():查询并将结果集封装为list集合
*每一条记录都是一个Map集合,再将Map集合装载到List集合 - query():查询并将结果封装为JavaBean对象
*参数:RowMapper
*一般使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装,基本数据类型直接使用:类型.class
new BeanPropertyRowMapper<类型>(类型.class) - queryForObject:查询并将结果封装为对象
*一般用于聚合函数的查询,返回一行。public class JdbcTemplateDemo02 { //1. 获取JDBCTemplate对象 private JdbcTemplate template = new JdbcTemplate(JDBCUtiles.getDataSource()); //修改1号数据的salary为10000 @Test public void test1() { String sql = "update emp set salary = 10000 where id = 1"; template.update(sql); } //添加一条记录 @Test public void test2() { String sql = "insert into emp(id,name,dept_id) values(?,?,?)"; template.update(sql,1015,"爸爸",10); } //删除刚才添加的记录 @Test public void test3() { String sql = "delect from emp where id = ?"; template.update(sql,1015); } //查询id为1001的记录,将其封装为Map集合 @Test public void test4() { String sql = "select * from emp where id = ?"; Map<String,Object> map = template.qureyForMap(sql,1001); } //查询所有记录,将其封装为List @Test public void test5() { String sql = "select * from emp"; List<Map<String,Object>> list = template.queryForList(sql); for(Map<String,Object> map,list) { sout(map); } } //查询所有记录,将其封装为Emp对象的List集合 @Test public void test6() { String sql = "select * from emp"; List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class)); for(Emp emp : list) { sout(emp); } } //查询总记录数 @Test public void test7() { String sql = "select count(id) from emp"; Long total = template.queryForObject(sql,Long.class); } }