MyBatis-plus的介紹
MyBatis-plus是MyBatis的增強工具,在MyBatis的基礎上做出加強,只要MyBatis有的功能MyBatis-plus都有。
MyBatis-plus的上手
添加依賴
在我們創建項目的時候,我們需要添加MyBatis-plus和mysql的依賴
MyBatis-plus的依賴
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency>
Mysql的依賴?
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
配置數據庫
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml
首先我們創建UserInfo類
實體類中的屬性和表中的字段要一一對應。
@Data
@TableName("user_info")
public class UserInfo {@TableId("id" )private Integer id;@TableField("username")private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
編寫一個Mapper接口?
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
MyBatis-plus提供一個基礎的BaseMapper接口,已經實現了單表的增刪改查,我們自己的Mapper接口只需要繼承這個BaseMapper接口,就可以實現單表的增刪改查了
?
CRUD
我們來簡單的測試一下MyBatis-plus的CRUD
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid select() {userInfoMapper.selectById(1);}@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(12);userInfo.setPassword("5556666");userInfoMapper.updateById(userInfo);}@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setId(27);userInfo.setAge(3);userInfo.setPassword("3");userInfo.setUsername("123333");userInfoMapper.insert(userInfo);}@Testvoid delete() {userInfoMapper.deleteById(8);
}
?@TableName
修改實體類名UserInfo為Userinfo
我們可以用@TableName來標識實體類對應的表
@Data@TableName("user_info")public class Userinfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;}
?@TableField
修改屬性名deleteFlag為deleteflag
@TableField("delete_flag")private Integer deleteflag;
@TableId
修改屬性名id為userId
我們可以通過@TableId來指定對應的主鍵
@TableId("id")private Integer userId;
?
條件構造器
QueryWrapper
?于構造查詢條件,在AbstractWrapper的基礎上拓展了?個select?法,允許指定查詢字段,QueryWrapper并不只用于查詢語句,無論是修改,刪除,查詢都可以使用QueryWrapper來構造條件
Select
SELECT id,username,password,age FROM user_info WHERE age = 18 AND username
"%min%"
void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().select("username", "password", "id", "age").eq("age", 18).like("username", "min");List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);userInfos.forEach(x -> System.out.println(x));}
Update?
UPDATE user_info SET delete_flag=? WHERE age < 20
@Testvoid updateByCondition() {UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().lt("age", 20);userInfoMapper.update(userInfo, queryWrapper);}
Delete
DELETE FROM user_info WHERE age = 18
@Testvoid deleteByCondition(){QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>().eq("age",18);userInfoMapper.delete(queryWrapper);}
?UpdateWrapper
對于更新,我們也可以直接使?UpdateWrapper,在不創建實體對象的情況下,直接設置更新字段和條件
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
@Testvoid updateByCondition2(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().set("delete_flag",0).set("age",5).in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}
?
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
@Testvoid updateByCondition3(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().setSql("age=age+10").in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}
?LambdaQueryWrapper
?QueryWrapper和UpdateWrapper存在?個問題,就是需要寫死字段名,如果字段名發?變更,可能會 因為測試不到位釀成事故。
MyBatis-Plus 給我們提供了?種基于Lambda表達式的條件構造器,它通過Lambda表達式來引?實體類的屬性,從?避免了硬編碼字段名,也提?了代碼的可讀性和可維護性。
@Testvoid selectByLambdaCondition() {QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>();queryWrapper.lambda().select(UserInfo::getUsername,UserInfo::getPassword).eq(UserInfo::getAge,18);userInfoMapper.selectList(queryWrapper);}
?LambdaUpdateWrapper
@Testvoid updateByLambdaCondition(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>();updateWrapper.lambda().set(UserInfo::getUsername,"123").set(UserInfo::getAge,12).in(UserInfo::getId,List.of(1,2,3));userInfoMapper.update(updateWrapper);}
?
?定義SQL
在實際的開發中,MyBatis-plus提供的操作不能滿足我們的實際需求,MyBatis-plus也提供了自定義SQL的功能,我們可以用Wrapper構造查詢條件,結合Mapper編寫SQL
select id,username,password,age FROM user_info WHERE username = "admin"
@Select("select * from user_info ${ew.customSqlSegment}")List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)Wrapper wrapper);
@Testvoid testQueryUserByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);}
注:
參數命名:在?定義SQL時,傳遞Wrapper對象作為參數時,參數名必須為 ew 或者使?注解 ${ew.customSqlSegment},明確指定參數為Wrapper對象
使用 ${ew.customSqlSegment} :在SQL語句中,使? ${ew.customSqlSegment}來引?Wrapper對象?成的SQL?段.
不?持基于entity的where語句:?定義SQL時,Wrapper對象不會基于實體類?動?成 where?句,你需要?動編寫完整的SQL語句
MyBatis-plus也支持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.blame.mybatisplus.mapper.UserInfoMapper"><select id="queryUserByCustom2" resultType="com.blame.mybatisplus.model.UserInfo">select id,username,password,age FROM user_info ${ew.customSqlSegment}</select></mapper>
List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)Wrapper<UserInfo> wrapper);
@Testvoid testQueryUserByCustom2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);}
如果需要查看更多關于MyBatis-plus 的資料,點擊
簡介 | MyBatis-Plushttps://baomidou.com/introduce/?
希望能對大家有所幫助!!!!!