数据库连接池 小鱼儿 2021-11-29 10:36 492阅读 0赞 ## 今日知识 ## 1. c3p0和Druid使用 2. DBUtils使用 3. SpringJDBC轻量级框架 4. 总结 ## c3p0和Druid使用 ## 1. *概念:其实是一个容器(集合),存放数据库的容器。用户访问完在放回池子中 2. *好处: 1.节约资源 2. 用户访问高效 3. 实现: 1. 标准接口:DataSource javax.sql包下的 1.方法: *获取连接 Connection() *归还连接:Connection.close()如果连接对象connection是连接池获取的,此时应该是归还连接,不是直接关闭连接。 2. * c3p0连接池技术 * Druid连接技术,由阿里巴巴实现的。 4. C3P0的使用: *步骤: 1. 导入jar(两个),c3p0的包,和mchange-commons-java-0.2.12 jar包,+数据库连接的包 2. 定义配置文件: *名称:c3p0.properties 或者 c3p0-config.xml *路径:直接放在src目录下即可 3. 创建核心对象 获取数据库连接池对象 :combopooledDataSource(mchange-commons-java-0.2.12 jar包) 4. 获取连接:getConnection *核心代码: //获取dataSource,使用的默认配置 1.DataSource ds=new ComboPooledDataSource();//自动获取配置文件c3p0-config.xml //使用其他配置,带参的使用 2.DataSource ds=new ComboPooledDataSource("otherc3p0"); 3. 通过DataSource调用getConnection方法 4. 剩下的操作和原来一样 * 注意:C3p0只是一个管理连接池的一个容器,其他操作还和原来一样,先获取sql执行对象,在执行sql,最后处理结果。 5. Druid连接池 * 步骤 1.导入 druid-1.0.9jar包和数据库连接jar包 2. 定义配置文件:druid.properties *可以叫任意名称,放在任意目录下 3. 获取数据库连接池对象 :DruidDataSourceFactory.createDataSource(pro); 4. 获取连接:getConnection * 创建Utils工具使用: 1. 创建成员变量DataSource 2. 用静态代码块获取DataSource对象, 3. 创建getConnection方法 4.创建释放资源的方法 例如: public class DruidUtils { private static DataSource ds; //获取连接池对象 static { Properties pro=new Properties(); //获取配置文件,并返回流 InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"); try { pro.load(is); ds= DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //获取连接对象 public static Connection getConnection() throws SQLException { return ds.getConnection(); } //释放资源 public static void close(Connection con,Statement statement){ close(con,statement,null); } public static void close(Connection con, Statement statement, ResultSet rs){ if (rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } } //获取连接池的方法 public static DataSource getDatasource(){ return ds; } } ## DBUtils使用 ## * DBUtils框架 它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量 * 步骤: 1. 导包:commons-dbutils-jar 2. 创建QueryRunner对象,依赖数据源DataSource *QueryRunner runner=new QueryRunner(DruidUtils.getDatasource()); 3. 调用QueryRunner的方法来完成数据库操 1. update:用来执行一个更新(插入、更新或删除)操作。 2. batch:用来执行批量更新(插入、更新或删除)操作。 3. query(sql,new ArrayHandler()):把结果集中的第一行数据转成对象数组。 4. query(sql,new ArrayListHandler()):把结果集中的每一行数据都转成一个数组,再存放到List中。 5. query(sql,new BeanHandler()):将结果集中的第一行数据封装到一个对应的JavaBean实例中。 6. query(sql,new BeanListHandler()):将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 7. query(sql,new ColumnListHandler("name")):将结果集中某一列的数据存放到List中 8. query(sql,new KeyedHandler("name")):将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。 9. query(sql,new MapHandler()):将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 10. query(sql,new MapListHandler()):将结果集中的每一行数据都封装到一个Map里,然后再存放到List. 11. query(sql,new ScalarHandler()):将单个值封装,用来统计聚合函数返回值.如count,avg,max,min *代码: package com.rqy.datasource.dbutils; import com.rqy.datasource.Utils.DruidUtils; import com.rqy.datasource.bean.Account; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.*; import org.junit.Test; import java.sql.SQLException; import java.util.*; /** * @author 任清阳 * @Email 1277409109@qq.com * @date 2019/6/18 21:16 */ public class DButilsDemo2 { //1.导入jar包 private QueryRunner runner=new QueryRunner(DruidUtils.getDatasource()); //使用单元测试 /** * batch:用来执行批量更新(插入、更新或删除)操作。 */ @Test public void testBatch() throws SQLException { String sql="delete from account where name=? and balance=? "; Object[] [] params=new Object[10][]; for (int i = 0; i < 10; i++) { //为每一行给两列值,第一列对应第一个问号,第二列对应第二个问号 params[i]=new Object[]{i+"",3}; } int[] query = runner.batch(sql,params); System.out.println(Arrays.toString(query)); } /** * update:用来执行一个更新(插入、更新或删除)操作。 */ @Test public void test() throws SQLException { String sql="insert into account values(null,?,?) "; int query = runner.update(sql,"ren",5200); System.out.println(query); } /** *query: ArrayHandler:把结果集中的第一行数据转成对象数组。 */ @Test public void test1() throws SQLException { String sql="select * from account "; Object[] query = runner.query(sql, new ArrayHandler()); System.out.println(Arrays.toString(query)); } /** * query:ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。 */ @Test public void test2() throws SQLException { String sql="select * from account "; List<Object[]> query = runner.query(sql, new ArrayListHandler()); for (Object[] objects:query) { System.out.println(Arrays.toString(objects)); } } /** * BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 */ @Test public void test3() throws SQLException { String sql="select * from account "; Account query = runner.query(sql, new BeanHandler<Account>(Account.class)); System.out.println(query); } /** * BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 */ @Test public void test4() throws SQLException { String sql="select * from account "; List<Account> query = runner.query(sql, new BeanListHandler<Account>(Account.class)); for(Account account:query) { System.out.println(account); } } /** * ColumnListHandler:将结果集中某一列的数据存放到List中 */ @Test public void test5() throws SQLException { String sql="select * from account "; List<Object> query = runner.query(sql, new ColumnListHandler("name")); for(Object obj:query) { System.out.println(obj); } } /** * KeyedHandler(name):将结果集中的每一行数据都封装到一个Map<列名,列值>里 * 再把这些map再存到一个map里,其key为指定的key。 */ @Test public void test6() throws SQLException { String sql="select * from account "; Map<Object, Map<String, Object>> name = runner.query(sql, new KeyedHandler("name")); Set<Object> objects=name.keySet(); for(Object key:objects) { Map<String, Object> value=name.get(key); System.out.println(value); } } /** * MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 */ @Test public void test7() throws SQLException { String sql="select * from account "; Map<String, Object> query = runner.query(sql, new MapHandler()); System.out.println(query); } /** * MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List */ @Test public void test8() throws SQLException { String sql="select * from emp "; List<Map<String, Object>> list = runner.query(sql, new MapListHandler()); for (Map<String,Object> s:list ){ System.out.println(s); } } /** * 测试ScalarHandler:将单个值封装,用来统计聚合函数返回值 * * */ @Test public void test9() throws SQLException { Object query = runner.query("select count(*) from account", new ScalarHandler()); System.out.println(query); } } ## Spring JDBC ## * Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发 * 步骤: 1. 导入jar包 2. 创建JdbcTemplate对象。依赖于数据源DataSource * JdbcTemplate template = new JdbcTemplate(ds); 3. 调用JdbcTemplate的方法来完成CRUD的操作 1. update():执行DML语句。增、删、改语句 2. queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合 * 注意:这个方法查询的结果集长度只能是1 3. queryForList():查询结果将结果集封装为list集合 * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中 4. query():查询结果,将结果封装为JavaBean对象 * query的参数:RowMapper * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 * new BeanPropertyRowMapper<类型>(类型.class) 5. queryForObject:查询结果,将结果封装为对象 * 一般用于聚合函数的查询 4. 练习: * 需求: 1. 修改1号数据的 salary 为 10000 2. 添加一条记录 3. 删除刚才添加的记录 4. 查询id为1的记录,将其封装为Map集合 5. 查询所有记录,将其封装为List 6. 查询所有记录,将其封装为Emp对象的List集合 7. 查询总记录数 *代码: package com.rqy.datasource.jdbctemplate; import com.rqy.datasource.Utils.DruidUtils; import com.rqy.datasource.bean.Account; import org.junit.Test; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; import java.util.Map; /** * @author 任清阳 * @Email 1277409109@qq.com * @date 2019/6/18 15:36 */ public class JdbcTemplateDemo { //导入jar包 //创建JDBCTemplate对象 private JdbcTemplate template = new JdbcTemplate(DruidUtils.getDatasource()); //junit单元测试,可以让方法独立运行 /** * 1.修改1号数据的 salary 为 10000 * */ @Test public void test1(){ String sql="update emp set sal=5000 where empno=?"; int i=template.update(sql,01); System.out.println(i); } /** * 2.添加一条记录 * */ @Test public void test2(){ String sql="insert into emp (empno,ename,deptno)VALUES (?,?,?)"; int i=template.update(sql,"08","nihao","3"); System.out.println(i); } /** * 3.删除刚才添加的记录 * */ @Test public void test3(){ String sql="delete from emp where empno=?"; int i=template.update(sql,"08"); System.out.println(i); } /** * * 4.查询id为1的记录,将其封装为Map集合 * /注意:这个方法查询的结果集长度只能是1 */ @Test public void test4(){ String sql="select * from emp where empno=?"; Map<String, Object> map = template.queryForMap(sql, "01"); System.out.println(map); } /** * 5.查询所有记录,将其封装为List * 实际操作:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中 */ @Test public void test5(){ String sql="select * from emp "; List<Map<String, Object>> list = template.queryForList(sql); for (Map<String,Object> s:list ){ System.out.println(s); } } /** * 6.查询所有记录,将其封装为Emp对象的List集合 */ @Test public void test6(){ String sql="select * from account "; List<Account> accounts = template.query(sql, new BeanPropertyRowMapper<Account>(Account.class)); for (Account s:accounts){ System.out.println(s); } } /** * 7. 查询总记录数 */ @Test public void test7(){ String sql="select count(id) from account "; Long i=template.queryForObject(sql,Long.class); System.out.println(i); } } 转载于:https://www.cnblogs.com/rqy0526/p/11067285.html
相关 数据库-----数据库连接池 @百度百科 ![Center][] [Center]: /images/20220721/39979dcdad014fb6a1579254a5398d26.png 古城微笑少年丶/ 2022年09月21日 11:56/ 0 赞/ 315 阅读
相关 数据库连接池 连接池原理 连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、治理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立 水深无声/ 2022年08月02日 09:37/ 0 赞/ 59 阅读
相关 数据库连接池 author:skate time:2010-10-13 -------------------- 数据库连接池的工作原理 连接池就是连接数据库对象的缓冲存 柔情只为你懂/ 2022年07月14日 16:46/ 0 赞/ 48 阅读
相关 数据库连接池 数据库连接池 1.概述 > 数据库连接池就是存放数据库连接(Connection)的集合 > 我们获取一个数据库连接是一个相对很麻烦的过程,如果我们获取一个数据 电玩女神/ 2022年06月09日 05:28/ 0 赞/ 337 阅读
相关 数据库连接池 连接池:把连接放在一个池里,它里面有很多连接 会给你空闲的连接使用,Java从数据源里面的得到连接 (线程池把连接放进去,会有连接的标志--占用/空闲 你去拿时-- 给你/等 一时失言乱红尘/ 2022年05月16日 00:16/ 0 赞/ 374 阅读
相关 数据库连接池 public class java_数据库连接池 { //1.定义变量 //管理数据连接池对象 private ComboPool 妖狐艹你老母/ 2022年05月11日 14:24/ 0 赞/ 247 阅读
相关 数据库连接池 连接池直接使用别人提供的就可以,需要做的就是导入jar包和配置文件的使用按照他们的规范 jar包有 (fastjson.jar包可以不要,这个是使用json和前端进行数据交 快来打我*/ 2022年05月04日 03:27/ 0 赞/ 369 阅读
相关 数据库连接池 要是考虑到JDBC连接中用到Connection 在每次对数据进行增删查改都要开启、关闭,在实例开发项目中,浪费了很大的资源。因此采用连接池技术。 //数据库连接 pub 秒速五厘米/ 2022年02月14日 00:27/ 0 赞/ 414 阅读
相关 数据库连接池 今日知识 1. c3p0和Druid使用 2. DBUtils使用 3. SpringJDBC轻量级框架 4. 总结 c3p0和Dru 小鱼儿/ 2021年11月29日 10:36/ 0 赞/ 493 阅读
相关 数据库连接池 传统的jdbc连接数据库方式如下: 我们需要几个步骤:注册 JDBC 驱动程序注册( Class.forName(DRIVER\_NAME) ),通过DriverManag 爱被打了一巴掌/ 2021年09月10日 05:40/ 0 赞/ 611 阅读
还没有评论,来说两句吧...