Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)
1、Spring整合JDBC
(1)导包(共12个):
c3p0连接池、JDBC驱动(4个)
Spring-jdbc、Spring-tx事务(2个)

(2)JDBC模板对象(JDBCTemplate)
public class JDBCDemo {
public void test() throws PropertyVetoException {
ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql:///stu_mangement");
comboPooledDataSource.setPassword("root");
comboPooledDataSource.setUser("root");
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(comboPooledDataSource);
String sql="INSERT INTO student VALUES('201816','1998-11-11','tx101','19837372534','男','jiayou','892')";
jdbcTemplate.update(sql);
}
public static void main(String[] args) throws PropertyVetoException {
JDBCDemo jdbcDemo=new JDBCDemo();
jdbcDemo.test();
}
}
需要先创建连接池,获取comboPooledDataSource对象,将该对象给模板对象,最后,利用模板对象执行sql语句。但是,这种方法是手动创建对象的,没有体现Spring的IoC特性。
2、连接池、JDBC模板、Dao配置到Spring容器
(1)创建数据库(学生信息):

(2)创建一个接口,指定实现类的方法:
import java.util.List;
public interface StudentDao {
void add(Student student);
void delete(Integer studentno);
void update(Student student);
Student getStudentByNum(Integer studentno);
int getTotalCount();
List<Student> getAll();
}
(3)创建实现类,实现接口中的方法:
添加学生信息:
public void add(Student student) {
String sql="INSERT INTO student VALUES(?,?,?,?,?,?,?)";
jdbcTemplate.update(sql,
student.getStudentno(),
student.getBirthday(),
student.getClassno(),
student.getPhone(),
student.getSex(),
student.getSname(),
student.getPoint());
}
根据学生的学号删除学生信息:
public void delete(Integer studentno){
String sql="delete from student where studentno=?";
jdbcTemplate.update(sql,studentno);
}
修改学生信息:
public void update(Student student) {
String sql="update student set phone=? where studentno=?";
jdbcTemplate.update(sql,student.getPhone(),student.getStudentno());
}
public static void main(String [] args){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象
StudentDao studentDao =(StudentDao)applicationContext.getBean("studentDao");
Student student=new Student();
student.setStudentno(201811);
student.setPhone("1234567890");
studentDao.update(student);
}
根据学号查询学生信息:
public Student getStudentByNum(Integer studentno) {
String sql="select * from student where studentno=?";
return jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student=new Student();
student.setStudentno(resultSet.getInt("studentno"));
student.setSname(resultSet.getString("sname"));
return student;
}
},
studentno);//这个studentno是参数传过来的
}
利用匿名内部类创建一个RowMapper,并实现该内部类里面的方法,获取一个student的对象,通过传递参数(studentno)返回符合条件的Student。
Student{sname='jiayou', studentno=201816, birthday='null', classno='null', phone='null', sex='null', point=null}
获取学生的数量:
public int getTotalCount() {
String sql="select count(*) from student";
Integer count =jdbcTemplate.queryForObject(sql,Integer.class);
return count;
}
传递参数的时候需要指明返回的结果的数据类型,用Integer.class。
获取全部学生信息:
public List<Student> getAll() {
String sql="select * from student";
List<Student> list=jdbcTemplate.query(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student=new Student();
student.setStudentno(resultSet.getInt("studentno"));
student.setSname(resultSet.getString("sname"));
student.setPhone(resultSet.getString("phone"));
student.setSex(resultSet.getString("sex"));
student.setPoint(resultSet.getFloat("point"));
student.setClassno(resultSet.getString("classno"));
student.setBirthday(resultSet.getString("birthday"));
return student;
}
});
return list;
}
与通过学号获取学生的信息不同,获取全部学生的信息的时候不需要传递参数,因此,query方法中参数的数量为2。
(4)配置文件:只有配置好了配置文件后才能获取到对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--将连接池放入Spring容器-->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///stu_mangement"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--将JDBCTemplate放入Spring容器-->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--将StudentDao放入Spring容器中-->
<bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
</beans>
通过配置文件,将以前手动创建对象的方式变成了通过配置文件获取对象。在这里用到了属性的注入,要注意基本数据类型和引用数据类型属性的区别。
(5)测试类:
public class Test {
public static void main(String [] args){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象
StudentDao studentDao =(StudentDao)applicationContext.getBean("studentDao");
List<Student> list =studentDao.getAll();
System.out.println(list);
}
}
(6)StudentDaoImp类:
public class StudentDaoImp implements StudentDao{
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void add(Student student) {
String sql="INSERT INTO student VALUES(?,?,?,?,?,?,?)";
jdbcTemplate.update(sql,
student.getStudentno(),
student.getBirthday(),
student.getClassno(),
student.getPhone(),
student.getSex(),
student.getSname(),
student.getPoint());
}
@Override
public void delete(Integer studentno){
String sql="delete from student where studentno=?";
jdbcTemplate.update(sql,studentno);
}
@Override
public void update(Student student) {
String sql="update student set phone=? where studentno=?";
jdbcTemplate.update(sql,student.getPhone(),student.getStudentno());
}
@Override
public Student getStudentByNum(Integer studentno) {
String sql="select * from student where studentno=?";
return jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student=new Student();
student.setStudentno(resultSet.getInt("studentno"));
student.setSname(resultSet.getString("sname"));
return student;
}
},
studentno);//这个studentno是参数传过来的
}
@Override
public int getTotalCount() {
String sql="select count(*) from student";
Integer count =jdbcTemplate.queryForObject(sql,Integer.class);
return count;
}
@Override
public List<Student> getAll() {
String sql="select * from student";
List<Student> list=jdbcTemplate.query(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student=new Student();
student.setStudentno(resultSet.getInt("studentno"));
student.setSname(resultSet.getString("sname"));
student.setPhone(resultSet.getString("phone"));
student.setSex(resultSet.getString("sex"));
student.setPoint(resultSet.getFloat("point"));
student.setClassno(resultSet.getString("classno"));
student.setBirthday(resultSet.getString("birthday"));
return student;
}
});
return list;
}
}
另外一种方法:不需要手动书写JDBC模板对象,直接从父类中获取即可:
public class StudentDaoImp extends JdbcDaoSupport implements StudentDao{
@Override
public void add(Student student) {
String sql="INSERT INTO student VALUES(?,?,?,?,?,?,?)";
super.getJdbcTemplate().update(sql,
student.getStudentno(),
student.getBirthday(),
student.getClassno(),
student.getPhone(),
student.getSex(),
student.getSname(),
student.getPoint());
}
@Override
public void delete(Integer studentno){
String sql="delete from student where studentno=?";
super.getJdbcTemplate().update(sql,studentno);
}
@Override
public void update(Student student) {
String sql="update student set phone=? where studentno=?";
super.getJdbcTemplate().update(sql,student.getPhone(),student.getStudentno());
}
@Override
public Student getStudentByNum(Integer studentno) {
String sql="select * from student where studentno=?";
return super.getJdbcTemplate().queryForObject(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student=new Student();
student.setStudentno(resultSet.getInt("studentno"));
student.setSname(resultSet.getString("sname"));
return student;
}
},
studentno);//这个studentno是参数传过来的
}
@Override
public int getTotalCount() {
String sql="select count(*) from student";
Integer count =super.getJdbcTemplate().queryForObject(sql,Integer.class);
return count;
}
@Override
public List<Student> getAll() {
String sql="select * from student";
List<Student> list=super.getJdbcTemplate().query(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student=new Student();
student.setStudentno(resultSet.getInt("studentno"));
student.setSname(resultSet.getString("sname"));
student.setPhone(resultSet.getString("phone"));
student.setSex(resultSet.getString("sex"));
student.setPoint(resultSet.getFloat("point"));
student.setClassno(resultSet.getString("classno"));
student.setBirthday(resultSet.getString("birthday"));
return student;
}
});
return list;
}
}
此时的配置文件少了一个继承关系:
<!--将连接池放入Spring容器-->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///stu_mangement"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--将StudentDao放入Spring容器中-->
<bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
<property name="dataSource" ref="dataSource"></property>
</bean>
因为JDBCDaoSupport是根据连接池创建的JDBC模板,不需要再手动获取了。
3、配置文件有关JDBC的优化
(1)创建db.properties配置文件:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///stu_mangement
jdbc.user=root
jdbc.password=root
(2)在spring的配置文件中读取db.properties配置文件的数据:
<!--指定要读取的配置文件的位置-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--将连接池放入Spring容器-->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--将StudentDao放入Spring容器中-->
<bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
<property name="dataSource" ref="dataSource"></property>
</bean>
这种方式虽然创建了两个配置文件看上去比较繁琐,但是,这种方式是有利于后期的维护的:方便对JDBC有关参数的修改。
Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)的更多相关文章
- HttpClient实战三:Spring整合HttpClient连接池
简介 在微服务架构或者REST API项目中,使用Spring管理Bean是很常见的,在项目中HttpClient使用的一种最常见方式就是:使用Spring容器XML配置方式代替Java编码方式进行H ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- spring boot(10)-tomcat jdbc连接池
默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多.spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...
- Spring boot (12) tomcat jdbc连接池
默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...
- 数据层优化-jdbc连接池简述、druid简介
终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...
- 【转】SSH中 整合spring和proxool 连接池
[摘要:比来做的一个项目中应用到了毗邻池技巧,大概我们人人比拟认识的开源毗邻池有dbcp,c3p0,proxool.对那三种毗邻池来讲,从机能战失足率来讲,proxool轻微比前两种好些.本日我首要简 ...
- 四大流行的jdbc连接池之C3P0篇
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...
- Jmeter(九)JDBC连接池
JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问.因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL ...
- 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)
-----------------------JDBC---------- 0. db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...
随机推荐
- Linux服务器上创建新用户
一.在/home目录下新建userName目录 sudo useradd -m -s /bin/bash userName 二.设置密码 sudo passwd userName
- 2020,6招玩转 Appium 自动化测试
Appium是个什么鬼 Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的.可用于IOS和Android以及firefox的操作系统.原生的应用是指用an ...
- LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?
今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历. 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的 ...
- QT_QGIS_基本使用
QT_QGIS_基本使用 1.新建画布 2.添加矢量图层 1.打开矢量图层 2.新建矢量图层 1.添加几何要素--点 2.添加几何要素--线 3.添加栅格图层 1.打开栅格图层 小 ...
- Tornado + vue.js 前后端分离运行脚本
shell脚本部分: #!/bin/bash 主脚本 (./cem-demo_publish_front) (./cem-demo_publish_backend) #!/bin/bash 后端脚本 ...
- 【HttpRunner v3.x】笔记—8.用例引用、变量传递
看到这里,对于httprunner已经有了一个大概的了解,现在想对于一些比较重要或者常用的功能,进行一些实践操作. 毕竟那谁说过,"纸上得来终觉浅,绝知此事要躬行." 上一篇提到了 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 图像通道、RGB与色彩体系
通道(Channels) 图像的通道指的是什么?是不是灰度图的通道数为1,彩色图的通道为3 ? 图像通道,在RGB色彩模式下就是指那单独的红色.绿色.蓝色部分.也就是说,一幅完整的图像,是由红色绿色蓝 ...
- 微信小程序(1)
微信小程序 什么是微信小程序? 微信小程序优点 跨平台 打开速度比h5快 不用下载 开发目录结构介绍 1. 小程序Pages目录说明 2. 工具文件夹 3. 全局文件 用法1 全局APP.json文件 ...
- JsonAnalyzer2 1.01版
本版的改进主要在字符串的处理,前版不允许出现[]{},:等,现在都可以了,做出的修改主要在Lexer类,另外Token类增加1了下标,TreeBuilder类的不合语法处也做出一定修改. 测试用例:h ...