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

赣州网站建设江西网站建设互联网推广属于什么行业

赣州网站建设江西网站建设,互联网推广属于什么行业,世界知名外贸网站,网站后台登陆代码目录 一、分页插件 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、例9:Query - 需求同例8

2、例10:Update - 需求同例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(){//创建分页参数Page<User> pageParam = new Page<>(1,5);//执行分页查询userMapper.selectPage(pageParam, null);//查看分页参数的成员System.out.println(pageParam);}
}

二、XML自定义分页

1、UserMapper中定义接口方法

/*** 查询 : 根据年龄查询用户列表,分页显示** @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位* @param age 年龄* @return 分页对象*/
IPage<User> selectPageByPage(Page<?> page, Integer age);

2、定义XML

<select id="selectPageByPage" resultType="com.atguigu.mybatisplus.entity.User">SELECT <include refid="Base_Column_List"/> FROM user WHERE age > #{age}
</select>

3、测试

@Test
public void testSelectPageVo(){Page<User> pageParam = new Page<>(1,5);userMapper.selectPageByPage(pageParam, 18);List<User> users = pageParam.getRecords();users.forEach(System.out::println);
}

三、乐观锁

1、场景

一件商品,成本价是80元,售价是100元。老板先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,老板觉得商品价格增加到150元,价格太高,可能会影响销量。又通知小王,你把商品价格降低30元。

此时,小李和小王同时操作商品后台系统。小李操作的时候,系统先取出商品价格100元;小王也在操作,取出的商品价格也是100元。小李将价格加了50元,并将100+50=150元存入了数据库;小王将商品减了30元,并将100-30=70元存入了数据库。是的,如果没有锁,小李的操作就完全被小王的覆盖了。

现在商品价格是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 BaseMapper<Product> {}

step4:测试

@Resource
private ProductMapper productMapper;@Test
public void testConcurrentUpdate() {//1、小李Product p1 = productMapper.selectById(1L);//2、小王Product p2 = productMapper.selectById(1L);//3、小李将价格加了50元,存入了数据库 100+50=150p1.setPrice(p1.getPrice() + 50);int result1 = productMapper.updateById(p1);System.out.println("小李修改结果:" + result1);//4、小王将商品减了30元,存入了数据库 100-30=70覆盖了小李的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 id=1
  • 更新时,version + 1,如果where语句中的version版本不对,则更新失败
UPDATE product SET price=price+50, `version`=`version` + 1 WHERE id=1 AND `version`=1
接下来介绍如何在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中我们可以使用通用Mapper(BaseMapper)实现基本查询,也可以使用自定义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且小于等于20,email不为空的用户

@Test
public void test1() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name","n").between("age", 10, 20) // 大于等于10小于等于20.isNotNull("email");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

2、例2:组装排序条件

按年龄降序查询用户,如果年龄相同则按id升序排列

@Test
public void test2() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("age").orderByAsc("id");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

3、例3:组装删除条件

删除email为空的用户

@Test
public void test3() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("email");int result = userMapper.delete(queryWrapper); //条件构造器也可以构建删除语句的条件System.out.println("delete return count = " + result);
}

4、例4:条件的优先级

查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com

@Test
public void test4() {//修改条件QueryWrapper<User> 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("user@atguigu.com");int result = userMapper.update(user, queryWrapper);System.out.println(result);
}

5、例5:组装select子句

查询所有用户的用户名和年龄

@Test
public void test5() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name", "age");//selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为nullList<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表maps.forEach(System.out::println);
}

6、例6:实现子查询

查询id不大于3的所有用户的id列表
@Test
public void test6() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.inSql("id", "select id from user where id <= 3");//selectObjs的使用场景:只返回一列List<Object> 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,邮箱设置为 user@atguigu.com

@Test
public void test7() {//组装set子句UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.set("age", 18).set("email", "user@atguigu.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;QueryWrapper<User> 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);}List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写

@Test
public void test8Condition() {//定义查询条件,有可能为null(用户未输入)String name = null;Integer ageBegin = 10;Integer ageEnd = 20;QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like(StringUtils.isNotBlank(name), "name", "n").ge(ageBegin != null, "age", ageBegin).le(ageEnd != null, "age", ageEnd);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

八、LambdaXxxWrapper

1、例9:Query - 需求同例8

@Test
public void test9() {//定义查询条件,有可能为null(用户未输入)String name = null;Integer ageBegin = 10;Integer ageEnd = 20;LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper//避免使用字符串表示字段,防止运行时错误.like(StringUtils.isNotBlank(name), User::getName, "n").ge(ageBegin != null, User::getAge, ageBegin).le(ageEnd != null, User::getAge, ageEnd);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

2、例10:Update - 需求同例4

@Test
public void test10() {//组装set子句LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.set(User::getAge, 18).set(User::getEmail, "user@atguigu.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.yayakq.cn/news/925283/

相关文章:

  • 模板建站3000是不是贵了wordpress 写作
  • ps怎么做网站特效诀窍的网站
  • 展览设计网站有哪些静态网站怎么容易做
  • 广州市住房和城乡建设厅网站关键词排名查询
  • 域名注册网站源码o2o网站设计
  • 网站建设需要哪些工具云南网络推广seo代理公司
  • 新乡建设公司网站盐城网站建设培训班
  • 网站开发价格多少追天网站建设 优帮云
  • 自动发广告的软件新建的网站怎么做seo优化
  • logo做ppt模板下载网站元氏网站建设
  • 网站开发教程收费版永久云服务器
  • 河南平台网站建设设计合肥建网站公司地址
  • 手机网站建站用哪个软件好免费地方门户网站系统
  • 企业网站有哪些举例优化推广什么意思
  • seo零基础视频教程网站seo批量查询工具
  • 电子商务网站建设服务网站优化外包顾问
  • 福建省高速公路建设管理网站212200扬中论坛
  • 深圳做微商网站制作做网站需要切图吗
  • 文学网站建设做网站编辑要会什么
  • 网站备案号查电话号码贸易公司网站建设
  • 做阀门的网站旅游网站建设的方法
  • 网站搭建流程图国内十大景观设计公司
  • 外贸企业网站建设vue做的网站
  • 江阴市住房和城乡建设局网站建立网站后台
  • 网站建设属于什么科目wordpress 3.4漏洞
  • 网站的域名做邮箱吗网站开发运营新人要注意什么
  • 网站建设中主页源码微信公众号里怎么做网站
  • 利用python做网站photoshop教程
  • 网站定制哪家安全专业图书商城网站建设
  • 定制企业网站建设制作网站风格模板