3、Spring Boot 2.x整合Mybatis并且实现单表的增删除改查

上一篇创建了一个最简单的Spring Boot 2.x项目,算是有了一个初步的认识。

这一篇我们在上一篇项目的基础上,实现以下目标:

1、项目中整合Mybatis Generator进行mapper相关文件的自动生成;

2、整合Mybatis连接数据库并且实现单表的增删改查;

3、并且使用Sping Boot 2.x默认的HikariCP作为数据库连接池;

一、引入相关依赖

在pom.xml中添加如下依赖项:

 

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.2</version>
</dependency>

并且排除tomcat的默认jdbc;在spring-boot-starter-web依赖进行修改,如下

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<!--排除默认的tomcat-jdbc-->
		<exclusion>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jdbc</artifactId>
		</exclusion>
	</exclusions>
</dependency>

 

只需要导入spring-boot-starter-jdbc依赖springboot就默认使用Hikari作为数据库连接池了

二、创建数据库表

数据库名称:bgms

用户名:bgms

密码:bgms

我们创建的表的结构如下:

CREATE TABLE `tb_user_info` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID号,自动增长',
  `USER_NAME` varchar(32) DEFAULT NULL COMMENT '用户名',
  `PASSWORD` varchar(64) DEFAULT NULL COMMENT '密码',
  `AGE` int(11) DEFAULT NULL COMMENT '年龄',
  `EMAIL` varchar(128) DEFAULT NULL COMMENT '邮箱',
  `CREATE_TIME` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

三、整合mybatis-generator并生成mybatis相关文件(实体类,映射文件等)

为了使实体类,映射文件以及数据库操作相关的类自动生成,我们使用mybatis-generator进行生成,这里我们对其进行整合

1、准备工作

在com.aicode.bgms下分别创建mapper、model目录;

在resources下分别创建mapping/generator目录;

将generatorConfig.xml文件复制到generator目录下:

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>
    <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
    <classPathEntry  location="C:\mybatisGenerator\mysql-connector-java-5.1.26-bin.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/bgms" userId="bgms" password="bgms">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.aicode.bgms.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.aicode.bgms.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
        <table tableName="tb_user_info" domainObjectName="UserInfo" enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="true"></table>
    </context>
</generatorConfiguration>

 

 修改mysql连接池使用的jar包地址为你自己本地的地址,修改classPathEntry中的location;

修改其他相关内容,包括model路径,mapping路径,dao文件路径以及数据库表名和对应要生成的类名。

2、在pom.xml中的<build><plugins>下添加mybatis-generator插件;

<!-- mybatis generator 自动生成代码插件 -->
<plugin>
	<groupId>org.mybatis.generator</groupId>
	<artifactId>mybatis-generator-maven-plugin</artifactId>
	<version>1.3.2</version>
	<configuration>
                <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
		<overwrite>true</overwrite>
		<verbose>true</verbose>
	</configuration>
</plugin>

3、在application.properties中添加如下配置内容

 

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

server.port=8080

# datasource start
#数据库连接相关配置
spring.datasource.url=jdbc:mysql://localhost:3306/bgms?zeroDateTimeBehavior=convertToNull&autoReconnect=true&autoReconnectForPools=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=bgms
spring.datasource.password=bgms
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1765000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
# datasource end

# mybatis start
# mybatis日志配置
logging.level.com.battcn=DEBUG
#注意:一定要对应mapper映射xml文件的所在路径
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=com.aicode.bgms.model
# 驼峰命名规范 如:数据库字段role_code,实体字段要写成 roleCode
mybatis.configuration.map-underscore-to-camel-case=true
# mybatis end

注册上面的mysql驱动类已经变为com.mysql.cj.jdbc.Driver,而不是原来的com.mysql.jdbc.Driver,因为我们引入mysql的jar包依赖时没有标注版本号,查看spring boot的使用版本为,如下图:

另外上面配置中,我们采用spring boot推荐的HiKariCP进行数据库连接。HiKariCP起源于BoneCP。号称性能最好,可以完美地PK掉其他连接池。参考地址:

https://jolbox.com/benchmarks.html

网上对HiKariCP更是好评如潮。

英文不太好的同学也可以参考网友的博文:

https://blog.csdn.net/clementad/article/details/46928621

https://blog.csdn.net/zxl315/article/details/80420688

且不论HiKariCP是否是真的有说的那么优秀吧,这里我们也为了简单,暂且使用它。

4、Intellij Idea 中mybatis-generator启动配置

在Idea中点击依次点击,菜单Run——〉Edit Configurations...

进入如下Run/Debug Run Configurations界面,然后点击左上角的"+",然后选择maven

 

 

 如上图所示,Name输入generator,Command line输入:

mybatis-generator:generate -e

然后点击"ok"按钮;

5、生成实体类及映射文件

运行上一步配置的generator,此时会生成mybatis相关的实体类及映射文件,生成后,如下图所示:

 

可以看到新生成的四个文件:UserInfoMapper.java、UserInfoExample.java、UserInfo.java、UserInfoMapper.xml;

此四个文件为自动生成,这里不再贴出,浪费篇幅;

另外,有时我们可能需要自己写一些操作数据库的mapper方法,这里为了不修改自动生成的代码,我们把自行编写的dao方法放在extra目录下xxxxExtraMapper.java中,如下图:

 

UserInfoExtraMapper.java

package com.aicode.bgms.mapper.extra;

import com.aicode.bgms.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserInfoExtraMapper {

    UserInfo findUserInfoByUserName(@Param("userName") String userName);
}

UserInfoExtraMapper.xml

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.aicode.bgms.mapper.extra.UserInfoExtraMapper" >
    <resultMap id="BaseResultMap" type="com.aicode.bgms.model.UserInfo" >
        <id column="ID" property="id" jdbcType="INTEGER" />
        <result column="USER_NAME" property="userName" jdbcType="VARCHAR" />
        <result column="PASSWORD" property="password" jdbcType="VARCHAR" />
        <result column="AGE" property="age" jdbcType="INTEGER" />
        <result column="EMAIL" property="email" jdbcType="VARCHAR" />
        <result column="CREATE_TIME" property="createTime" jdbcType="TIMESTAMP" />
    </resultMap>

    <sql id="Base_Column_List" >
        ID, USER_NAME, PASSWORD, AGE, EMAIL, CREATE_TIME
    </sql>

    <!-- 根据用户名查询用户信息 -->
    <select id="findUserInfoByUserName" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from tb_user_info
        where USER_NAME = #{userName,jdbcType=VARCHAR}
    </select>
</mapper>

如果有自定义的pojo类,可以放在model目录下的extra目录下,命名方式参考其他扩展文件。

四、创建Service相关类

1、创建Service接口类

在com.aicode.bgms下创建service包,然后创建UserInfoSerevice.java接口类,如下:

package com.aicode.bgms.service;

import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.UserInfoExample;

import java.util.List;

public interface UserInfoService {

    List<UserInfo> findUserListByExample(UserInfoExample example);

    List<UserInfo> findAll();

    UserInfo findUserInfoByUserName(String userName);

    UserInfo getUserInfoById(Integer id);

    int addUserInfo(UserInfo userInfo);

    int updateUserInfo(UserInfo userInfo);

    int removeUserInfoById(Integer id);
}

2、创建Service实现类

在com.aicode.bgms.service包下创建impl包,然后创建UserInfoServiceImpl.java类

 

package com.aicode.bgms.service;

import com.aicode.bgms.mapper.UserInfoMapper;
import com.aicode.bgms.mapper.extra.UserInfoExtraMapper;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.UserInfoExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserInfoServiceImpl implements UserInfoService {

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Autowired
    private UserInfoExtraMapper userInfoExtraMapper;

    @Override
    public List<UserInfo> findUserListByExample(UserInfoExample example) {
        return userInfoMapper.selectByExample(example);
    }

    @Override
    public List<UserInfo> findAll() {
        return userInfoMapper.selectByExample(new UserInfoExample());
    }

    @Override
    public UserInfo findUserInfoByUserName(String userName) {
        return userInfoExtraMapper.findUserInfoByUserName(userName);
    }

    @Override
    public UserInfo getUserInfoById(Integer id) {
        return userInfoMapper.selectByPrimaryKey(id);
    }

    @Override
    public int addUserInfo(UserInfo userInfo) {
        return userInfoMapper.insertSelective(userInfo);
    }

    @Override
    public int updateUserInfo(UserInfo userInfo) {
        return userInfoMapper.updateByPrimaryKeySelective(userInfo);
    }

    @Override
    public int removeUserInfoById(Integer id) {
        return userInfoMapper.deleteByPrimaryKey(id);
    }
}

 

这个时候,在代码中自动装配UserInfoMapper和UserInfoExtraMapper时,Idea会报红,但不影响正常运行,如果您想去掉,可以进行如下设置,依次进行如下操作:

File—〉Settings—〉Inspections—〉右侧找到Spinrg—〉Spring Core —〉Code—〉Autowiring for Bean Class,将右部的Severity设置为Warning即可。

 五、编辑控制层类

在com.aicode.bgms.controller包下创建UserInfoController.java类

package com.aicode.bgms.controller;

import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;

    @GetMapping("/list")
    public List<UserInfo> list(){
        return userInfoService.findAll();
    }

    @PostMapping("/add")
    public int add(UserInfo userInfo){
        return userInfoService.addUserInfo(userInfo);
    }

    @GetMapping("/get/{id}")
    public UserInfo get(@PathVariable("id") Integer id){
        return userInfoService.getUserInfoById(id);
    }

    @PatchMapping("/edit")
    public UserInfo modify(UserInfo userInfo) {
        Integer id = userInfo.getId();
        userInfoService.updateUserInfo(userInfo);
        UserInfo userInfoTmp = userInfoService.getUserInfoById(id);
        return userInfoTmp;
    }

    @DeleteMapping("/del/{id}")
    public int del(@PathVariable("id") Integer id){
        return userInfoService.removeUserInfoById(id);
    }

}

 

代码比较简单,没有添加多余的注释。

这里为了测试接口方便采用了注解@RestController。后面要返回页面时,我们再修改为@Controller

关于@RestController与@Controller的区别如下:

@RestController注解相当于@ResponseBody + @Controller合在一起的作用

1) 、如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

2) 、如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。

    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

以上代码是按照RESTful的方式进行构建的。

相关注解说明:

  • @GetMapping,处理 Get 请求
  • @PostMapping,处理 Post 请求
  • @PatchMapping,用于更新资源,相比较PutMapping要传全部数据,patch只需传部分属性即可
  • @DeleteMapping,处理删除请求
  • @PatchMapping,用于更新部分资源

文件中代码如下:

@GetMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.GET)

@PostMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.POST)

@PutMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.PUT)

@DeleteMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.DELETE)

@PatchMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.PATCH)

请求 地址 说明

get /list 获取所有用户信息

post /add 创建一个用户信息

patch /edit 修改用户信息

get /get/{id} 根据 ID 获取用户信息

delete /del/{id} 根据 ID 删除用户信息

好了,剩下的代码可以自己分析了,这里只是为了方便进行RESTful测试,没有对代码进行详细编写。

测试

启动类配置

需要在启动类中添加如下注解:

@MapperScan(basePackages = "com.aicode.bgms.mapper")

方可正常启动。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值