spring创建工程集成mybatis(全注解、事务注解)

概述

本文介绍 全注解(含事务注解)方式 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);

    }
}

报错时,不会提交到数据库


原文出处:/show_1IX3MyVejhB.html