jar包是实现类,收数据库厂商出。
内容:
- 数据库连接池
- Spring JDBC:JDBC Template
2、数据库连接池—概述
为什么使用数据库连接池?
在使用每个类的时候,我们都需要获取数据库连接对象,它首先要向操作系统底层申请资源,而申请资源是非常耗时的一件事,用完还要资源释放。
使用数据连接池就是为了解决这些弊端。
3、数据库连接池—实现简介
4、C3P0:数据库连接池技术-----基本使用
c3p0-config.xml 配置文件
Demo:
5、数据库连接池的配置演示
c3p0-config.xml 配置文件里面包含了2个config配置:一个是默认的,一个是指定名称的。
测试1:测试最大连接对象和close(了解)
假设设置了for循环,循环11次,每次循环获取对象池中的对象,也就是获取11个。但是,默认容器最多连接对象为10个,所以运行时会报错。
如果当我们在循环11次获取连接对象的时候,等到循环第5次,我们讲第5个连接对象归还给容器,那么容器又多了一个对象。【你看第5个和第6个对象是同一个对象】
测试2:使用指定的config配置文件(了解)
6、druid:数据库连接池技术—基本使用
配置文件
Demo:
7、druid:数据库连接池技术—工具类
Demo:
public class JDBCUitls {
1、定义成员变量 DataSource
private static DataSource ds;
2.加载配置文件 ,随便获取连接池对象(连接池对象只有一个)
static {
try {
//创建Properties集合对象
Properties pro = new Properties();
//以键对值的方式把配置文件的数据存进集合对象中
pro.load(JDBCUitls.class.getClassLoader().getResourceAsStream("druid.properties"));
//获取DataSource连接池对象,并赋值给成员变量
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
* 3、定义 获取数据库连接对象方法
* @return 数据库连接池对象
*/
public static Connection getDataSourse() throws SQLException {
return ds.getConnection();
}
* 4、释放资源
*
* @param sta
* @param con
*/
public static void close(Statement sta, Connection con) {
//调用重载的close方法,可以简化代码
close(null,sta,con);
}
public static void close(ResultSet rs, Statement sta, Connection con) {
if (rs != null) {
try {
rs.close(); //释放资源
} catch (SQLException e) {
e.printStackTrace();
}
}
if (sta != null) {
try {
sta.close(); //释放资源
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close(); //归还连接对象
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5、获取连接池对象方法 【为什么定义这个方法:因为有些框架只需要连接池对象就可以了,比如JDBCTemplate】
*/
public static DataSource getDataSource(){
return ds;
}
}
8、【测试】druid:数据库连接池技术—工具类
* 完成添加操作:给account表添加一条记录
*/
public class DruidDemo02 {
public static void main(String[] args) {
Connection con =null;
PreparedStatement ps =null;
try {
//1、获取数据库连接对象
con = JDBCUitls.getConnection();
//2、定义SQL语句
String sql = "insert into account values(null,?,?)";
//3、获取SQL执行对象
ps = con.prepareStatement(sql);
//4、给占位符赋值
ps.setString(1,"王五");
ps.setDouble(2,2000);
//5、执行SQL语句
int i = ps.executeUpdate();
//6、打印输出影响行数【除了select是0外】
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUitls.close(ps,con);
}
}
}
9_JDBCTemplate_介绍
为什么使用Spring JDBC:JDBC Template?
因为我们在使用JDBC(包括连接池)的时候,很多代码重复,我们主要是关注“增删改查”语句。
JDBC Template就是为了简化代码。
10_JDBCTemplate_快速入门
11_JDBCTemplate_执行DML语句【上】
public class Demo01 {
//1、创建JdbcTemPlate对象
private JdbcTemplate jt = new JdbcTemplate(JDBCUitls.getDataSource()); //这样每次运行方法就不需要获取对象了JdbcTemplate
//Junit单元测试,可以让方法独立运行
/**
* 一、修改1015号数据的salary为10000
*/
@Test
public void test01(){
//2、定义SQL语句
String sql ="update emp set banlance = 10000 where id = 1015";
//3.执行SQL语句
int count = jt.update(sql);
//4、打印输出影响行数
System.out.println(count);
}
/**
* 二、添加1条记录
*/
@Test
public void test02(){
//2、定义SQL语句
String sql ="insert into emp(id,ename,dept_id) vaules (?,?,?)";
//3、执行SQL语句
int count = jt.update(sql, 1016, "刘德华", 10);
//4、打印输出影响行数
System.out.println(count);
}
/**
* 三、删除添加的记录
*/
@Test
public void test03(){
//2、定义SQL语句
String sql = "delete from emp where id = ?";
//3、执行SQL语句
int count = jt.update(sql, 1015);
//4、打印输出影响行数
System.out.println(count);
}
}
12_JDBCTemplate_执行DQL语句【下】
public class Demo01 {
//1、创建JdbcTemPlate对象
private JdbcTemplate jt = new JdbcTemplate(JDBCUitls.getDataSource()); //这样每次运行方法就不需要获取对象了JdbcTemplate
/**
* 四、查询id为1001的记录,将查询结果集封装成Map集合 【注意:queryForMap方法只能查询长度为1的结果集】
*/
@Test
public void test04() {
//2、定义SQL语句
String sql = "select * from emp where identity =?";
//3、执行SQL语句
Map<String, Object> somap = jt.queryForMap(sql, 1001);
//4、打印输出影响行数
System.out.println(somap);
}
/**
* 五、查询所有的记录,封装成List集合 【先把每一条结果集封装成Map集合,再将Mao集合装进List集合中】
*/
@Test
public void test05() {
//2、定义SQL语句
String sql = "select * from emp";
//3、执行SQL语句
List<Map<String, Object>> mapList = jt.queryForList(sql);
//4、打印输出影响行数
for (Map<String, Object> stringObjectMap : mapList) {
System.out.println(stringObjectMap);
}
}
/**
* 六、查询所有的记录,将查询的结果集封装为Emp对象,再把对象装进List集合中
*/
@Test
public void test06() {
//2、定义SQL语句
String sql = "select * from emp";
//3、执行SQL语句
List<emp> queryList = jt.query(sql, new BeanPropertyRowMapper<emp>(emp.class));//参数1:sql语句;参数2:RowMapper接口实现类 【List装着一个个emp对象】
//4、遍历输出
for (emp emp : queryList) {
System.out.println(emp);
}
//emp类需要把成员遍历的类型修改成包装类。因为如果时基本数据类型,表中的属性null时,就会报错,基本数据类型不能等于null
//BeanPropertyRowMapper实现类底层实现了繁琐的Statament对象获取和赋值表中数据操作,返回的对象装进List集合
}
/**
* 七、记录总行数
*/
@Test
public void test07() {
//2、定义SQL语句
String sql = "select count(id) from emp";
//3、执行SQL语句
Long aLong = jt.queryForObject(sql, Long.class); //queryForObject()返回Long类型;参数2:返回类型的.class
//4、打印输出
System.out.println(aLong); //14
}
}
emp类
第六步: 前提:emp表中的数据看成emp表
来源:CSDN
作者:西西里_伸手党
链接:https://blog.csdn.net/weixin_45097731/article/details/104566812