springBoot配置数据库连接以及事务管理
springBoot配置数据库(整合mybatis)
- 依赖引入:
<?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>sfl.test.com</groupId>
<artifactId>dataBasePro</artifactId>
<version>1.0-SNAPSHOT</version>
<!--父依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<!--编码格式及jdk版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
</dependencies>
<!--打包方式 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.3.RELEASE</version>
<configuration>
<mainClass>com.sfl.Application</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.建立对应的项目结构:
3.配置文件相关:
resource目录下新建配置文件:application.yml,application-dev.yml(便于项目启动选用对应的配置文件)
application.yml:
spring:
profiles:
active: dev
application-dev.yml
server:
port: 8080
spring:
datasource:
username: sfl123
password: 123456
url: jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml
type-aliases-package: com.sfl.entity
#showSql
logging:
level:
com:
sfl:
mapper: debug
4.编写测试代码
controller:
@RestController
@RequestMapping("/testBoot")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUser/{id}")
public String getUser(@PathVariable int id){
return userService.getUser(id).toString();
}
@RequestMapping("/insUser")
public int insUser(){
User user = new User();
user.setPassWord("1234577");
user.setUserName("qqq");
user.setRealName("qqq");
return userService.insUser(user);
}
@RequestMapping("/updUser")
public int uodUser(){
User user = new User();
user.setPassWord("678");
user.setUserName("张飞1");
user.setRealName("zhangFei1");
user.setId(1);
return userService.updUser(user);
}
@RequestMapping("/delUser")
public int del(){
int id = 6;
return userService.del(id);
}
service:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUser(int id){
return userMapper.sel(id);
};
public int insUser(User user){
int i = userMapper.ins(user);
if(i==2){
throw new RuntimeException("事务出错");
}
return i;
}
public int updUser(User user){
int i = userMapper.upd(user);
if(i==2){
throw new RuntimeException("事务出错");
}
return i;
}
public int del(int id){
int i = userMapper.del(id);
if(i==2){
throw new RuntimeException("事务出错");
}
return i;
}
mapper:
@Repository
public interface UserMapper {
User sel(int id);
int ins(User user);
int upd(User user);
int del(int id);
}
resource目录下新建mapper配置文件,与mapper类命名一致:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfl.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.sfl.entity.User">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="userName" jdbcType="VARCHAR" property="userName" />
<result column="passWord" jdbcType="VARCHAR" property="passWord" />
<result column="realName" jdbcType="VARCHAR" property="realName" />
</resultMap>
<select id="sel" resultType="com.sfl.entity.User">
select * from user where id = #{id}
</select>
<insert id="ins" parameterType="com.sfl.entity.User" useGeneratedKeys="true" keyProperty="id">
insert into user(userName,passWord,realName) values(#{userName},#{passWord},#{realName})
</insert>
<update id="upd" parameterType="com.sfl.entity.User" useGeneratedKeys="true" keyProperty="id">
update user set userName = #{userName},passWord=#{passWord},realName=#{realName} where id = #{id}
</update>
<delete id="del" parameterType="com.sfl.entity.User" >
delete from user where id = #{id}
</delete>
</mapper>
启动类配置(加入@MapperScan注解,扫描mapper文件):
@MapperScan("com.sfl.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
加入事务管理
事务可以通过@Transactional注解来实现,一般加在service层。在这里我们进行统一的事务管理,可以用xml方式,这里采用配置类的方式:
@Configuration
public class TxAnoConfig {
@Autowired
private DataSource dataSource;
/**
* 获取事务管理器-修改信息1111
* @return
*/
@Bean("txManager")
public DataSourceTransactionManager txManger(){
return new DataSourceTransactionManager(dataSource);
}
/**
* 事务拦截器
*/
@Bean("txAdvice")
public TransactionInterceptor txAdvice(DataSourceTransactionManager txManager){
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
/* 只读事务,不做更新操作*/
RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
readOnlyTx.setReadOnly(true);
/*不支持事务,当前存在事务时,将挂起事务,运行方法*/
readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
/*写事务,需要更新操作 */
RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED,
Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
requiredTx.setTimeout(5);
Map<String, TransactionAttribute> txMap = new HashMap<>();
txMap.put("ins*",requiredTx);
txMap.put("upd*",requiredTx);
txMap.put("get*",readOnlyTx);
txMap.put("del*",requiredTx);
txMap.put("add*",requiredTx);
txMap.put("query*",readOnlyTx);
source.setNameMap(txMap);
return new TransactionInterceptor(txManager,source);
}
/*切面拦截规则 参数会自动从容器中注入*/
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor(TransactionInterceptor txAdvice){
DefaultPointcutAdvisor pointcutAdvisor = new DefaultPointcutAdvisor();
pointcutAdvisor.setAdvice(txAdvice);
AspectJExpressionPointcut pointCut = new AspectJExpressionPointcut();
pointCut.setExpression("execution(* com.sfl.service.*.*(..))");
pointcutAdvisor.setPointcut(pointCut);
return pointcutAdvisor;
}
事务配置分三步:
1.获取事务管理器DataSourceTransactionManager
2.生成事务拦截器(切面):TransactionInterceptor,对查询和操作数据库表实行不同的管理,查询是只读事务。
3.切面拦截规则,针对特定包下