第一章  数据库连接池

1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

2. 好处:
1. 节约资源
2. 用户访问高效

3. 实现:
1. 标准接口:DataSource javax.sql包下的
1. 方法:
* 获取连接:getConnection()
* 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接

2. 一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术
2. Druid:数据库连接池实现技术,由阿里巴巴提供的

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();
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();
2. 定义工具类
1. 定义一个类 JDBCUtils
2. 提供静态代码块加载配置文件,初始化连接池对象
3. 提供方法
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法

* 代码:
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.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;
}

}

第二章  Spring JDBC

* 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. 查询总记录数

* 代码:

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());
/**
* 1. 修改1号数据的 salary 为 10000
*/
@Test
public void test1(){

//2. 定义sql
String sql = "update emp set salary = 10000 where id = 1001";
//3. 执行sql
int count = template.update(sql);
System.out.println(count);
}

/**
* 2. 添加一条记录
*/
@Test
public void test2(){
String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";
int count = template.update(sql, 1015, "郭靖", 10);
System.out.println(count);

}

/**
* 3.删除刚才添加的记录
*/
@Test
public void test3(){
String sql = "delete from emp where id = ?";
int count = template.update(sql, 1015);
System.out.println(count);
}

/**
* 4.查询id为1001的记录,将其封装为Map集合
* 注意:这个方法查询的结果集长度只能是1
*/
@Test
public void test4(){
String sql = "select * from emp where id = ? or id = ?";
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
*/
@Test
public 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集合
*/

@Test
public void test6(){
String sql = "select * from emp";
List<Emp> list = template.query(sql, new RowMapper<Emp>() {

@Override
public 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集合
*/

@Test
public 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. 查询总记录数
*/

@Test
public void test7(){
String sql = "select count(id) from emp";
Long total = template.queryForObject(sql, Long.class);
System.out.println(total);
}

}

转载于:https://www.cnblogs.com/xuweng/p/11245715.html

java day30【数据库连接池 、Spring JDBC : JDBC Template】相关推荐

  1. java阿里数据库连接池_Java学习:数据库连接池技术

    本节内容 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器 当系统初始化好后,容器中会申请一些连接对象,当用 ...

  2. java使用数据库连接池连接MySQL/MariaDB--DBCP2

    如果每次操作数据库都需要重新连接数据库,那么会很浪费资源.因此建议使用数据库的连接池来满足多线程的数据库操作. Java中数据库连接池有多种实现方法,推荐使用DBCP,这是Apache 提供的数据库连 ...

  3. 如何在Tomcat中设置JNDI数据库连接池-Spring教程示例

    在Spring和Tomcat中设置JNDI数据库连接池非常容易. Tomcat服务器文档提供了有关如何在Tomcat 5.6或7中设置连接池的足够信息.在这里,我们将结合使用Tomcat 7和Spri ...

  4. JAVA常用数据库连接池

    1.连接池 池化思想是在计算机软件研发中常用的一种思想:该思想为建立一组序列,用于存放各种数据结构,从而对各种数据结构进行管理.池化的优点为:让数据结构有序化和处于控制,从而方便管理.池化本质是一种数 ...

  5. java面试 数据库连接池_阿里面试官:数据库连接池有必要吗?你对它的底层实现了解过没?...

    # 前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避 ...

  6. java tomcat数据库连接池_tomcat配置数据库连接池2

    数据库连接是比较耗时的操作,如果每次访问数据库都开闭一次连接的话,在大批量访问时,必然会导致性能问题,于是这里成为了你的性能瓶颈.为了解决这个问题, 为了简化通过连接池获取数据库连接的过程,JDBC2 ...

  7. java tomcat数据库连接池,tomcat 数据库连接池拿不到连接

    我们是 springboot1.x 的应用 用的自带的数据库连接池就是 tomcat,数据库用的是 oracle,现在发生了一些奇怪的事就是初始化数据库连接池的时候可能会卡在创建连接那一步,但是重启可 ...

  8. Java建立数据库连接池

    对于一个简单的数据库引用,用于对数据库的访问不是很频繁.这时就可以简单的在需要访问数据库是,就创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库引用,情况就 ...

  9. Java中数据库连接池原理机制的详细讲解

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(ResourcePool).该模式正 ...

  10. java 常用的数据库连接池,java通过数据库连接池的方式

    数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 ...

最新文章

  1. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题
  2. win10装linux grub,在Win10下安装Ubuntu14.04安装并修复grub2
  3. Android基础之一
  4. 十三、java_GUI
  5. 海量数据实时在线分析QuickBI
  6. linux下如何查看主机是否安装了ftp server
  7. 微软块级备份引擎服务器,文件级与块级备份区别
  8. python利用matplotlib做饼图_python利用matplotlib库绘制饼图的方法示例
  9. 华为Mate 40系列或采用双处理器方案:国行版仍为麒麟芯
  10. 2011年至2019年制造的 AMD 处理器均易受两种新型攻击
  11. MySQL 5.7.18忘记密码和密码过期解决
  12. python读取idx_使用groupby和transform获取idxmaxp
  13. 需求调研报告模板_精准摸底,把握需求:名师工作室开展培训活动调研报告
  14. 无线AP密码破解方法
  15. Tungsten Fabric知识库丨更多组件内部探秘
  16. 解决Windows系统无法复制粘贴问题
  17. 移动通信核心网技术总结(二)电信网络发展趋势与CS网络架构
  18. 作业帮联手北师大、中国教育电视台以科技推进普惠教育发展
  19. 2014-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧
  20. 971: 统计利用先序遍历创建的二叉树的深度

热门文章

  1. 过程语句 oracle,Oracle 过程控制语句整理
  2. Android NDK开发之 NEON 矩阵转置,矩阵乘法实现
  3. Linux入门自学笔记
  4. php 生产一维码,透过 PHP 生成 一维码
  5. 【知识索引】【汇编语言】
  6. java 构造器(constructor)是否可被重写(override)?
  7. Spark sample入门到精通
  8. 从0开始html前端页面开发_CSS设置图像边框阴影
  9. Java根据路径获取文件内容的三种场景分析
  10. 【转】LoadRunner中事务和集合点的放置顺序问题