依赖管理 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
创建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
创建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
创建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
以上就是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
需要新增一个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(Mapparams){ 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文档