spring-boot集成MyBatis

原创
2017/12/29 18:14
阅读数 84

依赖管理 pom.xml

需要在pom.xml中加入 Mybatis 的依赖和 MySQL 连接驱动依赖

<!-- Spring Boot Mybatis 依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>

<!-- MySQL 连接驱动依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
</dependency>

配置 application.properties

application.properties中配置mysql链接信息

spring.datasource.url=jdbc:mysql://192.168.11.22:3306/demo?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

创建数据库表

进入demo数据库,新建一张menu的表

CREATE TABLE `menu` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `pid` int(11) NOT NULL DEFAULT '0',
  `content` varchar(200) NOT NULL DEFAULT '',
  `status` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `menu` ADD PRIMARY KEY (`id`);

ALTER TABLE `menu` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;COMMIT;

创建表的实体类

程序在src/main/java/com/example/demo

创建一个表的实体类domain/menu.java

package com.example.demo.domain;

public class Menu {

    private Long id;
    private String name;
    private Long pid;
    private String content;
    private Integer status;

    //省略getter和setter
}

创建SQL操作接口

SQL操作接口存放到dao目录下,创建一个SQL操作接口dao/MenuDao.java, 这个操作接口必须使用@Mapper注解,意思是把此接口对应Mapper映射接口

package com.example.demo.dao;

import com.example.demo.domain.Menu;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface MenuDao {

    //增
    @Insert("INSERT INTO menu (name,pid,content,status)VALUES(#{name},#{pid},#{content},#{status})")
    @Options(useGeneratedKeys = true,keyColumn = "id",keyProperty = "id") //新增成功返回id
    int insert(Menu menu);

    //删
    @Delete("DELETE FROM menu WHERE id = #{id}")
    int delete(Long id);

    //改
    @Update("UPDATE menu SET name=#{name},pid=#{pid},content=#{content},status=#{status} WHERE id = #{id}")
    int update(Menu menu);

    //查
    @Select("SELECT * FROM menu WHERE id = #{id}")
    Menu getFindById(Long id);

    //列表
    @Select("SELECT * FROM menu")
    List<Menu> list();

}

创建service接口

service提供了数据操作的封装,在controller中使用service来操作数据库

新建service/MenuService.java接口,这个接口

package com.example.demo.service;

import com.example.demo.domain.Menu;

import java.util.List;

public interface MenuService {

    //增
    int insert(Menu menu);

    //删
    int delete(Long id);

    //改
    int update(Menu menu);

    //查
    Menu getFindById(Long id);

    //列表
    List<Menu> list();

}

创建service操作实现类

新建service/impl/MenuServiceImpl.java类,这个service实现类必须使用@Service注解修饰,封装了数据库操作接口

package com.example.demo.service.impl;

import com.example.demo.dao.MenuDao;
import com.example.demo.domain.Menu;
import com.example.demo.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MenuServiceImpl implements MenuService{

    @Autowired
    private MenuDao menuDao;

    //增
    public int insert(Menu menu) {
        return menuDao.insert(menu);
    }

    //删
    public int delete(Long id) {
        return menuDao.delete(id);
    }

    //改
    public int update(Menu menu) {
        return menuDao.update(menu);
    }

    //查
    public Menu getFindById(Long id) {
        return menuDao.getFindById(id);
    }

    //列表
    public List<Menu> list() {
        return menuDao.list();
    }
}

创建Controller使用service

创建controller/MenuController.java控制器类,在控制器中使用@Autowired注解获取Service层的Bean对象;

package com.example.demo.controller;

import com.example.demo.domain.Menu;
import com.example.demo.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/menu")
public class Menucontroller {

    @Autowired
    private MenuService menuService;

    //增
    @PostMapping("")
    public JData insert(@RequestBody Menu menu){
        int result = menuService.insert(menu);
        return new JData(1,"ok",result);
    }

    //删
    @DeleteMapping("/{id}")
    public JData delete(@PathVariable Long id){
        int result = menuService.delete(id);
        return new JData(1,"ok",result);
    }

    //改
    @PutMapping("")
    public JData update(@RequestBody Menu menu){
        int result = menuService.update(menu);
        return new JData(1,"ok",result);
    }

    //查
    @GetMapping("/{id}")
    public JData  getFindById(@PathVariable Long id){
        Menu result = menuService.getFindById(id);
        return new JData(1,"ok",result);
    }

    //列表
    @GetMapping("/list")
    public JData  list(){
        List<Menu> result = menuService.list();
        return new JData(1,"ok",result);
    }
}

以上就是mybatis常用的查询注解操作,有时候我们需要根据输入的条件动态的构建SQL语句,MyBatis为我们提供了一下几种注解

  • @InsertProvider
  • @DeleteProvider
  • @UpdateProvider
  • @SelectProvider

我们来改造一下MenuDao.java接口,让他支持根据输入条件动态的构建SQL语句

package com.example.demo.dao;

import com.example.demo.domain.Menu;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

@Mapper
public interface MenuDao {

    //增
    @InsertProvider(type = MenuSqlProvider.class,method = "insert")
    @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")//新增成功返回id
    int insert(Menu menu);

    //删
    @DeleteProvider(type=MenuSqlProvider.class,method = "delete")
    int delete(Long id);

    //改
    @UpdateProvider(type=MenuSqlProvider.class,method = "update")
    int update(Menu menu);

    //查
    @SelectProvider(type=MenuSqlProvider.class,method = "getFindById")
    Menu getFindById(Long id);

    //列表
    @SelectProvider(type=MenuSqlProvider.class,method = "list")
    List<Map<String,Object>> list(Map<String,Object> params);

}

需要新增一个MenuSqlProvider类来构建动态的SQL查询语句

package com.example.demo.dao;

import com.example.demo.domain.Menu;
import org.apache.ibatis.jdbc.SQL;

import java.util.Map;

public class MenuSqlProvider {

    private final static  String TABLE_NAME = "menu";

    //增
    public String insert(final Menu menu){
        return new SQL(){{
            INSERT_INTO(TABLE_NAME);
            VALUES("name,pid,content,status","#{name},#{pid},#{content},#{status}");
        }}.toString();
    }

    //删
    public String delete(Long id){
        return new SQL(){{
            DELETE_FROM(TABLE_NAME);
            WHERE("id=#{id}");
        }}.toString();
    }

    //改
    public String update(final Menu menu){
        String sql = new SQL(){
            {
                UPDATE(TABLE_NAME);
                WHERE("id=#{id}");
                if(menu.getName()!=null){
                    SET("name=#{name}");
                }
                if(menu.getPid()!=null){
                    SET("pid=#{pid}");
                }
                if(menu.getContent()!=null){
                    SET("content=#{content}");
                }
                if(menu.getStatus()!=null){
                    SET("status=#{status}");
                }
            }
        }.toString();
        return sql;
    }

    //查
    public String getFindById(Long id){
        String sql = new SQL(){
            {
                SELECT("*");
                FROM(TABLE_NAME);
                WHERE("id=#{id}");
            }
        }.toString();
        return sql;
    }

    //列表
    public String list(Map<String,Object> params){
        int page = (int)params.get("page");
        int pageSize = (int)params.get("pageSize");
        String name = (String) params.get("name");
        Integer pid = (Integer) params.get("pid");

        String sql = new SQL(){
            {
                SELECT("menu.*,user.*,user.name as name2");
                FROM(TABLE_NAME);
                LEFT_OUTER_JOIN("user on user.id=menu.pid");
                if(params.get("name")!=null){
                    WHERE("name=#{name}");
                }
                if(params.get("pid")!=null) {
                    WHERE("pid=#{pid}");
                }
            }
        }.toString()+" limit "+(page-1)*pageSize+","+pageSize;;
        return sql;
    }

}

具体的SQL语句构建器类的文档可以查看mybatis文档

http://www.mybatis.org/mybatis-3/zh/statement-builders.html

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部