zoukankan      html  css  js  c++  java
  • spring boot:配置mybatis以及注解事务

     

    转:https://blog.csdn.net/qq_39320953/article/details/77947947

    配置mybatis:

    添加mybatis-spring-boot-starter以及mysql-connector-java依赖:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
     
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
    View Code
    新建entity-数据库对应的实体类: 
    public class User {
     
     
    private Integer userId;
     
     
    private String userName;
     
    
    private Integer userSex;
     
     
    //构造方法以及getter、setter省略
     
    }
     
    View Code
    因为我特别讨厌繁杂的XML配置文件,所以以下采用的是注解式:

    新建UserMapper:

    public interface UserMapper {
     
    @Select("select * from user")
     
    List<User> findAll();
     
    }
    View Code
    简单一句话注解完事

    当然,这样做的前提是实体类和数据库中的字段名一致,如果不一致就要这么写注解:

    @Select("select * from user")
     
    @Results({
     
    @Result(property = "userId", column = "user_id"),
     
    @Result(property = "userName", column = "user_name"),
     
    @Result(property = "userSex", column = "user_sex")
     
    })
    List<User> findAll();
    View Code
    @Results注解里写各个@Result,即实体类属性对应字段名

    上面是查询

    插入:

    @Insert("insert into user(userid,username,usersex) VALUES(#{userId}, #{userName}, #{userSex})")
    void insert(User user);
    View Code

    更新:

    @Update("update user set userid=#{userId}, username=#{userName}, usersex=#{userSex}")
    
    void update(User user);
    View Code

    删除:

    @Delete("delete from user where userid=#{userId}")
     
    void delete(Long userId);
    View Code

    补充:

    如果要插入的主键使用的是自增主键,可以使用@Option注解获得主键返回值

     @Options(useGeneratedKeys = true, keyProperty = "userId")

     
    常用属性:

    useCache=true

    //为true时表示本条语句将进行二级缓存,仅在select下使用,select下默认为true

    flushCache=false 

    //为true时表示调用任何语句将清空本地缓存和耳机缓存,为flase时不会

    //select时默认为false,insert、update、delete时默认为true


    resultSetType=FORWARD_ONLY

    //resultSetType设置结果集的游标怎么滚动

    //FORWARD_ONLY表示结果集的游标只能向下移动 

    //SCROLL_INSENSITIVE和SCROLL_SENSITIVE都能实现任意前后滚动,区别在于前者对于修改敏感,后者对于修改不敏感

    //


    statementType=PREPARED

    //是否预编译

    //STATEMENT 静态SQL

    //PREPARED 动态SQL,一次编译,多次执行,可以防止SQL注入

    //CALLABLE 动态SQL,支持调用存储过程(还提供了些其他的支持?)


    fetchSize= -1

    //每次读取多少行数据,-1或不设置:驱动来决定

    timeout=-1 

    //设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值,-1或不设置:驱动来决定


    useGeneratedKeys=false

    //(仅对 insert 有用)为true时会告诉 MyBatis 使用JDBC的 getGeneratedKeys 方法来取出由数据(比如:像 MySQL 和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键。

    keyProperty="userId"

    //(仅对 insert 有用)标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。默认: 不设置

    最后在入口处添加扫描包的注解:@MapperScan(这里将入口作为了控制器做测试)

    @Controller
     
    @MapperScan("com.fc.mybatistest.mapper")
     
    @SpringBootApplication
     
    public class MybatistestApplication {
     
     
     
    @Autowired
     
    private UserMapper userMapper;
     
     
     
    public static void main(String[] args) {
     
    SpringApplication.run(MybatistestApplication.class, args);
     
    }
     
     
     
    @RequestMapping("/")
     
    public String findAll(Model model){
     
    List<User> user = userMapper.findAll();
     
    model.addAttribute("user", user);
     
    return "index";
     
    }
     
    }
    View Code
    测试:略

    事务管理:

    添加mybatis-spring-boot-starter依赖时已经加入了事务处理的jar包:spring-tx.jar
    在入口处添加@EnableTransactionManagement注解开始事务控制:
    @Controller
     
     
     
    @MapperScan("com.fc.mybatistest.mapper")
     
    @EnableTransactionManagement
     
    @SpringBootApplication
     
    public class MybatistestApplication {
     
     
     
    @Autowired
     
    private UserService userService;
     
     
     
    public static void main(String[] args) {
     
    SpringApplication.run(MybatistestApplication.class, args);
     
    }
     
     
     
    @RequestMapping("/")
     
    public String findAll(Model model){
     
    List<User> user = userMapper.findAll();
     
    model.addAttribute("user", user);
     
    return "index";
     
    }
     
    }
    View Code
    然后在业务逻辑层的实现类中添加注解@Transactional:
    (如果整个类的所有方法都需要事务管理则在类上添加,如果仅某个方法需要事务管理则在方法上添加)
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)
     
    public class UserServiceimpl implements UserService {
     
     
    @Autowired
     
    private UserMapper userMapper;
     
     
    @Override
     
    public List<User> findAll() {
     
    return userMapper.findAll();
     
    }
     
     
     
    }
    View Code

    PS: 注解@Transactional各个属性含义:

    propagation --事务传播行为
    含有以下值:

    PROPAGATION_REQUIRED 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
    PROPAGATION_REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
    PROPAGATION_NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。
    PROPAGATION_MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
    PROPAGATION_NESTED 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。



    isolation --事务隔离级别
    含有以下值:

    ISOLATION_DEFAULT 这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是
    ISOLATION_READ_UNCOMMITTED 该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
    ISOLATION_READ_COMMITTED 该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
    ISOLATION_REPEATABLE_READ 该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
    ISOLATION_SERIALIZABLE 所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。



    timeout --事务超时


    readOnly --读写或只读事务


    rollbackFor --指定特定异常实例,遇到时数据回滚


    rollbackForClassname--指定特定异常名,遇到时数据回滚


    norollbackFor --指定特定异常实例,遇到时数据不会回滚


    norollbackForClassname--指定特定异常名,遇到时数据不会回滚

  • 相关阅读:
    浅析几种常用坐标系和坐标转换
    windows live message 无法安装
    解决英文版XP下的PL/SQL Developer的中文乱码问题
    C# static 用法
    用plsql登陆oracle,创建用户赋予权限
    Silverlight Map 技术点总结
    【OCP12c】CUUG 071题库考试原题及答案解析(20)
    【OCP12c】CUUG 071题库考试原题及答案解析(15)
    【OCP12c】CUUG 071题库考试原题及答案解析(14)
    【OCP12c】CUUG 071题库考试原题及答案解析(17)
  • 原文地址:https://www.cnblogs.com/javalanger/p/10952810.html
Copyright © 2011-2022 走看看