准备阶段:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
​<groupId>com.henu</groupId><artifactId>springJDBCplus</artifactId><version>1.0-SNAPSHOT</version>
​<dependencies><!-- spring4.3.20 --><!-- spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.20.RELEASE</version></dependency><!-- spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.20.RELEASE</version></dependency><!-- spring-beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.3.20.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-expression --><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.20.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.3.20.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.20.RELEASE</version></dependency><!--使用AspectJ方式注解需要相应的包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.1</version></dependency>
​<!--使用AspectJ方式注解需要相应的包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency>
​<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
​<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency>
​<!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>
​<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.3.RELEASE</version></dependency>
​<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.3.RELEASE</version></dependency>
​<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version><scope>provided</scope></dependency>
​<!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
​</dependencies>
​
</project>

数据库:

一、实体类User

package com.henu.bean;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
/*** @author George* @description**/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {private int id;private String name;private String pwd;
}

二、dao层

package com.henu.dao;
​
import com.henu.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
​
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
​
/*** @author George* @description**/
@Repository
public class UserDaoImpl implements UserDao {//注入jdbcTemplate@Autowiredprivate JdbcTemplate jdbcTemplate;
​public int insertUser(User user) {String sql = "insert into user values(0,?,?)";return jdbcTemplate.update(sql,user.getName(),user.getPwd());}
​public int deleteUser(int id) {String sql = "delete from user where id = ?";return jdbcTemplate.update(sql,id);}
​public int updateUser(User user) {String sql = "update user set name=?,pwd=? where id=?";return jdbcTemplate.update(sql,user.getName(),user.getPwd(),user.getId());}
​public User queryUserById(int id) {String sql = "select * from user where id = ?";//使用内部类class UserMapper implements RowMapper<User>{
​public User mapRow(ResultSet resultSet, int i) throws SQLException {User user = new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setPwd(resultSet.getString("pwd"));return user;}}//这里需要注意的是使用的是queryForObject()方法。如果使用query会报出ClassCastExceptionreturn (User) jdbcTemplate.queryForObject(sql,new UserMapper(),id);}
​public List<User> queryAll() {String sql = "select * from user";//使用匿名内部类return jdbcTemplate.query(sql, new RowMapper<User>() {public User mapRow(ResultSet resultSet, int i) throws SQLException {User user = new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setPwd(resultSet.getString("pwd"));return user;}});}
​public JdbcTemplate getJdbcTemplate() {return jdbcTemplate;}
​public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}
}
​

三、service层

package com.henu.service;
​
import com.henu.bean.User;
import com.henu.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
​
import java.util.List;
​
/*** @author George* @description**/
@Service
public class UserServiceImpl implements UserService {//注入userDao@Autowiredprivate UserDao userDao;@Transactionalpublic int insertUser(User user) {return userDao.insertUser(user);}@Transactionalpublic int deleteUser(int id) {return userDao.deleteUser(id);}@Transactionalpublic int updateUser(User user) {return userDao.updateUser(user);}
​public User queryUserById(int id) {return userDao.queryUserById(id);}
​public List<User> queryAll() {return userDao.queryAll();}
​public UserDao getUserDao() {return userDao;}
​public void setUserDao(UserDao userDao) {this.userDao = userDao;}
}
​

四、resources

db.properties

#db config
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ooxx
jdbc.username=root
jdbc.password=123456
initialSize=5
minIdle=2
maxActive=10
maxWait=10000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
testWhileIdle=true
testOnBorrow=true
testOnReturn=false
poolPreparedStatements=true
maxPoolPreparedStatementPerConnectionSize=20
defaultAutoCommit=true
validationQuery=select 1

applicationContext_db.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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"><!--导入属性文件--><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><!--配置数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!-- ******配置数据库连接池相关信息******* --><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${initialSize}"/><property name="minIdle" value="${minIdle}"/><property name="maxActive" value="${maxActive}"/><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="${maxWait}"/><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/><property name="testWhileIdle" value="${testWhileIdle}"/><!-- 这里建议配置为TRUE,防止取到的连接不可用 --><property name="testOnBorrow" value="${testOnBorrow}"/><property name="testOnReturn" value="${testOnReturn}"/><!-- 打开PSCache,并且指定每个连接上PSCache的大小 --><property name="poolPreparedStatements" value="${poolPreparedStatements}"/><property name="maxPoolPreparedStatementPerConnectionSize"value="${maxPoolPreparedStatementPerConnectionSize}"/><!-- 这里配置提交方式,默认就是TRUE,可以不用配置 --><property name="defaultAutoCommit" value="${defaultAutoCommit}"/><!-- 验证连接有效与否的SQL,不同的数据配置不同 --><property name="validationQuery" value="${validationQuery}"/></bean><!--JDBCTemplate--><bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><!--使用注解进行注入--><context:component-scan base-package="com.henu"></context:component-scan><!--************************************************************--><!--配置事务管理器--><bean name="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--启动事务注解--><tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven></beans>

五、测试类

package com.henu;
​
import com.henu.bean.User;
import com.henu.service.UserService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
import java.util.List;
​
/*** @author George* @description* 测试类中的方法,无返回值,无参数**/
public class JdbcTest {
​private ClassPathXmlApplicationContext context = null;private UserService userService;@Beforepublic void init(){context = new ClassPathXmlApplicationContext("applicationContext_db.xml");userService = (UserService) context.getBean(UserService.class);}
​@Testpublic void insert(){User user = new User(0,"乔治大哥","123456");userService.insertUser(user);}
​@Testpublic void deleteUser(){userService.deleteUser(1);}
​@Testpublic void updateUser(){User user = new User(1,"康康","56345");userService.updateUser(user);System.out.println("success");}
​@Testpublic void queryUserById(){System.out.println(userService.queryUserById(2));}
​@Testpublic void queryAll(){List<User> users = userService.queryAll();for (User user : users) {System.out.println(user);}}
​@Afterpublic void destory(){context.close();}
​
}

【补充】

@Transactional的写法应为:

@Transactional(propagation= Propagation.REQUIRED,isolation= Isolation.READ_COMMITTED,timeout = -1,readOnly = false,rollbackFor = Exception.class)

不过在他的默认属性值中已经定义,以下是源码

所以我们可以在需要事务管理的方法或类上直接写直接写@Transactional

当写在类上时,本类中所有方法,均被事务管理。

<!--启动事务注解-->
<tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>

spring——使用注解声明式事务整合jdbc——GRUD相关推荐

  1. spring——使用xml声明式事务整合jdbc——GRUD

    准备阶段: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  2. spring注解 声明式事务

    在spring注解中,使用声明式事务,需要用到两个核心的注解:@Transactional注解和@EnableTransactionManagement注解.将@Transactional注解加在方法 ...

  3. spring注解-声明式事务

    实现步骤: 1.导入依赖包:数据源 c3p0 ,    数据库驱动:mysql-connector-java ,    spring事务包:这时导入spring-jdbc,该包依赖spring-tx, ...

  4. 事务(注解声明式事务管理)

    1.什么事务 (1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败 2.事务四个特性(ACID) (1)原子性 (2)一致性 (3)隔离性 (4)持久性 1.原子 ...

  5. Spring AOP实现声明式事务代码分析

    众所周知,Spring的声明式事务是利用AOP手段实现的,所谓"深入一点,你会更快乐",本文试图给出相关代码分析. AOP联盟为增强定义了org.aopalliance.aop.A ...

  6. Spring源码——声明式事务流程

    前言 最近回顾了一下Spring源码,准备用思维导图的方式简单的将整个源码内容的流程展示出来,思维导图.图片等文件更新在https://github.com/MrSorrow/spring-frame ...

  7. spring+mybatis之声明式事务管理初识(小实例)

    前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...

  8. Spring如何用“声明式事务”保护亿万数据安全?【万字解决并发冲突】

    Hello,你好呀,我是灰小猿,一个超会写bug的程序猿

  9. spring声明式事务

    11.声明式事务 11.1 事务回顾 把一组业务当做一个业务来坐,要么都成功,要么都失败! 事物在项目开发中的重要性不言而喻,关系到数据的一致性文件 确保完整性和一致性 事务的ACID原则 原子性(A ...

最新文章

  1. FTL页面常用到的一些方法combobox、combotree、datagrid
  2. 图像处理之让手心长出眼睛,其实嘴也可以
  3. 【uni-app】动态计算图片高度且保持宽高比
  4. JQueryEasyUI学习笔记(十一)datagrid 右键菜单,冻结列
  5. vSphere 5.5:使用 RVC VSAN 监控工具
  6. stats | 概率分布与随机数生成(一)——离散型分布
  7. TIOBE 5 月编程语言排行榜:Python、C++ 竞争白热化,Objective-C 已沦为小众语言
  8. 【转】查看linux服务器的系统信息
  9. Codeforces Gym 100187E E. Two Labyrinths bfs
  10. cocos2dx 制作单机麻将(四)
  11. nginx config的多个config配置
  12. 自己写的配筋的Android应用——RCHelper,依据SL191-2008
  13. 某品牌电批单机知识总结
  14. 提高优秀人才忠诚度的六条法则
  15. cwber获取html,qq飞车手游CW、CWW、WCW怎么触发方法
  16. 数据挖掘机器学习[七]---2021研究生数学建模B题空气质量预报二次建模求解过程:基于Stacking机器学习混合模型的空气质量预测{含码源+pdf文章}
  17. 【python】画折线图
  18. MYSQL学习笔记06:列属性[NULL,default,comment],主键,自增长,唯一键,数据库设计规范[范式(1NF,2NF,3NF),逆规范化],表关系[1V1,1VN,NVN]
  19. 最新ChatGPT商业运营版网站源码+支持AI绘画+支持用户会员套餐+邀请分佣功能+支持后台一键更新+网站后台管理+永久更新!
  20. SQL Compare数据库比较工具 完全破解+使用教程

热门文章

  1. 牛客 - 合约数(树上启发式合并)
  2. HDU - 4417 Super Mario(主席树/线段树+离线)
  3. python 逻辑回归权重_Python 逻辑回归
  4. 关闭 进程_关闭一个进程 锐龙CPU骤然降温22.5!
  5. 25.智能指针.rs
  6. nginx系列之四:web服务器
  7. A星算法(VC版源码)
  8. _variant_t和_bstr_t有什么区别
  9. Inno Setup 5制作安装程序
  10. Android 模拟器下载、编译及调试