专栏首页晓月寒·Spring Boot从入门到精通-集成mybatis

Spring Boot从入门到精通-集成mybatis

在上一节中我们简单的使用了spring的JdbcTemplate来进行数据库操作,但是在实际的项目中使用mybatis来连接数据库是更好的选择。接下来我们将在项目中集成mybatis。

  1. 首先在pom.xml中加入mybatis的依赖
 <dependency>
       <groupId>org.mybatis.spring.boot</groupId>
       <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>1.3.0</version>
</dependency>
  1. 然后在pom.xml中的build节点下的plugins节点新增一个自动生成代码插件
<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>
  1. 接下来在application.yml中新增以下配置,yml文件对格式有要求,冒号后面必须空格,否则会识别不了。有关于yml的具体配置之后会详细讲解。
## 该配置节点为独立的节点,有很多同学容易将这个配置放在spring的节点下,导致配置无法被识别
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要对应mapper映射xml文件的所在路径
  type-aliases-package: com.example.demo.model  # 注意:对应实体类的路径

#pagehelper分页插件
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
  1. 在项目路径下新建model文件夹,在其中新建user.java实体类。
package com.example.demo.model;

public class User {
    private Integer userId;

    private String userName;

    private String password;

    private String phone;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone == null ? null : phone.trim();
    }
}
  1. 项目路径下新建mapper文件夹,新建UserMapper.java
package com.example.demo.mapper;

import com.example.demo.model.User;

import java.util.List;

public interface UserMapper {
    int deleteByPrimaryKey(Integer userId);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Integer userId);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);
    //这个方式我自己加的
    List<User> selectAllUser();
}
  1. 在resources路径下新建mapping文件夹,新建UserMapper.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.example.demo.mapper.UserMapper" >
    <resultMap id="BaseResultMap" type="com.example.demo.model.User" >
        <id column="user_id" property="userId" jdbcType="INTEGER" />
        <result column="user_name" property="userName" jdbcType="VARCHAR" />
        <result column="password" property="password" jdbcType="VARCHAR" />
        <result column="phone" property="phone" jdbcType="VARCHAR" />
    </resultMap>
    <sql id="Base_Column_List" >
        user_id, user_name, password, phone
    </sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
        select
        <include refid="Base_Column_List" />
        from t_user
        where user_id = #{userId,jdbcType=INTEGER}
    </select>
    <!-- 这个方法是我自己加的 -->
    <select id="selectAllUser" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from t_user
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
        delete from t_user
        where user_id = #{userId,jdbcType=INTEGER}
    </delete>
    <insert id="insert" parameterType="com.example.demo.model.User" >
        insert into t_user (user_id, user_name, password,
        phone)
        values (#{userId,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
        #{phone,jdbcType=VARCHAR})
    </insert>
    <insert id="insertSelective" parameterType="com.example.demo.model.User" >
        insert into t_user
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test="userId != null" >
                user_id,
            </if>
            <if test="userName != null" >
                user_name,
            </if>
            <if test="password != null" >
                password,
            </if>
            <if test="phone != null" >
                phone,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides="," >
            <if test="userId != null" >
                #{userId,jdbcType=INTEGER},
            </if>
            <if test="userName != null" >
                #{userName,jdbcType=VARCHAR},
            </if>
            <if test="password != null" >
                #{password,jdbcType=VARCHAR},
            </if>
            <if test="phone != null" >
                #{phone,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>
    <update id="updateByPrimaryKeySelective" parameterType="com.example.demo.model.User" >
        update t_user
        <set >
            <if test="userName != null" >
                user_name = #{userName,jdbcType=VARCHAR},
            </if>
            <if test="password != null" >
                password = #{password,jdbcType=VARCHAR},
            </if>
            <if test="phone != null" >
                phone = #{phone,jdbcType=VARCHAR},
            </if>
        </set>
        where user_id = #{userId,jdbcType=INTEGER}
    </update>
    <update id="updateByPrimaryKey" parameterType="com.example.demo.model.User" >
        update t_user
        set user_name = #{userName,jdbcType=VARCHAR},
        password = #{password,jdbcType=VARCHAR},
        phone = #{phone,jdbcType=VARCHAR}
        where user_id = #{userId,jdbcType=INTEGER}
    </update>
</mapper>

完成之后项目结构如图:

项目结构

  1. 在service中新增方法testMapper方法并自动注入mapper
package com.example.demo.service;

import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class DemoService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private UserMapper userMapper;

    public List<Map<String, Object>> test () {
        return jdbcTemplate.queryForList("select * from user");
    }

    public List<User> testMapper () {
        return userMapper.selectAllUser();
    }
}
  1. 在controller中新增另一个接口,调用刚刚在service中新增的方法
@GetMapping("/testMapper")
    public List<User> testMapper() {
        return demoService.testMapper();
    }
  1. 启动项目,在浏览器中调用http://localhost:8080/testMapper,即可得到我们想要的结果。此处步骤较多,如果项目在启动过程中报错的话,请仔细检查yml配置以及xml中的各项语法。 xml中namespace为对应的mapper实体类,resultMap的type为返回值对应的实体类,各个节点中的parameterType为输入参数对应的实体类,这些路径都要正确。 以上就是Spring Boot简单的整合mybatis,后期会对这个整合做进一步的深入探究。 现在我们已经有了两个可以和数据库交流的接口了,在下一节通过Spring Boot与swagger整合来开发一个我们自己的接口文档。Spring Boot从入门到精通-集成swagger Spring Boot从入门到精通-mybatis多数据源

您的关注是我最大的动力

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot从入门到精通-使用WebFlux进行响应式编程(1)

    例如,在以往的编程方式中,定义了一个变量a=b+c。b和c在以后的程序中发生了变化,但是a的值却还是开始的值;但是在响应式编程中a的值却依然可以根据b和c进行改...

    我的小熊不见了丶
  • 使用docker-compose对分布式docker项目进行统一部署

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。如果你的项目中已经有很多docker启...

    我的小熊不见了丶
  • Spring Boot实战-使用WebFlux进行响应式编程(2)

    以上代码使用Map完成了关于用户的增删改查操作。这也是我们在项目中运用最多的操作。如果只是想要在完成时给出完成信号,就可以使用 Mono<Void>。 接下来...

    我的小熊不见了丶
  • python自学第三节课(笔记)

    被缩进的内容(print()函数)和if条件语句组成了一个代码块(一个整体),成为了if条件下的内部命令。

    小老鼠
  • 推荐系统之FM与MF傻傻分不清楚

    之前分享过一篇关于围绕LR周边模型展开的文章,主要前向回顾了它与Linear Regression的关系,后向介绍了它与Softmax Regression以及...

    张小磊
  • Flutter中http请求抓包的完美解决方案

    前阵子有同学反馈Flutter中的http请求无法通过fiddler抓包,作者喜欢使用Charles抓包工具,于是抽时间写了个小demo测试了一下,结论是在手机...

    砸漏
  • 2058 括号序列

    2058 括号序列  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果 题目描述 Descript...

    attack
  • 人工智能促进Web开发的五种方法

    Web开发是一个不断变化的领域。用户一直在寻找丰富的体验和个性化的内容。最终,他们想要的是能够提供高度定制的用户体验的智能web应用程序。然而,这对于web开发...

    liuxuewen
  • 腾讯云一口气发布四大新品,云原生时代真的来了!

    6月25日,在上海召开的KubeCon 2019大会上,腾讯云正式发布了多款云原生技术产品:企业级容器服务平台TKE、容器服务网格TKE Mesh、Server...

    腾讯云serverless团队
  • SimpleCommand框架ImageLoader API详解(三)

    将ImageLoader停止,一般在Activity停止,或者任务结束时调用此方法将其关闭

    砸漏

扫码关注云+社区

领取腾讯云代金券