概述
本文介绍 全注解(含事务注解)方式 spring集成mybatis
由于使用了 SqlSessionFactoryBean 类,所以 必须有事务管理,否则增删改会自动提交,不容易控制
本工程是参考 真实项目 构建的
创建maven工程
略
修改pom.xml
添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
创建实体类
public class User {
private String id;
private String username;
private String password;
private Integer age;
private String sex;
private String status;
private Date createTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
实现mapper类
@Repository
public interface IUserMapper {
@Insert("insert into user (id,username,password,age,sex,status,create_time) values (#{id},#{username},#{password},#{age},#{sex},#{status},#{createTime})")
public int save(User user);
@Select("select id,username,password,age,sex,status from user where username like #{username}")
public List<User> queryByName(String username);
@Update(("update user set status=#{status} where id=#{id}"))
public int updateById(User user);
}
实现service接口
public interface IUserService {
public int save(User user) throws Exception;
public List<User> queryByName(String username) throws Exception;
}
service接口实现类
@Service
public class UserSrvImpl implements IUserService{
@Autowired
private IUserMapper mapper;
@Transactional //加上此注解,由事务管理,不需要手写commit、rollback
public int save(User user) throws Exception {
int i= mapper.save(user);
int a=1/0;//故意写错代码
return i;
}
public List<User> queryByName(String username) throws Exception {
return mapper.queryByName(username);
}
}
说明(关键):
注解@Transactional 修饰的方法,表明该方法由spring实现事务管理,不需要手写commit、rollback
配置类
@Configuration
@ComponentScan("top.malaoshi")
@MapperScan("top.malaoshi.mapper")
@EnableTransactionManagement //开启事务注解
public class ApplicationConfig {
@Bean
public DataSource getDataSource(){
PooledDataSource ds=new PooledDataSource();
ds.setDriver("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3308/mybatis");
ds.setUsername("root");
ds.setPassword("");
return ds;
}
@Bean
public SqlSessionFactoryBean getFactory(DataSource ds) {
SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
factory.setDataSource(ds);
return factory;
}
@Bean
public SqlSession getSession(SqlSessionFactory sqlSessionFactory) {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
//配置事务管理器
@Bean
public DataSourceTransactionManager getTransactionManager(DataSource ds){
DataSourceTransactionManager t=new DataSourceTransactionManager(ds);
return t;
}
}
测试查询
public class Main {
public static void main(String[] args) throws Exception {
ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserService srv=(IUserService)ac.getBean("userSrvImpl");
List<User> list=srv.queryByName("李%");
for(User u:list){
System.out.println(u.getUsername()+"--"+u.getStatus());
}
}
}
测试保存
public class Main {
public static void main(String[] args) throws Exception {
ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserService srv=(IUserService)ac.getBean("userSrvImpl");
User user=new User();
user.setId(UUID.randomUUID().toString().replace("-",""));
user.setUsername("李现");
user.setPassword("123456");
srv.save(user);
}
}
报错时,不会提交到数据库