JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】
- 黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm
- JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】【day01】
- JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】【day01】
- JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】【day01】、【day02】
目录
07 JDBC事务管理
JDBC管理事务_概述
JDBC管理事务_实现
08 数据库连接池
今日内容
数据库连接池_概述
数据库连接池_实现介绍
数据库连接池_c3p0_基本使用
新建项目 day05_dataSource_jdbcTemplate
复制c3p0配置文件(c3p0-config.xml)到工程src目录下
c3p0的演示
数据库连接池_c3p0_配置演示
连接池——最大的连接数量
连接池——超时时间
连接池——使用非默认配置
数据库连接池_druid_基本使用
数据库连接池_druid_工具类
数据库连接池_druid_工具类测试
JDBCUtils.java
DruidDemo2.java
09 JDBCTemplate
JDBCTemplate_介绍
JDBCTemplate_快速入门
JDBCTemplate_执行DML语句
注解 Junit单元测试,可以让方法独立执行
1. 修改1号数据的 salary 为 10000
2. 添加一条记录
3.删除刚才添加的记录
JDBCTemplate_执行DQL语句
4.查询id为1001的记录,将其封装为Map集合
5. 查询所有记录,将其封装为List
6. 查询所有记录,将其封装为Emp对象的List集合
7. 查询总记录数
JUnit 代码
07 JDBC事务管理
JDBC管理事务_概述
1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2. 操作:
1. 开启事务
2. 提交事务
3. 回滚事务
3. 使用Connection对象来管理事务
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()
JDBC管理事务_实现
1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2. 操作:
1. 开启事务
2. 提交事务
3. 回滚事务
3. 使用Connection对象来管理事务
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 在执行sql之前开启事务
* 提交事务:commit()
* 当所有sql都执行完提交事务
* 回滚事务:rollback()
* 在catch中回滚事务4. 代码:...
package cn.itcast.jdbc;import cn.itcast.util.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** 事务操作——JDBC控制事务*/
public class JDBCDemo10 {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt1 = null;PreparedStatement pstmt2 = null;try {//1.获取连接conn = JDBCUtils.getConnection();//开启事务conn.setAutoCommit(false);//2.定义sql//2.1 张三 - 500String sql1 = "update account set balance = balance - ? where id = ?";//2.2 李四 + 500String sql2 = "update account set balance = balance + ? where id = ?";//3.获取执行sql对象pstmt1 = conn.prepareStatement(sql1);pstmt2 = conn.prepareStatement(sql2);//4. 设置参数pstmt1.setDouble(1, 500);pstmt1.setInt(2, 1);pstmt2.setDouble(1, 500);pstmt2.setInt(2, 2);//5.执行sqlpstmt1.executeUpdate();// 手动制造异常int i = 3 / 0;pstmt2.executeUpdate();//提交事务conn.commit();} catch (Exception e) { // 只要出现异常,就进行事务的回滚 捕捉大异常//事务回滚try {if (conn != null) {conn.rollback();}} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();} finally {JDBCUtils.close(pstmt1, conn);JDBCUtils.close(pstmt2, null);}}}
08 数据库连接池
今日内容
- 数据库连接池
- Spring JDBC : JDBC Template
写代码来获取连接,用完之后 释放掉。获取连接:向操作系统底层申请资源(耗时)。用完之后 释放,用完之后 释放,用完之后 释放... 导致系统运行较慢!
使用“数据库 连接池”解决 性能低、资源浪费的情况。
Spring JDBC提供JDBC Template技术(JDBC封装),简化JDBC编程。
数据库连接池_概述
1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。2. 好处:
1. 节约资源
2. 用户访问高效
数据库连接池_实现介绍
1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。2. 好处:
1. 节约资源
2. 用户访问高效3. 实现:
1. 标准接口:DataSource javax.sql包下的
1. 方法:
* 获取连接:getConnection()
* 归还连接:Connection.close() 如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。2. 一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术
2. Druid:数据库连接池实现技术,由阿里巴巴提供的
数据库连接池_c3p0_基本使用
4. C3P0:数据库连接池技术
* 步骤:
1. 导入jar包 (两个) c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar ,
* 不要忘记导入数据库驱动jar包
2. 定义配置文件:
* 名称: c3p0.properties 或者 c3p0-config.xml
* 路径:直接将文件放在src目录下即可。3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接: getConnection
* 代码:
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
新建项目 day05_dataSource_jdbcTemplate
新建libs文件夹:
复制c3p0配置文件(c3p0-config.xml)到工程src目录下
c3p0的演示
数据库连接池_c3p0_配置演示
连接池——最大的连接数量
连接池——超时时间
连接池——使用非默认配置
数据库连接池_druid_基本使用
5. Druid:数据库连接池实现技术,由阿里巴巴提供的。
1. 步骤:
1. 导入jar包 druid-1.0.9.jar
2. 定义配置文件:
* 是properties形式的
* 可以叫任意名称,可以放在任意目录下
3. 加载配置文件。Properties
4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
5. 获取连接: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();
package cn.itcast.datasource.druid;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;/*** Druid演示*/
public class DruidDemo {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//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();System.out.println(conn);}
}
数据库连接池_druid_工具类
2. 定义工具类
1. 定义一个类 JDBCUtils
2. 提供静态代码块加载配置文件,初始化连接池对象
3. 提供方法
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法* 代码:...
数据库连接池_druid_工具类测试
JDBCUtils.java
package cn.itcast.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** Druid连接池的工具类*/
public class JDBCUtils {//1.定义成员变量 DataSourceprivate static DataSource ds ;static{try {//1.加载配置文件Properties pro = new Properties();pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));//2.获取DataSourceds = 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(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;}}
DruidDemo2.java
package cn.itcast.datasource.druid;import cn.itcast.utils.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** 使用新的工具类*/
public class DruidDemo2 {public static void main(String[] args) {/** 完成添加操作:给account表添加一条记录*/Connection conn = null;PreparedStatement pstmt = null;try {//1.获取连接conn = JDBCUtils.getConnection();//2.定义sqlString sql = "insert into account values(null, ?, ?)"; // 主键自增长//3.获取pstmt对象pstmt = conn.prepareStatement(sql);//4.给?赋值pstmt.setString(1, "王五");pstmt.setDouble(2, 3001);//5.执行sqlint count = pstmt.executeUpdate();System.out.println(count);} catch (SQLException e) {e.printStackTrace();} finally {//6. 释放资源JDBCUtils.close(pstmt, conn);}}}
09 JDBCTemplate
JDBCTemplate_介绍
* Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发。
* 步骤:
1. 导入jar包
2. 创建JdbcTemplate对象(依赖于数据源DataSource)
* JdbcTemplate template = new JdbcTemplate(ds);3. 调用JdbcTemplate的方法来完成CRUD的操作
* update():执行DML语句(增、删、改语句)。
* queryForMap():查询结果将结果集封装为map集合。
* queryForList():查询结果将结果集封装为list集合。
* query():查询结果,将结果封装为JavaBean对象。
* queryForObject:查询结果,将结果封装为对象。
JDBCTemplate_快速入门
package cn.itcast.jdbctemplate;import cn.itcast.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;/*** JdbcTemplate入门*/
public class JdbcTemplateDemo1 {public static void main(String[] args) {//1.导入jar包//2.创建JDBCTemplate对象JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());//3.调用方法String sql = "update account set balance = 5000 where id = ?";int count = template.update(sql, 3);System.out.println(count);}}
JDBCTemplate_执行DML语句
* Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发。
* 步骤:
1. 导入jar包
2. 创建JdbcTemplate对象(依赖于数据源DataSource)
* JdbcTemplate template = new JdbcTemplate(ds);3. 调用JdbcTemplate的方法来完成CRUD的操作
* update():执行DML语句。增、删、改语句
* queryForMap():查询结果将结果集封装为map集合
* queryForList():查询结果将结果集封装为list集合
* query():查询结果,将结果封装为JavaBean对象
* queryForObject:查询结果,将结果封装为对象4. 练习:
* 需求:
1. 修改1号数据的 salary 为 10000
2. 添加一条记录
3. 删除刚才添加的记录
4. 查询id为1的记录,将其封装为Map集合
5. 查询所有记录,将其封装为List
6. 查询所有记录,将其封装为Emp对象的List集合
7. 查询总记录数* 代码:...
注解 Junit单元测试,可以让方法独立执行
1. 修改1号数据的 salary 为 10000
2. 添加一条记录
3.删除刚才添加的记录
JDBCTemplate_执行DQL语句
* Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
* 步骤:
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);3. 调用JdbcTemplate的方法来完成CRUD的操作
* update():执行DML语句。增、删、改语句
* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
* 注意:这个方法查询的结果集长度只能是1
* queryForList():查询结果将结果集封装为list集合
* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
* query():查询结果,将结果封装为JavaBean对象
* query的参数:RowMapper
* 一般我们使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装。
* new BeanPropertyRowMapper<类型>(类型.class)
* queryForObject:查询结果,将结果封装为对象
* 一般用于聚合函数的查询4. 练习:
* 需求:
1. 修改1号数据的 salary 为 10000
2. 添加一条记录
3. 删除刚才添加的记录
4. 查询id为1的记录,将其封装为Map集合
5. 查询所有记录,将其封装为List
6. 查询所有记录,将其封装为Emp对象的List集合
7. 查询总记录数* 代码:...
4.查询id为1001的记录,将其封装为Map集合
5. 查询所有记录,将其封装为List
6. 查询所有记录,将其封装为Emp对象的List集合
7. 查询总记录数
JUnit 代码
package cn.itcast.jdbctemplate;import cn.itcast.domain.Emp;
import cn.itcast.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;public class JdbcTemplateDemo2 {//Junit单元测试,可以让方法独立执行//1. 获取JDBCTemplate对象private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** Junit单元测试,可以让方法独立执行*/@Testpublic void test() {System.out.println("我被执行了...");int i = 3 / 0;System.out.println("我被执行了...");}/*** 1. 修改1号数据的 salary 为 10000*/@Testpublic void test1() {//2. 定义sqlString sql = "update emp set salary = 10000 where id = 1001";//3. 执行sqlint count = template.update(sql);System.out.println(count);}/*** 2. 添加一条记录*/@Testpublic void test2() {String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";int count = template.update(sql, 1015, "郭靖", 10);System.out.println(count);}/*** 3.删除刚才添加的记录*/@Testpublic void test3() {String sql = "delete from emp where id = ?";int count = template.update(sql, 1015);System.out.println(count);}/*** 4.查询id为1001的记录,将其封装为Map集合* 注意:这个方法查询的结果集长度只能是1*/@Testpublic void test4() {String sql = "select * from emp where id = ? or id = ?";Map<String, Object> map = template.queryForMap(sql, 1001);// Map<String, Object> map = template.queryForMap(sql, 1001, 1002); // 错误System.out.println(map);// {id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}}/*** 5. 查询所有记录,将其封装为List*/@Testpublic void test5() {String sql = "select * from emp";List<Map<String, Object>> list = template.queryForList(sql);for (Map<String, Object> stringObjectMap : list) {System.out.println(stringObjectMap);}}/*** 6. 查询所有记录,将其封装为Emp对象的List集合*/@Testpublic void test6() {String sql = "select * from emp";List<Emp> list = template.query(sql, new RowMapper<Emp>() {@Overridepublic Emp mapRow(ResultSet rs, int i) throws SQLException {Emp emp = new Emp();int id = rs.getInt("id");String ename = rs.getString("ename");int job_id = rs.getInt("job_id");int mgr = rs.getInt("mgr");Date joindate = rs.getDate("joindate");double salary = rs.getDouble("salary");double bonus = rs.getDouble("bonus");int dept_id = rs.getInt("dept_id");emp.setId(id);emp.setEname(ename);emp.setJob_id(job_id);emp.setMgr(mgr);emp.setJoindate(joindate);emp.setSalary(salary);emp.setBonus(bonus);emp.setDept_id(dept_id);return emp;}});for (Emp emp : list) {System.out.println(emp);}}/*** 6. 查询所有记录,将其封装为Emp对象的List集合*/@Testpublic void test6_2() {String sql = "select * from emp";List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));for (Emp emp : list) {System.out.println(emp);}}/*** 7. 查询总记录数*/@Testpublic void test7() {String sql = "select count(id) from emp";Long total = template.queryForObject(sql, Long.class);System.out.println(total);}}
一鼓作气,加油加油加油,宁死不破~~~
JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】相关推荐
- 学习笔记(Spring事务管理)
maven中导入的依赖 学习时时候用的,所以就用的spring提供的orm组件 <dependencies><!--springioc--><dependency> ...
- JDBC学习笔记之JDBC简介
1. 引言 JDBC API是一种Java API,可以访问任何类型的表格数据,特别是存储在关系数据库中的数据. JDBC可以帮助我们编写下列三种编程活动的java应用程序: 1.连接到数据源,如数据 ...
- Spring事务管理 | 数据库连接池流程原理分析
- JDBC 学习笔记(一)—— 基础知识 + 分页技术
2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法: 1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题 2.快捷"查找" ...
- JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD
JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...
- JDBC学习笔记(1)---B站尚硅谷宋红康
JDBC学习笔记(1)-B站尚硅谷宋红康 JDBC学习笔记(2)-B站尚硅谷宋红康 文章目录 软件架构方式介绍 JavaWeb技术概览 第1章:JDBC概述 1.1 数据的持久化 1.2 Java中的 ...
- MySQL学习笔记07【事务、用户管理和权限管理】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
最新文章
- 耗时很长的服务器端事件中让客户端得到中间过程信息的合理解决方案
- 利用tar命令备份Linux系统
- mysql 查看个人版,MySQL系列-权限管理
- table表格边框样式_如何在CAD创建、导入表格?原来CAD的表格功能这么强大
- react-native相机
- java调用geckofx_Scala学习(三)数组相关操作
- JavaScript面向对象的程序设计
- Qt制作贪吃蛇小游戏
- 信息学奥赛 python 教程_python抓取信息学奥赛一本通OJ题库
- 潮流短视频必备——PR赛博朋克效果视频转场快速过渡模板
- 2019 SWERC
- AOC显示器OSD已锁是什么意思?怎么解锁?
- html音频禁止自动播放,HTML iframe允许音频文件的自动播放无法正常使用
- nginx实现ip138查询当前ip功能,配置文件实现接口
- 用哪些特殊的字符方便作为分隔符
- [论文阅读]Contextual Instance Decoupling for Robust Multi-Person Pose Estimation
- win7计算机任务栏颜色怎么,如何修改win7电脑下方任务栏的颜色?
- 【论文笔记】高维基因数据中的特征选择
- 给技术创业的九个忠告
- Why Python is Slow? Looking Under the Hood
热门文章
- 用python的五种方式_Python模块重载的五种方法
- python决策树怎么选择_【机器学习+python(8)】分类决策树的介绍与实现
- 风吹来_风吹年年,雪落片片
- 八十四、堆排序解决TopK问题
- 漫谈度量学习(Distance Metric Learning)那些事儿
- CMU预训练模型最新综述:自然语言处理新范式—预训练、Prompt和预测
- 快手-中科大最新研究:利用对话式推荐解决用户冷启动问题
- CCF-百度松果基金正式“亮出”申报细则,加码产学研前沿合作
- web js基础3 事件
- 【ICCV-2019】ACNet:通过非对称卷积块增强CNN的核骨架 3*3卷积==>1*3卷积+3*1卷积=白给的精度提升