当前位置: 首页 > news >正文

上海网站建设域名设计外贸商城网站建设

上海网站建设域名,设计外贸商城网站建设,医疗设计网站建设,wordpress阿里云邮箱MyBatis-plus 是一款 Mybatis 增强工具#xff0c;用于简化开发#xff0c;提高效率。下文使用缩写 mp来简化表示 MyBatis-plus#xff0c;本文主要介绍 mp 整合 Spring Boot 的使用。 (5条消息) mybatis-plus用法#xff08;二#xff09;_渣娃工程师的博客-CSDN博客 1…MyBatis-plus 是一款 Mybatis 增强工具用于简化开发提高效率。下文使用缩写 mp来简化表示 MyBatis-plus本文主要介绍 mp 整合 Spring Boot 的使用。 (5条消息) mybatis-plus用法二_渣娃工程师的博客-CSDN博客 1.创建一个Spring Boot项目。 2.导入依赖 !-- pom.xml -- ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.3.4.RELEASE/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdmybatis-plus/artifactId version0.0.1-SNAPSHOT/version namemybatis-plus/name properties java.version1.8/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.4.2/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project 3.配置数据库 # application.yml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/yogurt?serverTimezoneAsia/Shanghai username: root password: root mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启SQL语句打印 4.创建一个实体类 package com.example.mp.po; import lombok.Data; import java.time.LocalDateTime; Data public class User { private Long id; private String name; private Integer age; private String email; private Long managerId; private LocalDateTime createTime; } 5.创建一个mapper接口 package com.example.mp.mappers; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mp.po.User; public interface UserMapper extends BaseMapperUser { } 6.在SpringBoot启动类上配置mapper接口的扫描路径 package com.example.mp; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconp.SpringBootApplication; SpringBootApplication MapperScan(com.example.mp.mappers) public class MybatisPlusApplication { public static void main(String[] args) { SpringApplication.run(MybatisPlusApplication.class, args); } } 7.在数据库中创建表 DROP TABLE IF EXISTS user; CREATE TABLE user ( id BIGINT(20) PRIMARY KEY NOT NULL COMMENT 主键, name VARCHAR(30) DEFAULT NULL COMMENT 姓名, age INT(11) DEFAULT NULL COMMENT 年龄, email VARCHAR(50) DEFAULT NULL COMMENT 邮箱, manager_id BIGINT(20) DEFAULT NULL COMMENT 直属上级id, create_time DATETIME DEFAULT NULL COMMENT 创建时间, CONSTRAINT manager_fk FOREIGN KEY(manager_id) REFERENCES user (id) ) ENGINEINNODB CHARSETUTF8; INSERT INTO user (id, name, age ,email, manager_id, create_time) VALUES (1, 大BOSS, 40, bossbaomidou.com, NULL, 2021-03-22 09:48:00), (2, 李经理, 40, bossbaomidou.com, 1, 2021-01-22 09:48:00), (3, 黄主管, 40, bossbaomidou.com, 2, 2021-01-22 09:48:00), (4, 吴组长, 40, bossbaomidou.com, 2, 2021-02-22 09:48:00), (5, 小菜, 40, bossbaomidou.com, 2, 2021-02-22 09:48:00) 8.编写一个SpringBoot测试类 package com.example.mp; import com.example.mp.mappers.UserMapper; import com.example.mp.po.User; 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.util.List; import static org.junit.Assert.*; RunWith(SpringRunner.class) SpringBootTest public class SampleTest { Autowired private UserMapper mapper; Test public void testSelect() { ListUser list mapper.selectList(null); assertEquals(5, list.size()); list.forEach(System.out::println); } } 准备工作完成数据库情况如下 项目目录如下 运行测试类 可以看到针对单表的基本CRUD操作只需要创建好实体类并创建一个继承自BaseMapper的接口即可可谓非常简洁。并且我们注意到User类中的managerIdcreateTime属性自动和数据库表中的manager_idcreate_time对应了起来这是因为mp自动做了数据库下划线命名到Java类的驼峰命名之间的转化。 注解 mp一共提供了8个注解这些注解是用在Java的实体类上面的。 TableName 注解在类上指定类和数据库表的映射关系。实体类的类名转成小写后和数据库表名相同时可以不指定该注解。 TableId 注解在实体类的某一字段上表示这个字段对应数据库表的主键。当主键名为id时表中列名为id实体类中字段名为id无需使用该注解显式指定主键mp会自动关联。若类的字段名和表的列名不一致可用value属性指定表的列名。另这个注解有个重要的属性type用于指定主键策略。 TableField 注解在某一字段上指定Java实体类的字段和数据库表的列的映射关系。这个注解有如下几个应用场景。 排除非表字段 若Java实体类中某个字段不对应表中的任何列它只是用于保存一些额外的或组装后的数据则可以设置exist属性为false这样在对实体对象进行插入时会忽略这个字段。排除非表字段也可以通过其他方式完成如使用static或transient关键字但个人觉得不是很合理不做赘述 字段验证策略 通过insertStrategyupdateStrategywhereStrategy属性进行配置可以控制在实体对象进行插入更新或作为WHERE条件时对象中的字段要如何组装到SQL语句中。 字段填充策略 通过fill属性指定字段为空时会进行自动填充 Version 乐观锁注解 EnumValue 注解在枚举字段上 TableLogic 逻辑删除 KeySequence 序列主键策略oracle InterceptorIgnore 插件过滤规则 CRUD接口 mp封装了一些最基础的CRUD方法只需要直接继承mp提供的接口无需编写任何SQL即可食用。mp提供了两套接口分别是Mapper CRUD接口和Service CRUD接口。并且mp还提供了条件构造器Wrapper可以方便地组装SQL语句中的WHERE条件。 Mapper CRUD接口 只需定义好实体类然后创建一个接口继承mp提供的BaseMapper即可食用。mp会在mybatis启动时自动解析实体类和表的映射关系并注入带有通用CRUD方法的mapper。BaseMapper里提供的方法部分列举如下 insert(T entity)  插入一条记录 deleteById(Serializable id)  根据主键id删除一条记录 delete(WrapperT wrapper) 根据条件构造器wrapper进行删除 selectById(Serializable id) 根据主键id进行查找 selectBatchIds(Collection idList) 根据主键id进行批量查找 selectByMap(MapString,Object map) 根据map中指定的列名和列值进行等值匹配查找 selectMaps(WrapperT wrapper)  根据 wrapper 条件查询记录将查询结果封装为一个MapMap的key为结果的列value为值 selectList(WrapperT wrapper) 根据条件构造器wrapper进行查询 update(T entity, WrapperT wrapper) 根据条件构造器wrapper进行更新 updateById(T entity) ... 下面讲解几个比较特别的方法 selectMaps BaseMapper接口还提供了一个selectMaps方法这个方法会将查询结果封装为一个MapMap的key为结果的列value为值 该方法的使用场景如下 只查部分列 当某个表的列特别多而SELECT的时候只需要选取个别列查询出的结果也没必要封装成Java实体类对象时只查部分列时封装成实体后实体对象中的很多属性会是null则可以用selectMaps获取到指定的列后再自行进行处理即可 比如 Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); wrapper.select(id,name,email).likeRight(name,黄); ListMapString, Object maps userMapper.selectMaps(wrapper); maps.forEach(System.out::println); } 进行数据统计 比如 // 按照直属上级进行分组查询每组的平均年龄最大年龄最小年龄 /** select avg(age) avg_age ,min(age) min_age, max(age) max_age from user group by manager_id having sum(age) 500; **/ Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); wrapper.select(manager_id, avg(age) avg_age, min(age) min_age, max(age) max_age) .groupBy(manager_id).having(sum(age) {0}, 500); ListMapString, Object maps userMapper.selectMaps(wrapper); maps.forEach(System.out::println); } selectObjs 只会返回第一个字段第一列的值其他字段会被舍弃 比如 Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); wrapper.select(id, name).like(name, 黄); ListObject objects userMapper.selectObjs(wrapper); objects.forEach(System.out::println); } 得到的结果只封装了第一列的id selectCount 查询满足条件的总数注意使用这个方法不能调用QueryWrapper的select方法设置要查询的列了。这个方法会自动添加select count(1) 比如 Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); wrapper.like(name, 黄); Integer count userMapper.selectCount(wrapper); System.out.println(count); } Service CRUD 接口 另外一套CRUD是Service层的只需要编写一个接口继承IService并创建一个接口实现类即可食用。这个接口提供的CRUD方法和Mapper接口提供的功能大同小异比较明显的区别在于IService支持了更多的批量化操作如saveBatchsaveOrUpdateBatch等方法。 食用示例如下 1.首先新建一个接口继承IService package com.example.mp.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.mp.po.User; public interface UserService extends IServiceUser { } 2.创建这个接口的实现类并继承ServiceImpl最后打上Service注解注册到Spring容器中即可食用 package com.example.mp.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.mp.mappers.UserMapper; import com.example.mp.po.User; import com.example.mp.service.UserService; import org.springframework.stereotype.Service; Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { } 3.测试代码 package com.example.mp; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.example.mp.po.User; import com.example.mp.service.UserService; 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; RunWith(SpringRunner.class) SpringBootTest public class ServiceTest { Autowired private UserService userService; Test public void testGetOne() { LambdaQueryWrapperUser wrapper Wrappers.UserlambdaQuery(); wrapper.gt(User::getAge, 28); User one userService.getOne(wrapper, false); // 第二参数指定为false,使得在查到了多行记录时,不抛出异常,而返回第一条记录 System.out.println(one); } } 4.结果 另IService也支持链式调用代码写起来非常简洁查询示例如下 Test public void testChain() { ListUser list userService.lambdaQuery() .gt(User::getAge, 39) .likeRight(User::getName, 王) .list(); list.forEach(System.out::println); } 更新示例如下 Test public void testChain() { userService.lambdaUpdate() .gt(User::getAge, 39) .likeRight(User::getName, 王) .set(User::getEmail, w39baomidou.com) .update(); } 删除示例如下 Test public void testChain() { userService.lambdaUpdate() .like(User::getName, 青蛙) .remove(); } 条件构造器 mp让我觉得极其方便的一点在于其提供了强大的条件构造器Wrapper可以非常方便的构造WHERE条件。条件构造器主要涉及到3个类AbstractWrapper。QueryWrapperUpdateWrapper它们的类关系如下 在AbstractWrapper中提供了非常多的方法用于构建WHERE条件而QueryWrapper针对SELECT语句提供了select()方法可自定义需要查询的列而UpdateWrapper针对UPDATE语句提供了set()方法用于构造set语句。条件构造器也支持lambda表达式写起来非常舒爽。 下面对AbstractWrapper中用于构建SQL语句中的WHERE条件的方法进行部分列举 eqequals等于 allEqall equals全等于 nenot equals不等于 gtgreater than 大于  gegreater than or equals大于等于≥ ltless than小于 leless than or equals小于等于≤ between相当于SQL中的BETWEEN notBetween like模糊匹配。like(name,黄)相当于SQL的name like %黄% likeRight模糊匹配右半边。likeRight(name,黄)相当于SQL的name like 黄% likeLeft模糊匹配左半边。likeLeft(name,黄)相当于SQL的name like %黄 notLikenotLike(name,黄)相当于SQL的name not like %黄% isNull isNotNull in andSQL连接符AND orSQL连接符OR apply用于拼接SQL该方法可用于数据库函数并可以动态传参 ....... 使用示例 下面通过一些具体的案例来练习条件构造器的使用。使用前文创建的user表 // 案例先展示需要完成的SQL语句后展示Wrapper的写法 // 1. 名字中包含佳且年龄小于25 // SELECT * FROM user WHERE name like %佳% AND age 25 QueryWrapperUser wrapper new QueryWrapper(); wrapper.like(name, 佳).lt(age, 25); ListUser users userMapper.selectList(wrapper); // 下面展示SQL时仅展示WHERE条件展示代码时, 仅展示Wrapper构建部分 // 2. 姓名为黄姓且年龄大于等于20小于等于40且email字段不为空 // name like 黄% AND age BETWEEN 20 AND 40 AND email is not null wrapper.likeRight(name,黄).between(age, 20, 40).isNotNull(email); // 3. 姓名为黄姓或者年龄大于等于40按照年龄降序排列年龄相同则按照id升序排列 // name like 黄% OR age 40 order by age desc, id asc wrapper.likeRight(name,黄).or().ge(age,40).orderByDesc(age).orderByAsc(id); // 4.创建日期为2021年3月22日并且直属上级的名字为李姓 // date_format(create_time,%Y-%m-%d) 2021-03-22 AND manager_id IN (SELECT id FROM user WHERE name like 李%) wrapper.apply(date_format(create_time, %Y-%m-%d) {0}, 2021-03-22) // 建议采用{index}这种方式动态传参, 可防止SQL注入 .inSql(manager_id, SELECT id FROM user WHERE name like 李%); // 上面的apply, 也可以直接使用下面这种方式做字符串拼接但当这个日期是一个外部参数时这种方式有SQL注入的风险 wrapper.apply(date_format(create_time, %Y-%m-%d) 2021-03-22); // 5. 名字为王姓并且年龄小于40或者邮箱不为空 // name like 王% AND (age 40 OR email is not null) wrapper.likeRight(name, 王).and(q - q.lt(age, 40).or().isNotNull(email)); // 6. 名字为王姓或者年龄小于40并且年龄大于20并且邮箱不为空 // name like 王% OR (age 40 AND age 20 AND email is not null) wrapper.likeRight(name, 王).or( q - q.lt(age,40) .gt(age,20) .isNotNull(email) ); // 7. (年龄小于40或者邮箱不为空) 并且名字为王姓 // (age 40 OR email is not null) AND name like 王% wrapper.nested(q - q.lt(age, 40).or().isNotNull(email)) .likeRight(name, 王); // 8. 年龄为30313435 // age IN (30,31,34,35) wrapper.in(age, Arrays.asList(30,31,34,35)); // 或 wrapper.inSql(age,30,31,34,35); // 9. 年龄为30313435, 返回满足条件的第一条记录 // age IN (30,31,34,35) LIMIT 1 wrapper.in(age, Arrays.asList(30,31,34,35)).last(LIMIT 1); // 10. 只选出id, name 列 (QueryWrapper 特有) // SELECT id, name FROM user; wrapper.select(id, name); // 11. 选出id, name, age, email, 等同于排除 manager_id 和 create_time // 当列特别多, 而只需要排除个别列时, 采用上面的方式可能需要写很多个列, 可以采用重载的select方法指定需要排除的列 wrapper.select(User.class, info - { String columnName info.getColumn(); return !create_time.equals(columnName) !manager_id.equals(columnName); }); Condition 条件构造器的诸多方法中均可以指定一个boolean类型的参数condition用来决定该条件是否加入最后生成的WHERE语句中比如 String name 黄; // 假设name变量是一个外部传入的参数 QueryWrapperUser wrapper new QueryWrapper(); wrapper.like(StringUtils.hasText(name), name, name); // 仅当 StringUtils.hasText(name) 为 true 时, 会拼接这个like语句到WHERE中 // 其实就是对下面代码的简化 if (StringUtils.hasText(name)) { wrapper.like(name, name); } 实体对象作为条件 调用构造函数创建一个Wrapper对象时可以传入一个实体对象。后续使用这个Wrapper时会以实体对象中的非空属性构建WHERE条件默认构建等值匹配的WHERE条件这个行为可以通过实体类里各个字段上的TableField注解中的condition属性进行改变 示例如下 Test public void test3() { User user new User(); user.setName(黄主管); user.setAge(28); QueryWrapperUser wrapper new QueryWrapper(user); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 执行结果如下。可以看到是根据实体对象中的非空属性进行了等值匹配查询。 若希望针对某些属性改变等值匹配的行为则可以在实体类中用TableField注解进行配置示例如下 package com.example.mp.po; import com.baomidou.mybatisplus.annotation.SqlCondition; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.time.LocalDateTime; Data public class User { private Long id; TableField(condition SqlCondition.LIKE) // 配置该字段使用like进行拼接 private String name; private Integer age; private String email; private Long managerId; private LocalDateTime createTime; } 运行下面的测试代码 Test public void test3() { User user new User(); user.setName(黄); QueryWrapperUser wrapper new QueryWrapper(user); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 从下图得到的结果来看对于实体对象中的name字段采用了like进行拼接 TableField中配置的condition属性实则是一个字符串SqlCondition类中预定义了一些字符串以供选择 package com.baomidou.mybatisplus.annotation; public class SqlCondition { //下面的字符串中, %s 是占位符, 第一个 %s 是列名, 第二个 %s 是列的值 public static final String EQUAL %s#{%s}; public static final String NOT_EQUAL %slt;gt;#{%s}; public static final String LIKE %s LIKE CONCAT(%%,#{%s},%%); public static final String LIKE_LEFT %s LIKE CONCAT(%%,#{%s}); public static final String LIKE_RIGHT %s LIKE CONCAT(#{%s},%%); } SqlCondition中提供的配置比较有限当我们需要或等拼接方式则需要自己定义。比如 package com.example.mp.po; import com.baomidou.mybatisplus.annotation.SqlCondition; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.time.LocalDateTime; Data public class User { private Long id; TableField(condition SqlCondition.LIKE) private String name; TableField(condition %s gt; #{%s}) // 这里相当于大于, 其中 gt; 是字符实体 private Integer age; private String email; private Long managerId; private LocalDateTime createTime; } 测试如下 Test public void test3() { User user new User(); user.setName(黄); user.setAge(30); QueryWrapperUser wrapper new QueryWrapper(user); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 从下图得到的结果可以看出name属性是用like拼接的而age属性是用拼接的 allEq方法 allEq方法传入一个map用来做等值匹配 Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); MapString, Object param new HashMap(); param.put(age, 40); param.put(name, 黄飞飞); wrapper.allEq(param); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 当allEq方法传入的Map中有value为null的元素时默认会设置为is null Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); MapString, Object param new HashMap(); param.put(age, 40); param.put(name, null); wrapper.allEq(param); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 若想忽略map中value为null的元素可以在调用allEq时设置参数boolean null2IsNull为false Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); MapString, Object param new HashMap(); param.put(age, 40); param.put(name, null); wrapper.allEq(param, false); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 若想要在执行allEq时过滤掉Map中的某些元素可以调用allEq的重载方法allEq(BiPredicateR, V filter, MapR, V params) Test public void test3() { QueryWrapperUser wrapper new QueryWrapper(); MapString, Object param new HashMap(); param.put(age, 40); param.put(name, 黄飞飞); wrapper.allEq((k,v) - !name.equals(k), param); // 过滤掉map中key为name的元素 ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } lambda条件构造器 lambda条件构造器支持lambda表达式可以不必像普通条件构造器一样以字符串形式指定列名它可以直接以实体类的方法引用来指定列。示例如下 Test public void testLambda() { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.like(User::getName, 黄).lt(User::getAge, 30); ListUser users userMapper.selectList(wrapper); users.forEach(System.out::println); } 像普通的条件构造器列名是用字符串的形式指定无法在编译期进行列名合法性的检查这就不如lambda条件构造器来的优雅。 另外还有个链式lambda条件构造器使用示例如下 Test public void testLambda() { LambdaQueryChainWrapperUser chainWrapper new LambdaQueryChainWrapper(userMapper); ListUser users chainWrapper.like(User::getName, 黄).gt(User::getAge, 30).list(); users.forEach(System.out::println); } 更新操作 上面介绍的都是查询操作,现在来讲更新和删除操作。 BaseMapper中提供了2个更新方法 updateById(T entity) 根据入参entity的id主键进行更新对于entity中非空的属性会出现在UPDATE语句的SET后面即entity中非空的属性会被更新到数据库示例如下 RunWith(SpringRunner.class) SpringBootTest public class UpdateTest { Autowired private UserMapper userMapper; Test public void testUpdate() { User user new User(); user.setId(2L); user.setAge(18); userMapper.updateById(user); } } update(T entity, WrapperT wrapper) 根据实体entity和条件构造器wrapper进行更新示例如下 Test public void testUpdate2() { User user new User(); user.setName(王三蛋); LambdaUpdateWrapperUser wrapper new LambdaUpdateWrapper(); wrapper.between(User::getAge, 26,31).likeRight(User::getName,吴); userMapper.update(user, wrapper); } 额外演示一下把实体对象传入Wrapper即用实体对象构造WHERE条件的案例 Test public void testUpdate3() { User whereUser new User(); whereUser.setAge(40); whereUser.setName(王); LambdaUpdateWrapperUser wrapper new LambdaUpdateWrapper(whereUser); User user new User(); user.setEmail(sharebaomidou.com); user.setManagerId(10L); userMapper.update(user, wrapper); } 注意到我们的User类中对name属性和age属性进行了如下的设置 Data public class User { private Long id; TableField(condition SqlCondition.LIKE) private String name; TableField(condition %s gt; #{%s}) private Integer age; private String email; private Long managerId; private LocalDateTime createTime; } 执行结果 再额外演示一下链式lambda条件构造器的使用 Test public void testUpdate5() { LambdaUpdateChainWrapperUser wrapper new LambdaUpdateChainWrapper(userMapper); wrapper.likeRight(User::getEmail, share) .like(User::getName, 飞飞) .set(User::getEmail, ffbaomidou.com) .update(); } 反思 由于BaseMapper提供的2个更新方法都是传入一个实体对象去执行更新这在需要更新的列比较多时还好若想要更新的只有那么一列或者两列则创建一个实体对象就显得有点麻烦。针对这种情况UpdateWrapper提供有set方法可以手动拼接SQL中的SET语句此时可以不必传入实体对象示例如下 Test public void testUpdate4() { LambdaUpdateWrapperUser wrapper new LambdaUpdateWrapper(); wrapper.likeRight(User::getEmail, share).set(User::getManagerId, 9L); userMapper.update(null, wrapper); } 删除操作 BaseMapper一共提供了如下几个用于删除的方法 deleteById  根据主键id进行删除 deleteBatchIds  根据主键id进行批量删除 deleteByMap  根据Map进行删除Map中的key为列名value为值根据列和值进行等值匹配 delete(WrapperT wrapper)  根据条件构造器Wrapper进行删除 与前面查询和更新的操作大同小异不做赘述 自定义SQL 当mp提供的方法还不能满足需求时则可以自定义SQL。 原生mybatis 示例如下 注解方式 package com.example.mp.mappers; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mp.po.User; import org.apache.ibatis.annotations.Select; import java.util.List; /** * Author yogurtzzz * Date 2021/3/18 11:21 **/ public interface UserMapper extends BaseMapperUser { Select(select * from user) ListUser selectRaw(); } xml方式 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mp.mappers.UserMapper select idselectRaw resultTypecom.example.mp.po.User SELECT * FROM user /select /mapper package com.example.mp.mappers; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mp.po.User; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper extends BaseMapperUser { ListUser selectRaw(); } 使用xml时若xml文件与mapper接口文件不在同一目录下则需要在application.yml中配置mapper.xml的存放路径 mybatis-plus: mapper-locations: /mappers/* 若有多个地方存放mapper则用数组形式进行配置 mybatis-plus: mapper-locations: - /mappers/* - /com/example/mp/* 测试代码如下 Test public void testCustomRawSql() { ListUser users userMapper.selectRaw(); users.forEach(System.out::println); } 结果 mybatis-plus 也可以使用mp提供的Wrapper条件构造器来自定义SQL 示例如下 注解方式 package com.example.mp.mappers; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.example.mp.po.User; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper extends BaseMapperUser { // SQL中不写WHERE关键字且固定使用${ew.customSqlSegment} Select(select * from user ${ew.customSqlSegment}) ListUser findAll(Param(Constants.WRAPPER)WrapperUser wrapper); } xml方式 package com.example.mp.mappers; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mp.po.User; import java.util.List; public interface UserMapper extends BaseMapperUser { ListUser findAll(WrapperUser wrapper); } !-- UserMapper.xml -- ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mp.mappers.UserMapper select idfindAll resultTypecom.example.mp.po.User SELECT * FROM user ${ew.customSqlSegment} /select /mapper 分页查询 BaseMapper中提供了2个方法进行分页查询分别是selectPage和selectMapsPage前者会将查询的结果封装成Java实体对象后者会封装成MapString,Object。分页查询的食用示例如下 1. 创建mp的分页拦截器注册到Spring容器中 package com.example.mp.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class MybatisPlusConfig { /** 新版mp **/ Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } /** 旧版mp 用 PaginationInterceptor **/ } 2. 执行分页查询 Test public void testPage() { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.ge(User::getAge, 28); // 设置分页信息, 查第3页, 每页2条数据 PageUser page new Page(3, 2); // 执行分页查询 PageUser userPage userMapper.selectPage(page, wrapper); System.out.println(总记录数 userPage.getTotal()); System.out.println(总页数 userPage.getPages()); System.out.println(当前页码 userPage.getCurrent()); // 获取分页查询结果 ListUser records userPage.getRecords(); records.forEach(System.out::println); } 3. 结果 4. 其他 注意到分页查询总共发出了2次SQL一次查总记录数一次查具体数据。若希望不查总记录数仅查分页结果。可以通过Page的重载构造函数指定isSearchCount为false即可 public Page(long current, long size, boolean isSearchCount)在实际开发中可能遇到多表联查的场景此时BaseMapper中提供的单表分页查询的方法无法满足需求需要自定义SQL示例如下使用单表查询的SQL进行演示实际进行多表联查时修改SQL语句即可 1. 在mapper接口中定义一个函数接收一个Page对象为参数并编写自定义SQL // 这里采用纯注解方式。当然若SQL比较复杂建议还是采用XML的方式   Select(SELECT * FROM user ${ew.customSqlSegment})   PageUser selectUserPage(PageUser page, Param(Constants.WRAPPER) WrapperUser wrapper);2. 执行查询 Test   public void testPage2() {  LambdaQueryWrapperUser wrapper  new LambdaQueryWrapper();  wrapper.ge(User::getAge, 28).likeRight(User::getName, 王);  PageUser page  new Page(3,2);  PageUser userPage  userMapper.selectUserPage(page, wrapper);  System.out.println(总记录数    userPage.getTotal());  System.out.println(总页数    userPage.getPages());  userPage.getRecords().forEach(System.out::println);   }3. 结果
http://www.hkea.cn/news/14467175/

相关文章:

  • 创建网站英文天元建设集团有限公司天元天筑网
  • 苏州规划建设局网站网站建设外包注意什么
  • 怎么做网站的主页面搜索建站网
  • 东莞清溪镇做网站公司塘厦房价
  • 怎么进入网站后台图片wordpress小说自动采集
  • 网站的优点和缺点做电影网站主机放哪比较好
  • 网站seo优化总结婚礼效果图怎么制作
  • 无锡网站开发平台专业网站开发培训
  • 如何做好品牌网站建设策划国际外贸平台排名
  • 电子商务网站建设重点微信推广
  • 河南新站关键词排名优化外包什么叫高端网站定制
  • 网站内容架构抖音seo什么意思
  • wordpress 功能插件站长工具seo查询5g5g
  • 受欢迎的永州网站建设没有微信怎么进入公众号
  • 商务网站建设试卷可画在线设计平台
  • 花都区建设网站网上110在线咨询
  • 关于网站设计的职业wordpress头像解决
  • 手机wap网站cms源码科技有限公司网站建设策划书
  • 哪些网站可以做微课网站建设这个工作怎么样
  • 深圳网站建设排名网站建设的基本思路
  • 南通住房和城乡建设厅网站公众号入口官网
  • 网站建设四端一体百度云怎么做网站
  • 现在网站建设用什么语言网站建设优化工资高不
  • 广州招聘网网站开发wordpress调图片大小
  • 学做会计账的网站网站受到攻击怎么办
  • 百度网站建设技术网站招聘顾问做啥的
  • 个人手机版网站app怎么做广东东莞人才招聘网
  • 养生网站建设免费版面设计的目的是什么
  • 简单的购物网站开发淮北矿业工程建设公司网站
  • 马关住房和城乡建设局网站成都网站建设 城