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在简化项目开发以及实现自动化配置的基础上,对关系型数据库和非关系型数据库的访问操作都提供了非常好的整合支持。 Spring Boot默认采用整合SpringData的方式统一处理数据访问层,通过添加大量自动配置,引入各

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

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

    2024年02月15日
    浏览(65)
  • Spring Boot 整合MyBatis(超详细)

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

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

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

    2024年01月24日
    浏览(51)
  • 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-Plus

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

    2024年01月19日
    浏览(56)
  • Spring Boot 整合MyBatis-Plus

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

    2024年02月11日
    浏览(56)
  • Spring Boot整合Mybatis配置多数据源

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

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

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

    2024年03月12日
    浏览(57)
  • 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日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包