电子商务网站建设与管理读书心得,wordpress2345,网页界面设计的参考文献,产品外观设计案例目录
一、分页插件
1、添加配置类
2、添加分页插件
3、测试分页
二、XML自定义分页
1、UserMapper中定义接口方法
2、定义XML
3、测试
三、乐观锁
1、场景
2、乐观锁方案
3、乐观锁实现流程
4、优化流程
四、wapper介绍
1、Wrapper家族
2、创建测试类
五、Qu…目录
一、分页插件
1、添加配置类
2、添加分页插件
3、测试分页
二、XML自定义分页
1、UserMapper中定义接口方法
2、定义XML
3、测试
三、乐观锁
1、场景
2、乐观锁方案
3、乐观锁实现流程
4、优化流程
四、wapper介绍
1、Wrapper家族
2、创建测试类
五、QueryWrapper
1、例1组装查询条件
2、例2组装排序条件
3、例3组装删除条件
4、例4条件的优先级
5、例5组装select子句
6、例6实现子查询
六、UpdateWrapper
例7需求同例4
七、condition
例8动态组装查询条件
八、LambdaXxxWrapper
1、例9Query - 需求同例8
2、例10Update - 需求同例4 Mybatis-Plus快速入门尚融宝02-mybatisplus复习尚融宝03-mybatisplus基本CRUD和注解
一、分页插件
MyBatis Plus自带分页插件只要简单的配置即可实现分页功能
1、添加配置类
创建config包创建MybatisPlusConfig类
package com.atguigu.mybatisplus.config;Configuration
MapperScan(com.atguigu.mybatisplus.mapper) //可以将主类中的注解移到此处
public class MybatisPlusConfig {}
2、添加分页插件
配置类中添加Bean配置
Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;
}
3、测试分页
创建类InterceptorTests
package com.atguigu.mybatisplus;SpringBootTest
public class InterceptorTests {Resourceprivate UserMapper userMapper;Testpublic void testSelectPage(){//创建分页参数PageUser pageParam new Page(1,5);//执行分页查询userMapper.selectPage(pageParam, null);//查看分页参数的成员System.out.println(pageParam);}
}
二、XML自定义分页
1、UserMapper中定义接口方法
/*** 查询 : 根据年龄查询用户列表分页显示** param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位* param age 年龄* return 分页对象*/
IPageUser selectPageByPage(Page? page, Integer age);
2、定义XML
select idselectPageByPage resultTypecom.atguigu.mybatisplus.entity.UserSELECT include refidBase_Column_List/ FROM user WHERE age #{age}
/select
3、测试
Test
public void testSelectPageVo(){PageUser pageParam new Page(1,5);userMapper.selectPageByPage(pageParam, 18);ListUser users pageParam.getRecords();users.forEach(System.out::println);
}
三、乐观锁
1、场景
一件商品成本价是80元售价是100元。老板先是通知小李说你去把商品价格增加50元。小李正在玩游戏耽搁了一个小时。正好一个小时后老板觉得商品价格增加到150元价格太高可能会影响销量。又通知小王你把商品价格降低30元。
此时小李和小王同时操作商品后台系统。小李操作的时候系统先取出商品价格100元小王也在操作取出的商品价格也是100元。小李将价格加了50元并将10050150元存入了数据库小王将商品减了30元并将100-3070元存入了数据库。是的如果没有锁小李的操作就完全被小王的覆盖了。
现在商品价格是70元比成本价低10元。几分钟后这个商品很快出售了1千多件商品老板亏1万多。
接下来将我们演示这一过程
step1数据库中增加商品表
CREATE TABLE product
(id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,name VARCHAR(30) NULL DEFAULT NULL COMMENT 商品名称,price INT(11) DEFAULT 0 COMMENT 价格,version INT(11) DEFAULT 0 COMMENT 乐观锁版本号,PRIMARY KEY (id)
);INSERT INTO product (id, NAME, price) VALUES (1, 笔记本, 100);
step2创建实体类
package com.atguigu.mybatisplus.entity;
Data
public class Product {private Long id;private String name;private Integer price;private Integer version;
}
step3创建Mapper
package com.atguigu.mybatisplus.mapper;public interface ProductMapper extends BaseMapperProduct {}
step4测试
Resource
private ProductMapper productMapper;Test
public void testConcurrentUpdate() {//1、小李Product p1 productMapper.selectById(1L);//2、小王Product p2 productMapper.selectById(1L);//3、小李将价格加了50元存入了数据库 10050150p1.setPrice(p1.getPrice() 50);int result1 productMapper.updateById(p1);System.out.println(小李修改结果 result1);//4、小王将商品减了30元存入了数据库 100-3070覆盖了小李的150p2.setPrice(p2.getPrice() - 30);int result2 productMapper.updateById(p2);System.out.println(小王修改结果 result2);//最后的结果Product p3 productMapper.selectById(1L);System.out.println(最后的结果 p3.getPrice());
} 2、乐观锁方案 数据库中添加version字段取出记录时获取当前version SELECT id,name,price,version FROM product WHERE id1 更新时version 1如果where语句中的version版本不对则更新失败 UPDATE product SET priceprice50, versionversion 1 WHERE id1 AND version1 接下来介绍如何在Mybatis-Plus项目中使用乐观锁 3、乐观锁实现流程 step1修改实体类 在version字段上添加 Version 注解 Version
private Integer version; step2添加乐观锁插件 Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//乐观锁interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;
}step3重新执行测试 小王的修改失败 4、优化流程 失败后重试 if(result2 0){//更新失败重试System.out.println(小王重试);//重新获取数据p2 productMapper.selectById(1L);//更新p2.setPrice(p2.getPrice() - 30);productMapper.updateById(p2);
} 四、wapper介绍 1、Wrapper家族 在MP中我们可以使用通用MapperBaseMapper实现基本查询也可以使用自定义Mapper自定义XML来实现更高级的查询。当然你也可以结合条件构造器来方便的实现更多的高级查询。 Wrapper 条件构造抽象类最顶端父类 AbstractWrapper 用于查询条件封装生成 sql 的 where 条件 QueryWrapper 查询条件封装 UpdateWrapper Update 条件封装 AbstractLambdaWrapper 使用Lambda 语法 LambdaQueryWrapper 用于Lambda语法使用的查询Wrapper LambdaUpdateWrapper Lambda 更新封装Wrapper 2、创建测试类 SpringBootTest
public class WrapperTests {Resourceprivate UserMapper userMapper;
} 五、QueryWrapper 1、例1组装查询条件 查询名字中包含n年龄大于等于10且小于等于20email不为空的用户 Test
public void test1() {QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.like(name,n).between(age, 10, 20) // 大于等于10小于等于20.isNotNull(email);ListUser users userMapper.selectList(queryWrapper);users.forEach(System.out::println);
} 2、例2组装排序条件 按年龄降序查询用户如果年龄相同则按id升序排列 Test
public void test2() {QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.orderByDesc(age).orderByAsc(id);ListUser users userMapper.selectList(queryWrapper);users.forEach(System.out::println);
} 3、例3组装删除条件 删除email为空的用户 Test
public void test3() {QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.isNull(email);int result userMapper.delete(queryWrapper); //条件构造器也可以构建删除语句的条件System.out.println(delete return count result);
} 4、例4条件的优先级 查询名字中包含n且年龄小于18或email为空的用户并将这些用户的年龄设置为18邮箱设置为 useratguigu.com Test
public void test4() {//修改条件QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.like(name, n).and(i - i.lt(age, 18).or().isNull(email)); //lambda表达式内的逻辑优先运算User user new User();user.setAge(18);user.setEmail(useratguigu.com);int result userMapper.update(user, queryWrapper);System.out.println(result);
} 5、例5组装select子句 查询所有用户的用户名和年龄 Test
public void test5() {QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.select(name, age);//selectMaps()返回Map集合列表通常配合select()使用避免User对象中没有被查询到的列值为nullListMapString, Object maps userMapper.selectMaps(queryWrapper);//返回值是Map列表maps.forEach(System.out::println);
} 6、例6实现子查询 查询id不大于3的所有用户的id列表 Test
public void test6() {QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.inSql(id, select id from user where id 3);//selectObjs的使用场景只返回一列ListObject objects userMapper.selectObjs(queryWrapper);//返回值是Object列表objects.forEach(System.out::println);
} 但上面的方式容易引发sql注入即最后添加一个true使得条件永真 // 或插叙出所有用户id
queryWrapper.inSql(id, select id from user where id 3 or true); 可是使用下面的查询方式替换 queryWrapper.in(id, 1, 2, 3 );
// 或
queryWrapper.le(id, 3 ); 六、UpdateWrapper 例7需求同例4 查询名字中包含n且年龄小于18或email为空的用户并将这些用户的年龄设置为18邮箱设置为 useratguigu.com Test
public void test7() {//组装set子句UpdateWrapperUser updateWrapper new UpdateWrapper();updateWrapper.set(age, 18).set(email, useratguigu.com).like(name, n).and(i - i.lt(age, 18).or().isNull(email)); //lambda表达式内的逻辑优先运算//这里必须要创建User对象否则无法应用自动填充。如果没有自动填充可以设置为nullUser user new User();int result userMapper.update(user, updateWrapper);System.out.println(result);
} updatewrapper有set方法 七、condition 例8动态组装查询条件 查询名字中包含n年龄大于10且小于20的用户查询条件来源于用户输入是可选的 Test
public void test8() {//定义查询条件有可能为null用户未输入String name null;Integer ageBegin 10;Integer ageEnd 20;QueryWrapperUser queryWrapper new QueryWrapper();if(StringUtils.isNotBlank(name)){queryWrapper.like(name,n);}if(ageBegin ! null){queryWrapper.ge(age, ageBegin);}if(ageEnd ! null){queryWrapper.le(age, ageEnd);}ListUser users userMapper.selectList(queryWrapper);users.forEach(System.out::println);
} 上面的实现方案没有问题但是代码比较复杂我们可以使用带condition参数的重载方法构建查询条件简化代码的编写 Test
public void test8Condition() {//定义查询条件有可能为null用户未输入String name null;Integer ageBegin 10;Integer ageEnd 20;QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.like(StringUtils.isNotBlank(name), name, n).ge(ageBegin ! null, age, ageBegin).le(ageEnd ! null, age, ageEnd);ListUser users userMapper.selectList(queryWrapper);users.forEach(System.out::println);
} 八、LambdaXxxWrapper 1、例9Query - 需求同例8 Test
public void test9() {//定义查询条件有可能为null用户未输入String name null;Integer ageBegin 10;Integer ageEnd 20;LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();queryWrapper//避免使用字符串表示字段防止运行时错误.like(StringUtils.isNotBlank(name), User::getName, n).ge(ageBegin ! null, User::getAge, ageBegin).le(ageEnd ! null, User::getAge, ageEnd);ListUser users userMapper.selectList(queryWrapper);users.forEach(System.out::println);
} 2、例10Update - 需求同例4 Test
public void test10() {//组装set子句LambdaUpdateWrapperUser updateWrapper new LambdaUpdateWrapper();updateWrapper.set(User::getAge, 18).set(User::getEmail, useratguigu.com).like(User::getName, n).and(i - i.lt(User::getAge, 18).or().isNull(User::getEmail)); //lambda表达式内的逻辑优先运算User user new User();int result userMapper.update(user, updateWrapper);System.out.println(result);
}
文章转载自: http://www.morning.jfqpc.cn.gov.cn.jfqpc.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.lcqrf.cn.gov.cn.lcqrf.cn http://www.morning.jqswf.cn.gov.cn.jqswf.cn http://www.morning.mbbgk.com.gov.cn.mbbgk.com http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.sxcwc.cn.gov.cn.sxcwc.cn http://www.morning.pfgln.cn.gov.cn.pfgln.cn http://www.morning.kgsws.cn.gov.cn.kgsws.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.hrkth.cn.gov.cn.hrkth.cn http://www.morning.dhtdl.cn.gov.cn.dhtdl.cn http://www.morning.amonr.com.gov.cn.amonr.com http://www.morning.hflrz.cn.gov.cn.hflrz.cn http://www.morning.fengnue.com.gov.cn.fengnue.com http://www.morning.jthjr.cn.gov.cn.jthjr.cn http://www.morning.kjksn.cn.gov.cn.kjksn.cn http://www.morning.zmyhn.cn.gov.cn.zmyhn.cn http://www.morning.qxxj.cn.gov.cn.qxxj.cn http://www.morning.wrkcw.cn.gov.cn.wrkcw.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.mxhcf.cn.gov.cn.mxhcf.cn http://www.morning.fyxtn.cn.gov.cn.fyxtn.cn http://www.morning.llqky.cn.gov.cn.llqky.cn http://www.morning.kryn.cn.gov.cn.kryn.cn http://www.morning.qbnfc.cn.gov.cn.qbnfc.cn http://www.morning.bwqcx.cn.gov.cn.bwqcx.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn http://www.morning.lwwnq.cn.gov.cn.lwwnq.cn http://www.morning.sfdsn.cn.gov.cn.sfdsn.cn http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.bxgpy.cn.gov.cn.bxgpy.cn http://www.morning.xznrk.cn.gov.cn.xznrk.cn http://www.morning.qfmcm.cn.gov.cn.qfmcm.cn http://www.morning.txgjx.cn.gov.cn.txgjx.cn http://www.morning.junyaod.com.gov.cn.junyaod.com http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.kndyz.cn.gov.cn.kndyz.cn http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn http://www.morning.zsyqg.cn.gov.cn.zsyqg.cn http://www.morning.kmrgl.cn.gov.cn.kmrgl.cn http://www.morning.wwsgl.com.gov.cn.wwsgl.com http://www.morning.trlhc.cn.gov.cn.trlhc.cn http://www.morning.hwljx.cn.gov.cn.hwljx.cn http://www.morning.rfyff.cn.gov.cn.rfyff.cn http://www.morning.rysmn.cn.gov.cn.rysmn.cn http://www.morning.pfnlc.cn.gov.cn.pfnlc.cn http://www.morning.gqddl.cn.gov.cn.gqddl.cn http://www.morning.mwrxz.cn.gov.cn.mwrxz.cn http://www.morning.mqxrx.cn.gov.cn.mqxrx.cn http://www.morning.mzhh.cn.gov.cn.mzhh.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.lstmq.cn.gov.cn.lstmq.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.qwmsq.cn.gov.cn.qwmsq.cn http://www.morning.ygkk.cn.gov.cn.ygkk.cn http://www.morning.ngkng.cn.gov.cn.ngkng.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.jycr.cn.gov.cn.jycr.cn http://www.morning.hengqilan.cn.gov.cn.hengqilan.cn http://www.morning.fewhope.com.gov.cn.fewhope.com http://www.morning.jxjrm.cn.gov.cn.jxjrm.cn http://www.morning.jfjfk.cn.gov.cn.jfjfk.cn http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn http://www.morning.wptrm.cn.gov.cn.wptrm.cn http://www.morning.ndcjq.cn.gov.cn.ndcjq.cn http://www.morning.cqyhdy.cn.gov.cn.cqyhdy.cn http://www.morning.gqddl.cn.gov.cn.gqddl.cn http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn http://www.morning.qmwzz.cn.gov.cn.qmwzz.cn http://www.morning.nfks.cn.gov.cn.nfks.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.cwwbm.cn.gov.cn.cwwbm.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.fnfhs.cn.gov.cn.fnfhs.cn http://www.morning.dbqg.cn.gov.cn.dbqg.cn http://www.morning.cpqwb.cn.gov.cn.cpqwb.cn http://www.morning.rxnxl.cn.gov.cn.rxnxl.cn