转: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>
public class User { private Integer userId; private String userName; private Integer userSex; //构造方法以及getter、setter省略 }
新建UserMapper:
public interface UserMapper { @Select("select * from user") List<User> findAll(); }
当然,这样做的前提是实体类和数据库中的字段名一致,如果不一致就要这么写注解:
@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();
上面是查询
插入:
@Insert("insert into user(userid,username,usersex) VALUES(#{userId}, #{userName}, #{userSex})") void insert(User user);
更新:
@Update("update user set userid=#{userId}, username=#{userName}, usersex=#{userSex}") void update(User user);
删除:
@Delete("delete from user where userid=#{userId}") void delete(Long userId);
补充:
如果要插入的主键使用的是自增主键,可以使用@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"; } }
事务管理:
添加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"; } }
(如果整个类的所有方法都需要事务管理则在类上添加,如果仅某个方法需要事务管理则在方法上添加)
@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(); } }
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--指定特定异常名,遇到时数据不会回滚