准备工作
创建数据库
创建数据库以及表
创建数据库并设置字符集为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>