springboot集成mybatis(一)

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!";
    }
}
View Code

 

Mybatis注解版本:

优点:去除了配置文件,实现代码统一管理。

缺点:增加了Java代码的维护难度,不方便编写sql,可视化程度低。

 

源代码:https://gitee.com/skychenjiajun/spring-boot

 

posted @ 2018-01-12 10:27  名山丶深处  阅读(7563)  评论(1编辑  收藏  举报