Spring Boot入门系列(六)Spring Boot整合Mybatis「附详细步骤」
前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法。
今天主要讲解Springboot整合Mybatis实现一个基本的增删改查功能。Spring Boot整合Mybatis的方式有两种:一种是注解形式的,也就是没有Mapper.xml文件,还有一种是XML形式的,我推荐的是使用注解形式,为什么呢?因为更加的简介,减少不必要的错误。
一、整合Mybatis
步:数据库新建Person表
这个表结构很简单,就是普通的用户表。
CREATE TABLE `sys_user` (`id` varchar(32) NOT NULL DEFAULT '',`username` varchar(32) DEFAULT NULL,`password` varchar(64) DEFAULT NULL,`nickname` varchar(64) DEFAULT NULL,`age` int(11) DEFAULT NULL,`sex` int(11) DEFAULT NULL,`job` int(11) DEFAULT NULL,`face_image` varchar(6000) DEFAULT NULL,`province` varchar(64) DEFAULT NULL,`city` varchar(64) DEFAULT NULL,`district` varchar(64) DEFAULT NULL,`address` varchar(255) DEFAULT NULL,`auth_salt` varchar(64) DEFAULT NULL,`last_login_ip` varchar(64) DEFAULT NULL,`last_login_time` datetime DEFAULT NULL,`is_delete` int(11) DEFAULT NULL,`regist_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
第二步:增加mybatis相关依赖
我们只需要加上pom.xml文件这些依赖即可。
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><!--mapper--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>1.2.4</version></dependency><!-- pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.3</version></dependency><!-- druid 数据库连接框架--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.2</version><scope>compile</scope><optional>true</optional></dependency>
第三步:增加统一的mapper接口
在utils包中创建一个统一的mapper接口,
后面所有的mapper类都会继承这个接口
package com.weiz.utils;import tk.mybatis.mapper.common.Mapper;import tk.mybatis.mapper.common.MySqlMapper;/*** 继承自己的MyMapper** @author weiz* @since 2019-09-06 21:53*/public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {//TODO//FIXME 特别注意,该接口不能被扫描到,否则会出错}
特别注意:该接口不能被扫描到,否则会出错。所以我把这个接口放在了utils包中。
第四步:更改application.properties配置文件
主要是mybatis相关的数据库配置。
############################################################# 数据源相关配置,这里用的是阿里的druid 数据源############################################################spring.datasource.url=jdbc:mysql://localhost:3306/zwz_testspring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.druid.initial-size=1spring.datasource.druid.min-idle=1spring.datasource.druid.max-active=20spring.datasource.druid.test-on-borrow=truespring.datasource.druid.stat-view-servlet.allow=true############################################################# mybatis 相关配置############################################################mybatis.type-aliases-package=com.weiz.pojomybatis.mapper-locations=classpath:mapper/*.xmlmapper.mappers=com.weiz.utils.MyMapper #这个MyMapper 就是我之前创建的mapper统一接口。后面所有的mapper类都会继承这个接口mapper.not-empty=falsemapper.identity=MYSQL# 分页框架pagehelper.helperDialect=mysqlpagehelper.reasonable=truepagehelper.supportMethodsArguments=truepagehelper.params=count=countSql
这里的配置有点多,不过基本的配置都在这。
二、代码自动生成工具
Spring Boot有mybatis generator自动生成代码插件,能自动生成pojo实体类、接口、mapper.xml 文件,提高开发效率。这里就不介绍怎么安装使用mybatis generator插件。介绍一个简单的GeneratorDisplay自动生成类。
第五步:创建GeneratorDisplay类
package com.weiz.utils;import java.io.File;import java.util.ArrayList;import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;public class GeneratorDisplay {public void generator() throws Exception{List<String> warnings = new ArrayList<String>();boolean overwrite = true;//指定 逆向工程配置文件File configFile = new File("generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback, warnings);myBatisGenerator.generate(null);}public static void main(String[] args) throws Exception {try {GeneratorDisplay generatorSqlmap = new GeneratorDisplay();generatorSqlmap.generator();} catch (Exception e) {e.printStackTrace();}}}
这个其实也是调用mybatis generator实现的。跟mybatis generator安装插件是一样的。
第六步:增加generatorConfig.xml配置文件
在resources文件下创建generatorConfig.xml文件,配置如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat"><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><plugin type="tk.mybatis.mapper.generator.MapperPlugin"><property name="mappers" value="com.weiz.utils.MyMapper"/></plugin><!-- 数据库连接配置--><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/zwz_test"userId="root"password="root"></jdbcConnection><!-- 对于生成的pojo所在包 --><javaModelGenerator targetPackage="com.weiz.pojo" targetProject="src/main/java"/><!-- 对于生成的mapper所在目录 --><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/><!-- 配置mapper对应的java映射 --><javaClientGenerator targetPackage="com.weiz.mapper" targetProject="src/main/java"type="XMLMAPPER"/><table tableName="sys_user"></table></context></generatorConfiguration>
注意:利用Mybatis Generator自动生成代码,对于已经存在的文件会存在覆盖和在原有文件上追加的可能性,不宜多次生成。如需重新生成,需要删除已生成的源文件。
第七步:Mybatis Generator自动生成代码
运行GeneratorDisplay 如下图所示,即可自动生成相关的代码。
第八步:在service包下创建UserService及UserServiceImpl接口实现类
1. 在com.weiz.service包中,创建UserService类
package com.weiz.service;import com.weiz.pojo.SysUser;import java.util.List;public interface UserService {public void saveUser(SysUser user) throws Exception;public void updateUser(SysUser user);public void deleteUser(String userId);public SysUser queryUserById(String userId);public List<SysUser> queryUserList(SysUser user);public List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize);public void saveUserTransactional(SysUser user);}
2. 在com.weiz.service.impl包中,创建UserServiceImpl实现类
package com.weiz.service.impl;import com.github.pagehelper.PageHelper;import com.weiz.mapper.SysUserMapper;import com.weiz.mapper.SysUserMapperCustom;import com.weiz.pojo.SysUser;import com.weiz.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.thymeleaf.util.StringUtils;import tk.mybatis.mapper.entity.Example;import java.util.List;@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate SysUserMapper userMapper;@Overridepublic void saveUser(SysUser user) throws Exception {userMapper.insert(user);}@Overridepublic void updateUser(SysUser user) {userMapper.updateByPrimaryKeySelective(user);}@Overridepublic void deleteUser(String userId) {userMapper.deleteByPrimaryKey(userId);}@Overridepublic SysUser queryUserById(String userId) {return userMapper.selectByPrimaryKey(userId);}@Overridepublic List<SysUser> queryUserList(SysUser user) {return null;}@Overridepublic List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize) {// 分页功能实现PageHelper.startPage(page,pageSize);Example example = new Example(SysUser.class);Example.Criteria criteria = example.createCriteria();if (!StringUtils.isEmptyOrWhitespace(user.getUsername())) {criteria.andLike("username", "%" + user.getUsername() + "%");}if (!StringUtils.isEmptyOrWhitespace(user.getNickname())) {criteria.andLike("nickname", "%" + user.getNickname() + "%");}List<SysUser> userList = userMapper.selectByExample(example);return userList;}@Overridepublic void saveUserTransactional(SysUser user) {}}
第九步:编写controller层,增加MybatisController控制器
package com.weiz.controller;import com.weiz.utils.JSONResult;import com.weiz.pojo.SysUser;import com.weiz.service.UserService;import org.n3r.idworker.Sid;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Date;import java.util.List;@RestController@RequestMapping("mybatis")public class MyBatisCRUDController {@Autowiredprivate UserService userService;@Autowiredprivate Sid sid;@RequestMapping("/saveUser")public JSONResult saveUser() throws Exception {// 自动生成ID,也可以直接用uuidString userId = sid.nextShort();SysUser user = new SysUser();user.setId(userId);user.setUsername("spring boot" + new Date());user.setNickname("spring boot" + new Date());user.setPassword("abc123");user.setIsDelete(0);user.setRegistTime(new Date());userService.saveUser(user);return JSONResult.ok("保存成功");}@RequestMapping("/updateUser")public JSONResult updateUser() {SysUser user = new SysUser();user.setId("10011001");user.setUsername("10011001-updated" + new Date());user.setNickname("10011001-updated" + new Date());user.setPassword("10011001-updated");user.setIsDelete(0);user.setRegistTime(new Date());userService.updateUser(user);return JSONResult.ok("保存成功");}@RequestMapping("/deleteUser")public JSONResult deleteUser(String userId) {userService.deleteUser(userId);return JSONResult.ok("删除成功");}@RequestMapping("/queryUserById")public JSONResult queryUserById(String userId) {return JSONResult.ok(userService.queryUserById(userId));}@RequestMapping("/queryUserList")public JSONResult queryUserList() {SysUser user = new SysUser();user.setUsername("spring boot");user.setNickname("lee");List<SysUser> userList = userService.queryUserList(user);return JSONResult.ok(userList);}@RequestMapping("/queryUserListPaged")public JSONResult queryUserListPaged(Integer page) {if (page == null) {page = 1;}int pageSize = 10;SysUser user = new SysUser();List<SysUser> userList = userService.queryUserListPaged(user, page, pageSize);return JSONResult.ok(userList);}@RequestMapping("/queryUserByIdCustom")public JSONResult queryUserByIdCustom(String userId) {return JSONResult.ok(userService.queryUserByIdCustom(userId));}@RequestMapping("/saveUserTransactional")public JSONResult saveUserTransactional() {String userId = sid.nextShort();SysUser user = new SysUser();user.setId(userId);user.setUsername("lee" + new Date());user.setNickname("lee" + new Date());user.setPassword("abc123");user.setIsDelete(0);user.setRegistTime(new Date());userService.saveUserTransactional(user);return JSONResult.ok("保存成功");}}
第十步:在启动主类添加扫描器
在SpringBootStarterApplication 启动类中增加包扫描器。
@SpringBootApplication//扫描 mybatis mapper 包路径@MapperScan(basePackages = "com.weiz.mapper") // 这一步别忘了。//扫描 所有需要的包, 包含一些自用的工具类包 所在的路径@ComponentScan(basePackages = {"com.weiz","org.n3r.idworker"})public class SpringBootStarterApplication {public static void main(String[] args) {SpringApplication.run(SpringBootStarterApplication.class, args);}}
第十一步:测试
在浏览器输入controller里面定义的路径即可。只要你按照上面的步骤一步一步来,基本上就没问题,是不是特别简单。
后
以上,就把Spring Boot整合Mybatis及实现增删改查介绍完了,Spring Boot 整合Mybatis 是整个Spring Boot 非常重要的功能,也是非常核心的基础功能,希望大家能够熟练掌握。后面会深入介绍Spring Boot的各个功能和用法。
这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号(架构师精进),回复:springboot源码。获取这个系列课程的完整源码。
推荐阅读:
SpringBoot入门系列(五)Thymeleaf的常用标签和用法
SpringBoot入门系列(四)整合Thymeleaf模板引擎
SpringBoot入门系列(三)SpringBoot资源文件属性配置
SpringBoot入门系列(二)Controller介绍及如何统一返回json数据
-
SpringBoot入门系列(一)如何快速创建SpringBoot项目
相关文章