mybaits-plus学习笔记整合(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mybaits-plus学习笔记整合

准备工作


创建数据库


创建数据库以及表


创建数据库并设置字符集为utf-8:


CREATE DATABASE `mp` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';


创建表和测试数据:


--
-- 表的结构 `tb_user`
--
CREATE TABLE IF NOT EXISTS `tb_user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(20) NOT NULL COMMENT '密码',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `birthday` datetime DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
--
-- 表中的数据 `tb_user`
--
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`, `birthday`) VALUES
(1, 'zhangsan', '123456', '张三', 18, 'test1@yyl.cn', '2022-03-09 00:00:00'),
(2, 'lisi', '123456', '李四', 20, 'test2@yyl.cn', '2022-03-09 00:00:00'),
(3, 'wangwu', '123456', '王五', 28, 'test3@yyl.cn', '2022-03-09 00:00:00'),
(4, 'zhaoliu', '123456', '赵六', 21, 'test4@yyl.cn', '2022-03-09 00:00:00'),
(5, 'sunqi', '123456', '孙七', 24, 'test5@yyl.cn', '2022-03-09 00:00:00');


工程搭建


工程结构



创建工程


创建maven工程,分别填写GroupId ArtifactId和Version,如下:


<groupId>cn.yyl.mp</groupId>
<artifactId>yyl-mp-springboot</artifactId>
<version>1.0-SNAPSHOT</version>


导入依赖


导入maven依赖,由于本例采用Spring boot技术,使用mybatis-plus-boot-starter能与其便捷集成: 版本规划:


Spring boot: 2.1.3.RELEASE 
mybatis-plus: 3.1.0


pom文件如下:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--简化代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    </dependencies>
</project>


编写application.properties


spring.application.name = yyl-mp-springboot
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# Logger Config
logging.level.root: debug


编写pojo


package cn.yyl.mp.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.time.LocalDateTime;
/**
 * @author Administrator
 * @version 1.0
 **/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
    @TableId(value = "id",type= IdType.ID_WORKER)//指定主键的字段名
    private Long id;
    @TableField("user_name")//指定对应字段名
    private String userName;
  @TableField("PASSWORD")
    private String password;
    @TableField("NAME")
    private String name;
    @TableField("AGE")
    private Integer age;
    @TableField("EMAIL")
    private String email;
    @TableField("BIRTHDAY")
    private LocalDateTime birthday;
}


注解说明:


lomlok:
  @Data:lombok的注解,使用它可以省略getter/setter方法。 
  @NoArgsConstructor: 生成无参构造 方法 
  @AllArgsConstructor:生成所有参数构造 方法,参数顺序与属性定义顺序一致。 
mybaits-plus:
  @TableName:指定表名
  @TableId:指定主键名
  @TableField:指定列名


编写mapper


package cn.yyl.mp.mapper;
import cn.yyl.mp.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * Created by Administrator.
 */
public interface UserMapper extends BaseMapper<User> {
}


该mapper类继承mybatisplus中的BaseMapper类


BaseMapper类中有一些常用的数据库查询方法,使用Base类之外的查询方法可以自己手动配置xml实现:


//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface BaseMapper<T> {
    int insert(T entity);
    int deleteById(Serializable id);
    int deleteByMap(@Param("cm") Map<String, Object> columnMap);
    int delete(@Param("ew") Wrapper<T> wrapper);
    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    int updateById(@Param("et") T entity);
    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
    T selectById(Serializable id);
    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
    T selectOne(@Param("ew") Wrapper<T> queryWrapper);
    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
    IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}


编写启动类


package cn.yyl.mp;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @author Administrator
 * @version 1.0
 **/
@SpringBootApplication
@MapperScan("cn.yyl.mp.mapper")  //设置mapper接口的扫描包
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class,args);
    }
}


注解说明:


@SpringBootApplication springboot启动入口标识
@MapperScan("cn.yyl.mp.mapper") mapper接口的扫描包


测试


编写测试用例


编写UserMapper的测试用例 ,使用UserMapper查询用户列表。


在test下创建测试类,包名为 cn.yyl.mp。


package cn.itcast.mp;
import cn.itcast.mp.mapper.UserMapper;
import cn.itcast.mp.pojo.User;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
/**
 * @author Administrator
 * @version 1.0
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
    @Autowired
    UserMapper userMapper;
    x
    @Test
    public void testSelect(){
        //查询tb_user记录
        List<User> users = userMapper.selectList(null);
        System.out.println(users.toString());
    }
}


运行测试



[
 User(id=1, userName=zhangsan, password=123456, name=张三, age=18, email=test1@itcast.cn, birthday=2022-03-09T00:00),
 User(id=2, userName=lisi, password=123456, name=李四, age=20, email=test2@itcast.cn, birthday=2022-03-09T00:00), 
 User(id=3, userName=wangwu, password=123456, name=王五, age=28, email=test3@itcast.cn, birthday=2022-03-09T00:00), 
 User(id=4, userName=zhaoliu, password=123456, name=赵六, age=21, email=test4@itcast.cn, birthday=2022-03-09T00:00), 
 User(id=5, userName=sunqi, password=123456, name=孙七, age=24, email=test5@itcast.cn, birthday=2022-03-09T00:00)
]


mybaitsplus常见配置


在MP中有大量的配置,其中有一部分是Mybatis原生的配置,另一部分是MP的配置,详情请看官网的文档: https://baomidou.com/pages/56bac0/


下面我们对常用的配置做讲解。


configLocations


configLocations即MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。 MyBatis Configuration 的具体内容请参考MyBatis 官方文档


示例: 1 在resources下创建mybatis-config.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--mapUnderscoreToCamelCase=true-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--<plugins>-->
    <!--<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></plugin>-->
    <!--</plugins>-->
</configuration>


在application.properties下配置configLocations,如下:


#指定mybatis-config.xml的位置
mybatis-plus.config-location = classpath:mybatis/mybatis-config.xml



mapperLocations


#指定mapper文件位置
mybatis-plus.mapper-locations = classpath*:mybatis/mapper/*.xml


mapperLocations即MyBatis Mapper 所对应的 mapper配置 文件位置,如果您在 Mapper 中有自定义方法 (XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。


如果不配置mapperLocations时,mapper的xml文件存放路径需要和mapper class文件保持一致,文件名保持 一 致,如下:(还是配置好一些)



mapper.xml代码案例


新建UserMapper.xml:


可以将此文件放在resources/cn/itcast/mp/mapper下,这里我们直接放到mybatis/mapper/UserMapper.xml下,然后进行配置


#指定mapper文件位置
mybatis-plus.mapper-locations = classpath*:mybatis/mapper/*.xml


在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="cn.itcast.mp.mapper.UserMapper">
    <select id="findById" resultType="user" parameterType="java.lang.Long">
      select * from tb_user where id = #{id}
    </select>
</mapper>


在UserMapper接口类中新增findById方法


package cn.itcast.mp.mapper;
import cn.itcast.mp.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * Created by Administrator.
 */
public interface UserMapper extends BaseMapper<User> {
    public User findById(Long id);
}


在测试类中添加查找id 的方法


代码如下:


@Test
public void testFindByid(){
    //查询tb_user记录
    User user = userMapper.findById(2L);
    System.out.println(user.toString());
}


运行结果:



注意:Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)


typeAliasesPackage


设置MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以 直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)


mybatis‐plus.type‐aliases‐package = cn.itcast.mp.pojo


mapUnderscoreToCamelCase


类型: boolean


默认值: true


是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。


注意: 在 MyBatis-Plus 中此属性默认值为true,用于生成最终的 SQL 语句 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名


#开启自动驼峰映射
#mybatis-plus.configuration.map-underscore-to-camel-case=true


注意:配置configuration.map-underscore-to-camel-case则不能配置config-location


那么配置了config-location,在想配置mapUnderscoreToCamelCase 怎么办呢?


    <settings>
        <!--mapUnderscoreToCamelCase=true-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>


就可以了


开启了自动转驼峰, 我们就可以屏蔽@TableField了,



再进行测试,没有问题




如果项目中有符合驼峰规则的定义也有不符合的,此时建议统一使用@TableField。

如果使用mybatis-config.xml的同时在application.properties配置mybatis-plus.configuration则报错


Property 'configuration' and 'configLocation' can not specified with together 


解决方法: 只使用一种配置方法。


本案例屏蔽mybatis-plus.configuration.map-underscore-to-camel-case=true,在mybatis-config.xml中配置 settings。


<settings> 
  <setting name="mapUnderscoreToCamelCase" value="true"/> 
</settings>
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL Java 数据库连接
MyBatis 优秀的持久层框架(一)
MyBatis 优秀的持久层框架
182 0
|
6月前
|
SQL Java 数据库连接
持久层框架(Mybatis)
持久层框架(Mybatis)
|
3月前
|
SQL 缓存 Java
mybaits 面试题总结(上)
MyBatis 是一款半 ORM 框架,简化了 JDBC 的繁琐操作,让开发者专注于 SQL 语句编写。它支持 XML 或注解配置,能将 POJO 映射至数据库记录,提供动态 SQL 功能。相比 JDBC,它大幅减少冗余代码,提升数据库兼容性,并与 Spring 融合良好。
34 1
|
6月前
|
SQL 缓存 Java
持久层框架MyBatis
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的操作。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
71 11
|
6月前
|
SQL Java 数据库连接
什么是MyBatis持久层框架?
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 对象) 映射成数据库中的记录。
173 5
|
6月前
|
SQL 缓存 Java
MyBatis 优秀的持久层框架(二)
MyBatis 优秀的持久层框架
78 0
|
6月前
|
SQL Java 数据库连接
JDBC如何封装成Mybaits持久层框架只需4
本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。
33 0
|
SQL XML Java
Mybatis框架使用的学习
在沃尔玛项目中的Mybatis框架使用了两种实现CRUD的模式,为Dao文件编写相应的xml实现功能与直接在Dao的方法中直接使用注解开发
53 1
|
数据库
Mybaits-plus
pom文件 连接数据库yaml代码 创建pojo类 分页查询
92 0
|
SQL XML Java
自定义持久层框架—MyORMFramework(一)
自定义持久层框架—MyORMFramework(一)
135 1