Spring学习5-Spring整合JDBC及其事务处理(注解方式)
一、整合的步骤
1、步骤一:首先要获得DataSource连接池(推荐使用B方式):
要对数据库执行任何的JDBC操作,需要有一个Connection.在Spring中,Connection对象是通过DataSource获得的。
有几种方法可以得到DataSource,
其中一种方法是使用Spring提供的轻量级
org.springframework.jdbc.datasource.DriverManagerDataSource,第二种方法是使用
org.apache.commons.dbcp.BasicDataSource类。
A:使用DriverMangerDataSource获取DataSource,这种方法是轻量级的,方便测试
public class
DataSoureProvider {
public static DriverManagerDataSource dataSource = new
DriverManagerDataSource();
public static DriverManagerDataSource getInstance() {
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/book");
dataSource.setUsername("y****");
dataSource.setPassword("h*******");
return dataSource;
}
@Test
public void test() {
DataSoureProvider.getInstance();
try {
dataSource.getConnection();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
B:通过使用BasicDataSouce创建一个连接池获取DataSource。应为BasicDataSource所有属性都是通过setter方法暴露在外面的,我们可以像配置其他Srping
Bean那样配置它我将数据库连接信息配置在properties文件中,利用spring的org.springframeword.beans.factory.config.PropertyPlaceholderConfigurer类进行读取装载。
注意:
使用org.apache.commons.dbcp.BasicDataSource需要引入额外的jar包,分别是,commons-dbcp-1.4.jar,commons-pool-1.2.jar
(官网下载页面:http://commons.apache.org/)
书写配置文件applicationContext.xml:
<?xml
version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dbproperty"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property
name="location">
<!-- 此位置是相对于:部署后的项目的根路径
<value>/WEB-INF/connect.properties</value>
-->
<!-- 此位置是相对于:部署后的项目的类路径
-->
<value>connect.properties</value>
</property>
</bean>
<-- 配置BasicDataSource参数,其中<value>中的参数是在connect.propertices配置文件
中拿到的,其实value值也可以直接写上的-->
<bean id="myDataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property
name="driverClassName">
<value>${db.driver}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>${db.password}</value>
</property>
</bean>
</beans>
--------------------------------------------------------------------------------------
2、步骤二:使用JdbcTemplate类操作数据库:
Spring把JDBC中重复的操作建立成了一个模板类:org.springframework.jdbc.core.JdbcTemplate。
A:要使用JdbcTemplate,需要为每一个DAO配置一个JdbcTemplate实例:
public class StudentDaoImp implements StudentDao
{
private JdbcTemplate jdbcTemplate;
@Override
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
B:如上,StudentDaoImp内配置了一个JdbcTemplate对象和它对应的setter方法。这样就可以在Spring配置文件中对其进行赋值。
<?xml version="1.0"
encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dbproperty"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>connect.properties</value>
</property>
</bean>
<bean id="myDataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property
name="driverClassName">
<value>${db.driver}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>${db.password}</value>
</property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg
ref="myDataSource"></constructor-arg>
</bean>
<bean id="studentDao"
class="com.sunflower.dao.StudentDaoImp">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
</bean>
</beans>
C:使用JdbcTemplate插入数据:
1)插入单条数据:JdbcTemplate为我们提供了update(String sql,Object...
args)方法,方便我们进行数据的插入.
2)批量添加数据:批量插入数据需要用到org.springframework.jdbc.core.BatchPreparedStatementSetter接口。BatchPreparedStatementSetter接口的两个方法,其中getBatchSize()方法是得到需要插入的记录的个数,setValues(PreparedStatement
ps, int index)方法是实际进行插入的方法。
3)查询单条记录:执行一条数据的查询,需要使用org.springframework.jdbc.core.RowCallbackHandler接口的实现。
4)查询多条记录:这里需要用到org.springframework.jdbc.core.RowMapper接口的实现。RowMapper接口负责把Result中的一条记录映射成一个对象。
public class StudentDaoImp implements
StudentDao {
private JdbcTemplate jdbcTemplate;
@Override
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
//插入单条数据
public void insert(Student student)
{
String sql = "insert into student (cno,name,score)
values(?,?,?)";
//设置传递给通配符的参数
Object[] params = new Object[]{student.getCno(), student.getName(),
student.getScore()};
jdbcTemplate.update(sql, params);
}
//批量插入数据
public int[]
batchInsert(final List<Student>
list)
{
String sql = "insert into student (cno,name,score)
values(?,?,?)";
BatchPreparedStatementSetter setter = new
BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws
SQLException {
Student student = (Student) list.get(index);
ps.setInt(1, student.getCno());
ps.setString(2, student.getName());
ps.setDouble(3, student.getScore());
}
//有多少条记录要处理
@Override
public int getBatchSize() {
return list.size();
}
};
return jdbcTemplate.batchUpdate(sql, setter);
}
//查询单条记录
public Student getStudent(final int id) {
// 装载查询结果
final Student student = new Student();
String sql = "select s.cno,s.name,s.score from student s where sno
= ?";
// 设置查询参数
final Object[] params = new Object[] { new Integer(id) };
// 进行查询
jdbcTemplate.query(sql, params,
new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
student.setCno(rs.getInt("cno"));
student.setName(rs.getString("name"));
student.setScore(rs.getDouble("score"));
}
});
return student;
}
//查询多条记录
public List<Student> getAllStudent()
{
String sql = "select s.cno,s.name,s.score from student s";
return jdbcTemplate.query(sql,
new
RowMapper<Student>() {
@Override
public Student mapRow(ResultSet rs, int index) throws SQLException
{
Student student = new Student();
student.setCno(rs.getInt("cno"));
student.setName(rs.getString("name"));
student.setScore(rs.getDouble("score"));
return student;
}
});
}
}
另附:也可以使用org.springframework.jdbc.core.RowMapper接口查询一条记录,只要附加查询参数即可:
public Student getStudent(final int id) {
// 装载查询结果
final Student student = new Student();
String sql = "select s.cno,s.name,s.score from student s where sno
= ?";
// 设置查询参数
final Object[] params = new Object[] { new Integer(id) };
List<Student> list = jdbcTemplate.query(sql, params,
new
RowMapper<Student>() {
@Override
public Student mapRow(ResultSet rs, int index)
throws SQLException {
Student student = new Student();
student.setCno(rs.getInt("cno"));
student.setName(rs.getString("name"));
student.setScore(rs.getDouble("score"));
return student;
}
});
return list.get(0);
}
二、采用注解方式配置事务处理
1、在Spring配置文件beans元素中添加子元素:
<!– 声明事务管理器
-->
<bean
id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"
ref="dataSource"/>
</bean>
<!–
采用@Transactional注解方式使用事务 -->
<tx:annotation-driven
transaction-manager="txManager"/>
2、在业务逻辑的试下类中使用注解添加相应的事务
@Service @Transactional
public class StudentServiceBean implements StudentService {
@Transactional(类型=值)
public void add(Student stu) {
dao.insert(stu);
}
}
Spring学习5-Spring整合JDBC及其事务处理(注解方式)的更多相关文章
- 【Spring学习笔记-MVC-4】SpringMVC返回Json数据-方式2
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- Spring学习(十一)-----Spring使用@Required注解依赖检查
Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...
- Spring学习(六)-----Spring使用@Autowired注解自动装配
Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...
- (转)Spring使用AspectJ进行AOP的开发:注解方式
http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...
- Spring整合JDBC及事务处理
1.Spring整合JDBC DAO是数据访问对象(data access object)的简写.接口是实现松耦合的关键,Spring也鼓励使用接口,但不是强制的. 捕获异常时希望能尝试从异常状态中恢 ...
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- Spring学习之Spring与Mybatis的两种整合方式
本机使用IDEA 2020.1.MySql 8.0.19,通过Maven进行构建 环境准备 导入maven依赖包 <dependencies> <dependency> < ...
- spring学习07(整合MyBatis)
10.整合MyBatis 10.1 相关jar包 junit <dependency> <groupId>junit</groupId> <artifactI ...
随机推荐
- 【C#】WM 消息大全
消息名 消息值 说明 WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZE 0x000 ...
- SpringMVC Controller介绍(转)
SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...
- 设计模式——1.概述&UML类图和时序图
声明:本博客设计模式相关文章均整理和修改自网络,原文地址:图说设计模式 学习设计模式的3个层次—— 1.熟悉所有设计模式: 2.能够用代码实现: 3.运用到工作的项目中. 设计模式指导软件开发,学习设 ...
- python数字图像处理(7):图像的形变与缩放
图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全. 1.改变图片尺寸resize 函数格式为: skimage.transform.resize(image, o ...
- [CareerCup] 7.4 Implement Multiply Subtract and Divide 实现乘法减法和除法
7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...
- Linux及安全课程——相关链接总结
附录:学习笔记链接总结 MOOC课程学习笔记与实验: 第一周:计算机是如何工作的 第二周:操作系统是怎么工作的 -- 一个简单的时间片轮转多道程序内核代码及分析 第三周:构造一个简单的Linux系统M ...
- TableCell高度的控制
TableCell高度的控制 计算并指定行高rowHeight 强制指定:self.tableView.rowHeight = 88 或实现UITableViewDelegate.tableView( ...
- IE firefox 兼容性整理
1.尽量用jquery操作. 2.jquery取值时要用准确的方法,attr(), val(), text(), html(). 例如: <span value="a"> ...
- 【WEB前端经验之谈】时间一年半,或沉淀、或从零开始。
距上次写博客还是有点久了,中间有个写的念头,不过由于不知道写什么也就放弃了. 14年4月份第一份前端工作到现在也有一年半之久了,自己对前端的热爱相对于一年前是有过之而无不及.一年半的时间里自己也成长了 ...
- CodeIgniter框架入门教程——第一课 Hello World!
本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...