1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > JDBC学习笔记03【JDBC事务管理 数据库连接池 JDBCTemplate】

JDBC学习笔记03【JDBC事务管理 数据库连接池 JDBCTemplate】

时间:2020-02-23 18:02:37

相关推荐

JDBC学习笔记03【JDBC事务管理 数据库连接池 JDBCTemplate】

黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:/Kxy7LmRmJDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】【day01】JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】【day01】JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】【day01】、【day02】

目录

07JDBC事务管理

JDBC管理事务_概述

JDBC管理事务_实现

08数据库连接池

今日内容

数据库连接池_概述

数据库连接池_实现介绍

数据库连接池_c3p0_基本使用

新建项目 day05_dataSource_jdbcTemplate

复制c3p0配置文件(c3p0-config.xml)到工程src目录下

c3p0的演示

数据库连接池_c3p0_配置演示

连接池——最大的连接数量

连接池——超时时间

连接池——使用非默认配置

数据库连接池_druid_基本使用

数据库连接池_druid_工具类

数据库连接池_druid_工具类测试

JDBCUtils.java

DruidDemo2.java

09JDBCTemplate

JDBCTemplate_介绍

JDBCTemplate_快速入门

JDBCTemplate_执行DML语句

注解Junit单元测试,可以让方法独立执行

1. 修改1号数据的 salary 为 10000

2. 添加一条记录

3.删除刚才添加的记录

JDBCTemplate_执行DQL语句

4.查询id为1001的记录,将其封装为Map集合

5. 查询所有记录,将其封装为List

6. 查询所有记录,将其封装为Emp对象的List集合

7. 查询总记录数

JUnit 代码

07JDBC事务管理

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();//提交事务mit();} 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);}}}

09JDBCTemplate

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);}}

一鼓作气,加油加油加油,宁死不破~~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。