SpringBoot 整合 MyBatisPlus

这篇具有很好参考价值的文章主要介绍了SpringBoot 整合 MyBatisPlus。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、整合 MyBatisPlus

1. 导入依赖

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.5.1</version>
</dependency>

2. 配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: root

mybatis-plus:
  # 指定 Mapper XML 文件的位置,使用 classpath 通配符指定路径
  mapper-locations: classpath:/mapper/**/*.xml
  # 指定实体类的包路径,用于自动扫描并注册类型别名
  type-aliases-package: com.cnbai.bean
  global-config:
    db-config:
      id-type: input
      # 驼峰下划线转换(将数据库字段的下划线命名规则转换为 Java 实体类属性的驼峰命名规则)
      db-column-underline: true
      # 刷新 mapper
      refresh-mapper: true
  configuration:
    # 将 Java 实体类属性的驼峰命名规则转换为数据库字段的下划线命名规则
    map-underscore-to-camel-case: true
    # 查询结果中包含空值的列,在映射的时候,不会映射这个字段
    call-setters-on-nulls: true
    # 开启 sql 日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 关闭 sql 日志
    # log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

3. 配置类

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class MybatisPlusConfig {

    /**
     * 加载分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    @Primary
    @Bean
    @ConfigurationProperties("mybatis-plus")
    public MybatisPlusProperties mybatisPlusProperties() {
        return new MybatisPlusProperties();
    }
}

4. 业务类

public interface UserService extends IService<User> {}

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {}

@Mapper
public interface UserDao extends BaseMapper<User> {}

5. 实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;

import java.io.Serializable;

@TableName(value = "t_user")
public class User implements Serializable {

    @TableId(value = "id", type = IdType.INPUT)
    private Integer id;
    
    @TableField(value = "name")
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

二、查询

1. 普通查询

public List<User> queryUserList(String name) {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(User::getName, name);
    return list(wrapper);
}

public User queryUserById(String id) {
    return getBaseMapper().selectById(id);
}

2. 拼接查询

 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
 queryWrapper
        .eq(User::getName, "张三")
        .eq(User::getAge, 26);
 List<User> list = list(queryWrapper);

3. 分页查询

// offset 默认从 1 开始,展示第一页
public Page<User> queryPage(Integer offset, Integer limit) {
    return userDao.selectPage(PageDTO.of(offset, limit), new QueryWrapper<>());
}

4. 查询部分字段

public List<User> queryUserList() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.select(User::getName, User::getAge);
    return list(wrapper);
}

三、常用条件构造器

1. 单条件

# name = 'bai'
eq("name", "bai")

2. 拼接 AND

# name = ? AND age = ?
.eq("name", "张三").eq("age", 26);

3. 拼接 OR

# id = 1 or name = 'bai'
.eq("id",1).or().eq("name","bai")

4. 嵌套

# or ( name = '李白' and status <> '活着' )
.or ( x -> x.eq("name", "李白").ne("status", "活着") )

# and (  name = '李白' or ( name = '张三' and age = 12 )  )
.and(  x -> x.eq("name", "李白").or( y -> y.eq("name", "张三").eq("age", 12) )  )

四、注解查询

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserDao extends BaseMapper<User> {

    @Select("select * from t_user where name = #{name}")
    @ResultType(User.class)
    List<User> getUserListByName(@Param("name") String name);

    @Select("select * from t_user where id = #{id}")
    @ResultType(User.class)
    User getUserById(@Param("id") String id);
    
    @Select("select name from t_user where id = #{id}")
    String getUserNameById(@Param("id") String id);
}

五、xml 查询

1. 直接返回查询结果

List<Map<String,Object>> queryUser();
<?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.bai.dao.UserDao">

  <select id="queryUser" resultType="java.util.Map">
    select * from user
  </select>
  
</mapper>

2. 返回对象集合

List<User> queryUser();
<?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.bai.dao.UserDao">

  <select id="queryUser" resultType="User">
    select * from user
  </select>
  
</mapper>

3. 返回单个对象

User queryUserById();
<?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.bai.dao.UserDao">
 
  <select id="queryUserById" resultType="User">
    select * from user where id = '1'
  </select>
  
</mapper>

4. 返回整型

int queryUserCount();
<?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.bai.dao.UserDao">
  
  <select id="queryUserCount" resultType="java.lang.Integer">
    select count(*) from user
  </select>
  
</mapper>

5. 返回字符串集合

List<String> queryUserName();
<?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.bai.dao.UserDao">

  <resultMap id="userNameMap" type="java.lang.String">
    <result column="name" typeHandler="org.apache.ibatis.type.StringTypeHandler" />
  </resultMap>
  
  <select id="queryUserName" resultMap="userNameMap">
    select name from user
  </select>
  
</mapper>

六、处理 Json 数据

1. 存储

实体类中某个字段属性是 List,Map 之类的可以转为 Json 格式,其在 MySQL 中存储字段类型可以设置为 Json 类型,添加注解将此类型映射为 Json 存入数据库中

注:插入时可以不定义 autoResultMap = true,查询时必须定义

@TableName(value = "t_user")
public class User {
    @TableId
    private int id;

    @TableField(value = "user_info", typeHandler = JacksonTypeHandler.class)
    private JSONArray userInfo;

    @TableField(value = "info", typeHandler = JacksonTypeHandler.class)
    private JSONObject info;
}

2. 取出

当没有使用到 xml 时

@TableName(value = "t_user", autoResultMap = true)
public class User {
    @TableId
    private int id;

    @TableField(value = "user_info", typeHandler = JacksonTypeHandler.class)
    private JSONArray userInfo;

    @TableField(value = "info", typeHandler = JacksonTypeHandler.class)
    private JSONObject info;
}

当使用了 xml 时

<result property="userInfo" column="user_info" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<result property="info" column="info" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>

七、循环遍历集合

/**
 * List : User(id=1, name=zhangsan, age=21)
 * List : User(id=2, name=lisi, age=22)
 *
 * Map : User(id=2, name=lisi, age=22)
 * Map : User(id=3, name=wangwu, age=23)
 */
public void queryTest() {
    userService.queryByList();
    userService.queryByMap();
    userService.updateByMap();
    userService.updateByList();
}

1. UserService

public class UserService {

    @Resource
    UserDao userDao;

    public void queryByList() {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        userDao.queryByList(list);
    }

    public void queryByMap() {
        Map<String, Object> map = new HashMap<>();
        map.put("name", username);
        userDao.queryByMap(map);
    }

    public void updateByMap() {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(2, 21);
        map.put(3, 31);
        userDao.updateByMap(map);
    }

    public void updateByList() {
        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        userDao.updateByList(list);
    }
}

2. UserDao

public interface UserDao extends BaseMapper<User> {

    // UserMapper.xml 中 collection 的值对应 @Param 里的值
    List<User> queryByList(@Param("list") List<Integer> userList);

    // 此处不能使用 @Param , 或者不用 Map 直接传参 -> queryByMap(@Param("name") String username);
    List<Map<String, Object>> queryByMap(Map<String, Object> map);

    void updateByMap(@Param("map") Map<Integer, Integer> map);
    
    void updateByList(@Param("list") List<User> userList);
}

3. UserMapper

<?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.bai.dao.UserDao">
  
  <resultMap id="userMap" type="User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="age" jdbcType="INTEGER" property="age" />
  </resultMap>

  <select id="queryByList" parameterType="java.util.List" resultMap="userMap">
    select * from user where
    <choose>
      <when test="list != null and list.size() > 0">
        id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
      		#{id}
    		</foreach>
      </when>
      <otherwise>
        1 = 2
      </otherwise>
    </choose>
  </select>

  <select id="queryByMap" parameterType="java.util.Map" resultType="java.util.Map">
    select id, name as username, age from user where
    <if test="name != null and name != ''">
      name = #{name}
    </if>
  </select>

  <update id="updateByMap" parameterType="java.util.Map">
    <foreach collection="map" index="id" item="age" separator=";">
      update user set age = #{age} where id = #{id}
    </foreach>
  </update>
  
  <update id="updateByList" parameterType="java.util.List">
    <foreach collection="list" index="index" item="user">
      update user set age = #{user.age} where id = #{user.id}
    </foreach>
  </update>
</mapper>

4. 增加配置参数

Mybatis 批量更新时需要在 url 后加上 &allowMultiQueries=true
application.yml

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
    driver-class-name: com.mysql.jdbc.Driver

否则会报错文章来源地址https://www.toymoban.com/news/detail-767879.html

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'update user set age = 1 where id = 3' at line 3
### The error may involve com.bai.faker.mapper.UserMapper.updateByMapThree-Inline
### The error occurred while setting parameters
### SQL: update user set age = ? where id = ?      ;        update user set age = ? where id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'update user set age = 1 where id = 3' at line 3
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'update user set age = 1 where id = 3' at line 3
... ...

八、执行 Sql 文件

1. UserService

import com.baomidou.mybatisplus.extension.service.IService;

import javax.sql.DataSource;
import java.io.File;

public interface UserService extends IService<User> {
    void executeSqlFile(DataSource dataSource, File sqlFile);
}

2. UserServiceImpl

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

    @Override
    public void executeSqlFile(DataSource dataSource, File sqlFile) {
        Connection connection = null;
        FileReader reader = null;
        Statement statement = null;
        try {
            connection = dataSource.getConnection();
            connection.setAutoCommit(false);
            statement = connection.createStatement();

            reader = new FileReader(sqlFile);
            String line;
            int size = 0;
            BufferedReader bufferedReader = new BufferedReader(reader);
            while ((line = bufferedReader.readLine()) != null) {
                if (size % 1000 == 0) {
                    statement.executeBatch();
                    connection.commit();
                }
                statement.addBatch(line);
                size++;
            }
            statement.executeBatch();
            connection.commit();
            bufferedReader.close();
        } catch (Exception e) {
            if (connection != null) {
                try {
                    connection.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
                if (reader != null) {
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

到了这里,关于SpringBoot 整合 MyBatisPlus的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 整合 Mybatis

    导入依赖的时候,需要根据自己所使用的Spring Boot和MySQL的版本而定。 我这里使用的是MySQL数据库。 首先创建一个mybatis_learn的数据库。然后创建一个student的表。 对应的,要实现一个Java的实体类,来对应数据库的表。 创建如图结构的各个包和文件。 这个接口是对应Mybatis的

    2024年02月03日
    浏览(53)
  • 【Spring Boot整合MyBatis教程】

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成

    2024年02月15日
    浏览(65)
  • 在Spring Boot中整合MyBatis

    第1步:添加依赖: 在pom.xml文件中添加MyBatis和MySQL JDBC驱动的依赖。如果你使用的是Maven,配置如下: 第2步:配置数据源 DataSource: 在application.properties或application.yml文件中配置数据库连接信息: 第3步:(可选)配置MyBatis全局配置文件: 如果你需要自定义MyBatis的全局配置,

    2024年01月24日
    浏览(52)
  • Spring Boot 整合MyBatis(超详细)

    😀前言 本篇博文关于Spring Boot 整合MyBatis,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰 如果文章

    2024年02月11日
    浏览(44)
  • Spring Boot 整合MyBatis-Plus

    😀前言 本篇博文是关于Spring Boot 整合MyBatis-Plus的,希望你能够喜欢😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰

    2024年02月11日
    浏览(58)
  • Spring Boot整合MyBatis-Plus

    引言 在现代软件开发中,我们经常需要处理大量的数据。为了有效地管理这些数据,我们需要使用一些强大的框架。其中,Spring Boot和MyBatis-Plus是两个非常流行的框架。Spring Boot是一个基于Spring的开源Java框架,可以用于创建独立的、生产级别的Spring应用。MyBatis-Plus是一个MyB

    2024年01月19日
    浏览(58)
  • Spring Boot3整合MyBatis Plus

    目录 1.前置条件 2.导坐标 3.配置数据源 4.mybatis-plus基础配置 5.配置mapper扫描路径 6.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 7.整合Druid连接池 已经初始化好一个spring boot项目且版本为3X,项目可正常启动 初始化教程: 新版idea创建spring boot项目-CSDN博客 https://blog

    2024年01月23日
    浏览(49)
  • Spring Boot整合Mybatis配置多数据源

    在之前的事件管理系统博客中有提到动态的多数据源配置 工作中难免需要做几个工具方便自己偷懒,加上之前的挡板,数据源肯定没法单一配置,所以需要多数据源配置。这里介绍两种配置:动态数据源和固定数据源模式。这两种我在目前的工作的工具开发中都有用到。 M

    2024年01月23日
    浏览(72)
  • spring boot3整合mybatis-plus

    添加依赖 配置属性信息 编写业务逻辑测试代码 配置mybatis-plus分页插件 配置mybatis-plus之属性自动填充 如图所示 1、添加依赖 2、配置属性 3、编写测试代码 4、XML文件 5、测试数据是否能走通

    2024年03月12日
    浏览(58)
  • Spring Boot中整合MyBatis(基于xml方式&基于注解实现方式)

    在Spring Boot中整合MyBatis时,你需要导入JDBC(不需要手动添加)、Druid的相关依赖、MySQL相关依赖。 JDBC依赖:在Spring Boot中整合MyBatis时,并不需要显式地添加JDBC的包依赖。这是因为,当你添加 mybatis-spring-boot-starter 依赖时,它已经包含了对JDBC的依赖。 mybatis-spring-boot-starter 是

    2024年02月15日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包