博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-boot集成MyBatis
阅读量:6443 次
发布时间:2019-06-23

本文共 7944 字,大约阅读时间需要 26 分钟。

依赖管理 pom.xml

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

org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
mysql
mysql-connector-java
5.1.21

配置 application.properties

application.properties中配置mysql链接信息

spring.datasource.url=jdbc:mysql://192.168.11.22:3306/demo?useUnicode=true&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=rootspring.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;@Mapperpublic 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
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
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;@Servicepublic 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
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
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;@Mapperpublic 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
> list(Map
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
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文档

转载于:https://my.oschina.net/tongjh/blog/1596813

你可能感兴趣的文章
《深入理解JVM》读书笔记
查看>>
币安布局去中心化交易所,原来是因为这三个原因!
查看>>
搭建gitbook 和 访问权限认证
查看>>
90. Subsets II
查看>>
大厂高级前端面试题答案
查看>>
深入理解Vue.js轻量高效的前端组件化方案
查看>>
小程序红包雨
查看>>
BundlePhobia
查看>>
django开发-django和tornado的不同
查看>>
环境变量python从版本2.x更改为3.x时,yum报错
查看>>
我从编程教室毕业
查看>>
如何合理的规划jvm性能调优
查看>>
构建你的第一个Flutter视频通话应用
查看>>
114. Flatten Binary Tree to Linked List
查看>>
在react-router中进行代码拆分
查看>>
User Stories - 最佳实践 (Best Practices)
查看>>
Spring - Java-based configuration: Using @Configuration
查看>>
使用Envoy 作Sidecar Proxy的微服务模式-2.超时和重试
查看>>
node.js初体验之利用node.js的fs-文件系统,来写一个批量修改文件名的小工具
查看>>
数据流被污染?数据质量不高?蚂蚁金服数据资产管理平台了解一下
查看>>