zoukankan      html  css  js  c++  java
  • Spring Boot入门系列(六)Spring Boot如何使用Mybatis XML 配置版【附详细步骤】

    前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

    今天主要讲解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>
            <!-- 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>

    2、application.properties配置数据连接

    application.properties中需要增加mybatis相关的数据库配置。

    ############################################################
    # 数据源相关配置,这里用的是阿里的druid 数据源
    ############################################################
    spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.druid.initial-size=1
    spring.datasource.druid.min-idle=1
    spring.datasource.druid.max-active=20
    spring.datasource.druid.test-on-borrow=true
    spring.datasource.druid.stat-view-servlet.allow=true
    
    ############################################################
    # mybatis 相关配置
    ############################################################
    mybatis.type-aliases-package=com.weiz.pojo
    mybatis.mapper-locations=classpath:mapper/*.xml
    mapper.mappers=com.weiz.utils.MyMapper    #这个MyMapper 就是我之前创建的mapper统一接口。后面所有的mapper类都会继承这个接口
    mapper.not-empty=false
    mapper.identity=MYSQL
    # 分页框架
    pagehelper.helperDialect=mysql
    pagehelper.reasonable=true
    pagehelper.supportMethodsArguments=true
    pagehelper.params=count=countSql

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

    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;
    
    @Service
    public 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;
        }
    
        @Override
        public 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; } @Override public void saveUserTransactional(SysUser user) { } }

    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(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("保存成功");
        }
    
    
    }

    3、测试

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

     

    最后

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

    这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号(架构师精进),回复:springboot源码。获取这个系列课程的完整源码。

  • 相关阅读:
    python3 与dict相关的魔法方法。使用于二叉搜索树的类中
    笔记:nestjs学习基础(1)
    ES6 --(10)class使用、class继承
    redux --(1)核心概念(stateaction educer)、三大原则、todolist with redux
    antV--G2 学习
    react源代码重点难点分析
    jQuery-ui源代码重点难点分析
    webuploader上传插件源代码重点难点分析
    破解jQuery Deferred()异步执行的神秘世界
    ueditor源代码重点难点分析
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/12434053.html
Copyright © 2011-2022 走看看