MyBatis简介
MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。它支持定制化SQL、存储过程、高级映射及缓存。是一个轻量级的持久层框架。
目前主流的持久层框架还是Mybatis、Hibernate及JDBC Template,这些持久层框架各有利弊。
一、MyBatis注解版(Annotation)
注解版本可以优雅的去除配置文件,并和springboot集成实现零配置。
1.springboot集成mybatis,增加maven依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </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.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
2.配置Mybatis数据源,application.properties文件添加配置信息
springboot默认读取spring.datasource.xxx属性,初始化DataSource并自动注入sqlSessionFactory
mybatis.type-aliases-package=com.lianjinsoft.pojo
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.15.128:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
3.springboot启动类,增加Mybatis扫描注解
@MapperScan("com.lianjinsoft.mapper")
@SpringBootApplication
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
4.增加pojo数据表映射类(部分代码)
public class Order { private Integer id; private String orderNo; private String orderName; private BigDecimal amount; private Date addTime; public Order(){} public Order(String orderNo, String orderName, BigDecimal amount){ this.orderNo = orderNo; this.orderName = orderName; this.amount = amount; this.addTime = new Date(); } }
5.增加Mapper数据持久层操作方法
去掉sql配置文件,其实就是将sql语句转移到了Class文件中
public interface OrderMapper { @Insert("INSERT INTO orders(order_no,order_name,amount,add_time) " + "VALUES(#{orderNo}, #{orderName}, #{amount}, #{addTime})") void addOrder(Order order); @Delete("DELETE FROM orders WHERE id=#{id}") void delOrder(Integer id); @Update("UPDATE orders SET order_name=#{orderName} WHERE id=#{id}") void updOrder(Order order); @Select("SELECT * FROM orders") @Results({ @Result(property = "orderNo", column = "order_no"), @Result(property = "orderName", column = "order_name"), @Result(property = "addTime", column = "add_time"), }) List<Order> queryOrders(); @Select("SELECT * FROM orders WHERE order_no=#{orderNo}") @Results({ @Result(property = "orderNo", column = "order_no"), @Result(property = "orderName", column = "order_name"), @Result(property = "addTime", column = "add_time"), }) Order queryOrderByNo(String orderNo); }
6.增加TestCase,通过Junit测试
@RunWith(SpringRunner.class) @SpringBootTest public class OrderMapperTests { @Autowired private OrderMapper orderMapper; @Test public void test1_Add() { orderMapper.addOrder(new Order("100001", "XX手机Plus 全面屏", new BigDecimal("4999"))); } @Test public void test2_Query() { Order order = orderMapper.queryOrderByNo("100001"); Assert.assertNotNull(order); } @Test public void test3_QueryOrders() { Assert.assertEquals(1, orderMapper.queryOrders().size()); } @Test public void test4_Upd() { Order order = orderMapper.queryOrderByNo("100001"); order.setOrderName("三星S8+ 全面屏"); orderMapper.updOrder(order); } @Test public void test5_Del() { orderMapper.delOrder(orderMapper.queryOrders().get(0).getId()); Assert.assertEquals(0, orderMapper.queryOrders().size()); } }
7.执行TestCase中的方法,验证Mybatis持久层方法是否正确
Demo中的TestCase有依赖关系,请按照测试方法的前后顺序分别执行Test方法。
8.验证通过,编写Controller
@RestController @RequestMapping("/order") public class OrderController { @Autowired private OrderMapper orderMapper; @RequestMapping("/add") public String addOrder(Order order){ order.setAddTime(new Date()); orderMapper.addOrder(order); return "add success!"; } @RequestMapping("/update") public String updOrder(Order order){ orderMapper.updOrder(order); return "update success!"; } @RequestMapping("/query") public Order queryOrder(String orderNo){ return orderMapper.queryOrderByNo(orderNo); } @RequestMapping("/queryAll") public List<Order> queryAll(){ return orderMapper.queryOrders(); } @RequestMapping("/delete") public String delOrder(Integer id){ orderMapper.delOrder(id); return "delete success!"; } }
Mybatis注解版本:
优点:去除了配置文件,实现代码统一管理。
缺点:增加了Java代码的维护难度,不方便编写sql,可视化程度低。
源代码:https://gitee.com/skychenjiajun/spring-boot