【JDBC】连接池 + Spring JDBC

news/2024/5/19 2:10:25 标签: jdbc, 数据库, java, mysql

 

○●○ 数据库连接池

 
本质: 存放数据库连接的容器(集合)。

原理: 容器中会申请一些连接对象。当用户来访问数据库时,从容器中获取连接对象;访问结束,归还连接对象给容器。

优点 不言而喻:

  1. 降低资源消耗(减少了创建和销毁连接的次数,每个连接可以重复使用)
  2. 提高相应速度(用户不用等待连接创建,而是直接从连接池中获取)

实现:

java">连接池是个javax.sql包下的DataSource接口

getConnection()		获取连接
close()				归还连接(这种语境下,不是"关闭",而是"归还"): 这个接口不是由sun公司实现,而是由数据库厂商提供实现类(驱动):	 1. C3P0   2. Druid (阿里巴巴提供)
java">
----------------------------------------- C3P0 数据库连接池技术 -------------------------------------------------

1. 导入两个jar包 (复制到libs目录,然后添加到目录), 数据库驱动jar包也要提前导入
2. 定义配置文件 (配置文件会被自动寻找到)* 名称: c3p0.properties 或者 c3p0-config.xml
		* 路径:直接将文件放在src目录下


DataSource pool = new ComboPooledDataSource();						// 文件中默认配置
DataSource pool = new ComboPooledDataSource("otherc3p0");			// 指定文件中的其他配置
Connection conn = pool.getConnection();
conn.close();



----------------------------------------- Druid 数据库连接池技术 ------------------------------------------------

1. 导入jar包
2. 定义配置文件:properties形式的,任意名称,可以放在任意目录下; 需要手动加载


// 因为配置文件的位置是任意的,因此需要手动加载配置文件
// 但这个加载很简单,不需要分别获取配置文件的键值对,然后注册驱动;作为一个流直接传给工厂就可以了

Properties pro = new Properties();
InputStream stream = Demo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(stream);
DataSource pool = DruidDataSourceFactory.createDataSource(pro);

Connection conn = pool.getConnection();
conn.close();

 

 

 

○●○ Spring JDBC

 
▶ Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。

java">1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
 
	* JdbcTemplate template = new JdbcTemplate(pool);		 // 传入一个DataSourse连接池对象

3. 调用JdbcTemplate的方法来完成CRUD的操作
 
	* update()				执行DML语句
	* queryForMap()			DQL结果集封装为Map
	* queryForList()		DQL结果集封装为List (每个元素是一个Map)
	* query()				DQL结果封装为JavaBean对象(参数为"new BeanPropertyRowMapper<>(类型.class)",返回指定类型的集合)
	* queryForObject()  	DQL结果封装为对象(用来执行带有聚合函数的sql)

java">
---------------------------------------- 5种方法 测试Test ------------------------------------------------------
public class Test {

	// 创建JdbcTemplate对象(传入一个DataSource连接池)
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSourse());

    @Test
    public void test1(){
        String sql = "delete from loliTable where id= ?";
        template.update(sql, 1);
    }
    // 执行DML语句(返回受影响的行数)

    @Test
    public void test2(){
        String sql = "select * from loliTable where loliName = ?";
        Map<String, Object> map = template.queryForMap(sql, "Alice");
        System.out.println(map);
    }
    // {id=1, loliName=Alice, loliAge=12}
    // 注:要保证查询结果集只有一行

    @Test
    public void test5(){
        String sql = "select * from loliTable";
        List<Map<String, Object>> list = template.queryForList(sql);
        System.out.println(list);
    }
    // [{id=1, loliName=Alice, loliAge=12}, {id=2, loliName=Chino, loliAge=10}, {id=3, loliName=Hana, loliAge=11}]
    // 多行Map结果集的List集合. 

    @Test
    public void test6(){
        String sql = "select * from loliTable";
        List<Loli>  lolis = template.query(sql, new BeanPropertyRowMapper<>(Loli.class));
        System.out.println(lolis);
    }
    // [Loli{id=null, loliName='null', loliAge=null}, Loli{id=null, loliName='null', loliAge=null}, Loli{id=null, loliName='null', loliAge=null}]
    // 对象的集合. 与上面的相比,这是最常见的写法. 
    // BeanPropertyRowMapper是RowMapper接口的实现类,帮我完成了【转化成对象】的工作; 
    // 我们也可以手动实现RowMapper接口,覆盖mapRow(ResultSet, int)方法————这个方法会迭代执行,完成结果集→对象的转化

    @Test
    public void test7(){
        String sql = "select count(id) from loliTable";
        Long total = template.queryForObject(sql, Long.class);
        System.out.println(total);
    }
    // 返回3. queryForObject一般用于执行带有聚合函数的sql
    
}

 

 

 

 

 

 

 

 

 

 

 

 
End


http://www.niftyadmin.cn/n/1330480.html

相关文章

实现用户密码登录(MySQL数据库+自行封装的JDBC工具类)

★ JDBC的核心就是&#xff1a; 注册驱动 → 获取连接 → 获取sql执行对象 → 执行sql → 释放资源 -------------------------------------- jdbc.properties 配置文件 ------------------------------------------------driverClassNamecom.mysql.cj.jdbc.Driver urlj…

hiho#1107 : Shortest Proper Prefix (统计非指定前缀在字符串集中出现次数)

1107 : Shortest Proper Prefix 时间限制:10000ms 单点时限:1000ms 内存限制:512MB 描述 Query auto-completion(QAC) is widely used in many search applications. The basic idea is that when you type some string s in the search box several high-frequency que…

【图解算法】染上龙血的勇者——彻底理清【递归】【记忆化搜索】【动态规划】的关系

很久以前&#xff0c;有一个王国。 突然有一天&#xff0c;国王的女儿失踪了。 一名勇者去寻找她。他年轻、强大、无畏&#xff0c;只是有着致命的软肋。 他提剑找寻到了森林深处的山顶&#xff0c;山洞里是公主和一头恶龙。 为了打败恶龙&#xff0c;勇者饮下了龙血。…

【LeetCode】Sama的个人记录_27

【Q95】(md) 不同的二叉搜索树Ⅱ 给定一个整数 n&#xff0c;生成所有由 1 … n 为节点所组成的 二叉搜索树 。 示例&#xff1a; 输入&#xff1a;3 输出&#xff1a; [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] >>> 这道题…

区间异或最大

首先我们看这样一个问题&#xff1a;给定一个包含N个整数的集合S{A1, A2, A3, … AN}。然后有M个询问&#xff0c;每次询问给定一个整数X&#xff0c;让你找一个Ai使得Ai xor X的值最大。 这道题也是可以用Trie解决的。首先我们知道一个整数可以用二进制表示成一个01串。比如3…

【Tomcat】配置Web项目+理解Tomcat文件夹

web相关概念回顾 ▶ 软件架构 C/S&#xff1a;客户端/服务器端B/S&#xff1a;浏览器/服务器端 ▶ 资源分类 ▶ 网络通信三要素&#xff1a;IP 端口 传输协议 web服务器软件 服务器&#xff1a;通俗的说&#xff0c;就是安装了服务器软件的计算机 服务器软件&#xff…

hdu 4825 (Xor Sum) 字典树异或问题

题目链接 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 5132 Accepted Submission(s): 2222 Problem Description Zeus 和 Prometheus 做了一个游戏&#xff0c;Prometheus 给 Zeus 一个集合&#xff0c;集合…

【XML】XML知识点汇总——标签化的键值对信息

基础知识 概念&#xff1a; Extensible Markup Language&#xff0c;可扩展标记语言 说明&#xff1a;可扩展的意思是&#xff0c;标签都是自定义的 功能&#xff1a;存储数据&#xff08;配置文件&#xff0c;在网络中传输&#xff09; xml与html的区别&#xff1a; html…