热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

P3Day03MyBatisPlus

1.Mybatis接口注解说明1.1需求说明Mybatis实现数据查询时有两种Sql写法​1.将所有的Sql语句都写到XML语句都写到xml映射文件中(万能操作方式)[外链图片转存




1.Mybatis 接口注解说明


1.1 需求说明

Mybatis实现数据查询时有两种Sql写法

​ 1.将所有的Sql语句都写到XML语句都写到xml映射文件中(万能操作方式)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNeWTNpm-1624682865935)(…/…/…/图片/资料Pcs/20210625092018252.png)]


  1. 可以将Sql语句通过注解的方式标识在接口方法中(只使用简单操作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhF4G2Kh-1624682865940)(…/…/…/图片/资料Pcs/2021062509243076.png)]


1.2 注解的种类

说明:该注解一般都是操作的数据查询,如果遇到关联查询/复杂Sql则使用Mapper映射文件的方式更加优化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBnr8iDP-1624682865945)(…/…/…/图片/资料Pcs/2021062509265292.png)]


1.3 Mybatis 案例练习


1.3.1 测试方法

@SpringBootTest
public class TestMybatis{
//明确:注入一定是对象
//SpringBoot为了整合mybatis,简化代码结构 Spring冬天的为Mybatis的接口
//创建代理对象
//代理:根据原有对象的模型,在运行期动态创建了一个一样的实例化对象
//案例:孙悟空(接口)/克隆一样的对象
@Autowied
private UserMapper userMapper;
@Test
publiv void testFind(){
System.out.println(userMapper.getClass());
List userList = userMapper.findAll();
System.out.println(userList);
}
//根据ID查询数据
@Test
public void findUserById(){
User user = userMapper.findUserById(11);
System.out.println(user);
}
//新增用户
//数据从哪来 前端动态获取
@Test
public void insert(){
User user = new User();
user.setName("新七五")。setSex("男").setAge(18);
userMapper.insert(user);
System.out.println("yes");
}
//将新七五的年龄改为20 心别改为女
@Test
public void update(){
User user = new User();
user.setAge(20).setSex("女").setName("新七五");
userMapper.updateByName(user);
}
}

1.3.2 Mapper接口文件写法

//@Mapper //Spring为改接口创建一个代理对象
public interface UserMapper{
//查询所有的user表数据
List findAll();
//注意事项:映射文件和注解二选一
@Select("select*from demo_user where id = #{id}")
//@Insert("") //新增时使用
//@Update("") //更新
//@Detele("") //删除
User findUserById(int id);
//#{name} 从对象中获取指定的属性的值,#有预编译的效果 防止Sql注入攻击
@Insert("insert into demo_user(id,name,age,sex) value (null,#{name},#{age},#{sex})")
void insert(User user);
@Update("update demo_user set age=#{age},sex=#{sex} where name=#{name}")
void updateByName(User user);
}

2. MybatisPlus


2.1 MP介绍

说明:MyBatis-Plus(opens new window)(简称MP)是一个MyBatis(open new window)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9IONty8-1624682865950)(…/…/…/图片/资料Pcs/20210625101908408.png)]


2.2 为什么使用MP

场景说明: 小红是一个10年开发 ,月薪100万. 需要小红开发一套京淘项目实现最常用的CURD功能. 像这类操作 即简单又繁琐.如果大量的代码都由程序员自己手写 则影响开发效率.
需求: 像这类又简单 又繁琐的工作最好交给框架自动完成.
说明: 使用MP主要完成单表的CURD操作简化开发


2.3 MP入门案例


2.3.1 实现步骤


  1. 导入jar包文件
  2. 思想:使用对象的方式操作数据库
  3. 编辑POJO实现都西昂与数据表的映射关系
  4. 继承公共的接口,互殴去常用的CURD操作
  5. 实现数据操作

2.3.2 引入jar包



com.baomidou
mybatis-plus-boot-starter
3.4.3


2.3.3 编辑POJO

说明:
1.POJO应该与数据库中的表完成映射
2.POJO中的属性与吧hi澳中的字段——映射

注解:
1.@TableName(“demo_user”)//事项对象与表名映射
2.//设定主键自增@TableId(type=IdType.AUTO)
3.@TableFieId(“name”)实现属性与字段映射
规则:如果属性域字段的名称一致,则注解可以省略

实际用法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0hIJif2-1624682865952)(…/…/…/图片/资料Pcs/image-20210626111856750.png)]


2.3.4 继承公共的接口

说明:继承接口之后,必须添加泛型对象,否则程序无法执行
父级中的接口:
MP将常用的CURD的方法进行了抽取,以后子类如果需要调用,则直接使用即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cgWjRRUm-1624682865955)(…/…/…/图片/资料Pcs/20210625113255977.png)]

配置过程:
在这里插入图片描述


2.3.5 MP生效配置

说明:将原来的mybatis改为mybatis-plus

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8ipet0L-1624682865957)(…/…/…/图片/资料Pcs/image-20210626112252436.png)]


2.3.6 MP入门案例

说明:以对象的方式操作数据库,单表几乎不写Sql简化代码操作

//思想:以对象的方式操作数据库 单表几乎不写Sql
//简化CURD操作
@Test
public void testInsert(){
User user = new User();
user.setName("MP").setAge(19).setSex("ss");
userMapper.insert(user);
}

2.4 MP工作原理

核心思想:以对象的方式操作数据库

配置:

1.编辑POJO与数据表的映射
2.编辑POJO属性与表字段映射.映射表
3.封装了大量的常用CURD API简化用户调用
4.根据对象动态的生成Sql语句

执行过程:


  1. 程序业务开始调用
    userMapper.insert(对象)

  2. 根据Mapper接口动态获取操作的泛型对象,获取对象之后获取表的相关数据
    public interface UserMapper extends BaseMapper

  3. 只要获取对象 获取表名称 字段

    在这里插入图片描述
  4. 将对象转换为特定的Sql,之后交给Mybatis执行
    userMapper.insert(user对象)
    deptMapper.insert(dept对象)

    Sql:insert into (表名)(字段名) values (字段的值)

2.5 MP常用操作

//1.根据id查询
@Test
public void testSelect1(){
User user = userMapper.selectById(521);
System.out.println(user);
}
//2.查询新明为景天 性别为男的用户
//Sql: select*from demo_user where name="xxx" and sex="xxx"
@Test
public void testSelect2(){
//创建条件构造器 凤凰where条件的
User user = new User();
user.setName("景天").setSex("男");
//实现时会动态的根据对象中不为null的属性,拼接where条件
//默认的关系连接符 and
QueryWrapper queryWrapper = new QueryWrapper(user);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*3.查询姓名为赵云 性别为男的用户
Sql: select id,name,age,sex from demo_user where name=? and sex=?*/
@Test
public void testSelect3(){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","赵云").eq("sex","男");
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*4.查询年龄大于18的性别为女的用户
* Sql: select*from demo_user where age>18 and sex="女"
* 逻辑运算符: > gt , = ge , <= le , != ne */
@Test
public void testSelect4(){
//创建新的MD条件构造器对象+泛型
QueryWrapper queryWrapper = new QueryWrapper<>();
//设置MD条件构造器的条件
queryWrapper.gt("age",18).eq("sex","女");
//通过List集合打印MD结果
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*5.关键字 like
* 5.1查询name包含 天 where name like "%天%"
* 5.2查询name以 天 结尾的 where name like "%天"*/
@Test
public void testSelect5(){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","天");
// QueryWrapperqueryWrapper2 = new QueryWrapper<>();
// queryWrapper2.likeLeft("name","天");
List userList = userMapper.selectList(queryWrapper);
// List userList1 = userMapper.selectList(queryWrapper2);
System.out.println(userList);
// System.out.println(userList1);
}
/*6. 关键字 in
需求:查询ID为1,3,5,6的数据
Sql:select*from demo_user where id in (1,3,5,6)
java基础:参数中使用...表示可变参数类型 多个参数逗号分隔
一般定义可变参数类型时 位于方法的最后一位
可变参数类型的实质就是数组,学法不同
*/
@Test
public void testSelect6(){
//一般的数组采用包装类型,使用对象身上的方法 基本类型没有方法
Integer[] ids = {1,3,5,6};
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.in("id",ids);
//采用可变参数类型 实现查询
//queryWrapper.in("id",1,3,5,6);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*7.关键字:order by 排序
* 默认规则: 升序 asc 降序 desc
* 需求:查询性别为男的 用户并且按照年龄降序排列
* Sql: select*from demo_user where sex="男" order by age desc*/
@Test
public void testSelect7(){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex","女").orderByDesc("age");
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*动态Sql:
* 根据用户条件,动态的拼接where条件
* 案例:根据sex,age查询数据
* 1.select*from demo_user where age>18 and sex="女"
* API说明:
* queryWrapper.gt(判断条件,字段名称,字段值)
* 判断条件:true 则动态的拼接where条件
* false 不会拼接where条件
* 判断语句:
* Boolean sexBoo = (sex != null) && sex.length()>0;
* */
@Test
public void testSelect8(){
Integer age = 18;
String sex = "女";
QueryWrapper queryWrapper = new QueryWrapper();
Boolean ageBoo = (age != null);
Boolean sexBoo = StringUtils.hasLength(sex);
queryWrapper.gt(ageBoo,"age",age).eq(sexBoo,"sex","女").orderByDesc("age","id");
//附加条件 按照age降序排序 age相同时,通过id降序排序
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*9.只获取主键ID的值
* Sql:select id from demo_user*/
@Test
public void testSelect9(){
List idList = userMapper.selectObjs(null);
System.out.println(idList);
}
/*10. 删除 name = "xxx" 的数据*/
@Test
public void testDelete(){
//删除ID为100的数据
userMapper.deleteById(58);
//userMapper.deleteBatchIds(null);
//删除操作的条件构造器
QueryWrapper queryWrapper= new QueryWrapper();
queryWrapper.eq("name","xxx");
userMapper.delete(queryWrapper);
}
/*11.数据修改/更新
* 案例:要求修改id=522 name改为紫萱
* API说明:userMapper.updateById(对象信息)*/
@Test
public void testUpdate(){
//修改除了ID之外的所有不为null的数据,id当作where唯一条件
User user = new User();
user.setId(522).setName("紫萱");
userMapper.updateById(user);
}
/*12.数据修改2
* 案例:将name为星期五的用户改为 name仙剑传5 age13 sex 2
* API说明:
* userMapper.update(对象,修改条件构造器)
* 对象:修改后的数据使用对象封装
* 修改条件构造器:负责修改的where的条件*/
@Test
public void testUpdate2(){
User user = new User();
user.setName("仙剑传5").setAge(13).setSex("2");
UpdateWrapper updateWrapper = new UpdateWrapper();
updateWrapper.eq("name","星期五");
userMapper.update(user,updateWrapper);
}


推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
author-avatar
mobiledu2502870073
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有