分享好友

×
取消 复制
Spring Boot入门系列(十一)如何整合Mybatis,实现增删改查【XML 配置版】
2020-06-19 14:51:19

前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法。

今天主要讲解Springboot整合Mybatis,并实现最基本的增删改查功能。MyBatis 是现如今最流行的 ORM 框架之一,同时也支持普通的 SQL 查询,存储过程等功能的持久层框架。MyBatis 能让开发者用很简单的代码就能实现数据库操作,非常高效。

Spring Boot整合Mybatis的方式有两种:一种是注解形式的,也就是没有Mapper.xml文件,还有一种是XML形式的。MyBatis 以前只有 XML 配置这种使用的形式,到了后来注解使用特别广泛, MyBatis 也顺应潮流提供了注解的支持,接下来给大家介绍如何使用 XML 版本。


一、整合Mybatis

1、pom.xml增加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><!-- 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> 

说明

    druid-spring-boot-starter : 数据库连接池框架,这里使用的是阿里的 druid 。

      mybatis-generator-core :  自动生成pojo、mapper和xml文件的mybatis插件 。


2、application.properties配置数据连接

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/*.xml#这个MyMapper 就是我之前创建的mapper统一接口。后面所有的mapper类都会继承这个接口mapper.mappers=com.weiz.utils.MyMapper    mapper.not-empty=falsemapper.identity=MYSQL

这里的配置有点多,不过最基本的配置都在这。 

3、在启动主类添加扫描器

在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); }
}

注意:这一步别忘了,需要在SpringBootStarterApplication 启动类中增加包扫描器,自动扫描加载com.weiz.mapper 里面的mapper 类。

以上,就把Mybatis 整合到项目中了。 接下来就是创建表和pojo类,mybatis提供了强大的自动生成功能。只需简单几步就能生成pojo 类和mapper。

二、代码自动生成工具

Mybatis 整合完之后,接下来就是创建表和pojo类,mybatis提供了强大的自动生成功能。只需简单几步就能生成pojo 类和mapper。Spring Boot有Mybatis  generator自动生成代码插件,能自动生成pojo实体类、接口、mapper.xml 文件,提高开发效率。这里就不介绍怎么安装使用mybatis  generator插件。介绍一个简单的GeneratorDisplay自动生成类。

1、增加generatorConfig.xml配置文件

在resources文件下创建generatorConfig.xml文件。此配置文件独立于项目,只是给自动生成工具类的配置文件,具体配置如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration        PUBLIC "-//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>

2、数据库User表

需要在数据库中创建相应的表。这个表结构很简单,就是普通的用户表sys_user。

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;

3、增加统一的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 特别注意,该接口不能被扫描到,否则会出错}

MyMapper类是我自定义封装的Maper接口,它集成Mybatis的Mapper<T>, MySqlMapper<T>接口,这里面包含了默认的增删改查的方法。代码·生成器自动生成的mapper类,都会统一集成MyMapper接口。

特别注意:该接口不能被扫描到,否则会出错。所以我把这个接口放在了utils包中。

4、创建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安装插件是一样的。

注意:利用Mybatis Generator自动生成代码,对于已经存在的文件会存在覆盖和在原有文件上追加的可能性,不宜多次生成。如需重新生成,需要删除已生成的源文件。 

5、Mybatis Generator自动生成pojo和mapper

运行GeneratorDisplay 如下图所示,即可自动生成相关的代码。

 三、实现增删改查

在项目中整合了Mybatis并通过自动生成工具生成了相关的mapper和配置文件之后,下面就开始项目中的调用。

1、在service包下创建UserService及UserServiceImpl接口实现类

创建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);}

创建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 {
@Autowired private SysUserMapper userMapper;
@Override public void saveUser(SysUser user) throws Exception { userMapper.insert(user); }
@Override public void updateUser(SysUser user) { userMapper.updateByPrimaryKeySelective(user); }
@Override public void deleteUser(String userId) { userMapper.deleteByPrimaryKey(userId); }
@Override public SysUser queryUserById(String userId) { return userMapper.selectByPrimaryKey(userId); }
@Override public List<SysUser> queryUserList(SysUser user) { return null;    }}

2、编写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 {
@Autowired private UserService userService;
@Autowired private Sid sid;
@RequestMapping("/saveUser") public JSONResult saveUser() throws Exception {     // 自动生成ID,也可以直接用uuid String 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(); 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(); 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);    }}

3、测试

在浏览器输入controller里面定义的路径即可。只要你按照上面的步骤一步一步来,基本上就没问题,是不是特别简单。

 

最后

以上,就把Spring Boot整合Mybatis及实现增删改查介绍完了,Spring Boot 整合Mybatis 是整个Spring Boot 非常重要的功能,也是非常核心的基础功能,希望大家能够熟练掌握。后面会深入介绍Spring Boot的各个功能和用法。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

架构师精进
创建时间:2020-06-18 11:14:56
会分享各种的技术架构资料,也会将我学到的技术和知识通过分享给大家,同时读到了什么好书也会推荐给大家
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • zhangweizhong
    栈主

小栈成员

查看更多
  • 栈栈
  • ☀️
  • liuxuhui
  • guzen
戳我,来吐槽~