上一篇博客中学习了Mybatis,这篇将学习以下Mybatis Plus,同时也将会用到更加易懂的YML文件(对比XML)
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
知识点:
1.描述对象和数据库之间映射关系
2.以面向对象的方式来操作数据库.
例子:新增用户为例 向user表中新增一个用户数据. name=“张三” age=18 sex=女
1).面向过程的语言
insert into user(id,name,age,sex) values(null,"张三",18,女);
2).面向对象的方式
User user = new User("张三",18,"女"); //对象的封装
userMapper.insert(user对象); //调用工具API方法实现入库. 程序员只需要编辑这些就够了.
userMapper.delete(xxxx)
上述操作,程序员需要编辑,但是其中与数据库的交互的过程,程序员无需干预.会根据对象自动的生成sql语句.实现入库操作.而这些操作都由固定的API动态生成.所以以后用户只需要操作对象即可实现入库操作.
总结:之前操作数据库时需要自己手写sql语句.现在操作数据库利用对象的方式实现操作.
userMapper.insert(user对象); API方法
insert into user表(表中的字段) values (获取属性的值.....)
userMapper.insert(person对象); API方法
insert into user表(表中的字段) values (获取属性的值.....) 通用
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特点:
说明:MP中引入jar包文件会与原来Mybatis的包产生冲突,所以需要将原来的包注释
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.2.0version>
dependency>-
可根据以下字段自建数据库表User
//user表示实体对象 一般与数据库中的表进行关联.
@Data //证明lombok引入成功
@Accessors(chain=true) //链式加载
@NoArgsConstructor //定义无参构造方法 如果什么都不写,默认添加无参构造
@AllArgsConstructor //定义全参构造方法 如果添加了全参构造,必须先添加无参构造
//为什么呢? 解释:乌龟的屁股!!!! 龟腚(规定)
//MP的原则如果对象名称和属性名称与表和字段一一映射,则可以忽略不写.
@TableName //标识对象与user表一一映射.
public class User {
@TableId(type=IdType.AUTO) //定义主键自增
private Integer id; //整数 一般用Integer/Long 区间>Integer
//@TableField(value="name") //属性与字段进行标识
private String name; //String 一般写字符串
private Integer age;
private String sex;
}
MP最重要的操作是Mapper层继承BaseMapper接口,即可使用能满足大部分需求的CRUD操作
配置说明:需要将mybatis改为mybatis-plus即可
#语法 1.key: (空格)value
# 2.缩进 代表层级关系
server:
port: 8080 #tomcat服务器默认端口号都是8080
#类比: java运行环境JDK
# 项目运行环境服务器(软件) tomcat
#YML配置文件在SpringBoot(Spring+SpringMVC等)程序中启动时 会被默认加载
#为属性赋值 如果操作时有红线则不管.
#如果将大量的业务代码保存到YML配置文件中时,会造成代码结构混乱
my:
food: 番茄炒蛋 #k-v
book: java编程思想
#SpringYML配置文件写法
spring:
datasource: #数据源
driver-class-name: com.mysql.jdbc.Driver
#链接数据库地址
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#SpringBoot整合Mybatis
mybatis-plus:
#定义别名包
type-aliases-package: com.jt.pojo
#mapperxml映射文件路径
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
//3.测试MP方式查询数据库
@Test
public void testSelectAll() {
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
说明:在yml配置文件最后添加日志操作.
#配置日志
logging:
level:
com.jt.mapper: debug
//3.测试MP方式查询数据库
@Test
public void testSelectAll() {
//面向对象的方式操作数据库
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
@Test
public void testInsert() {
User user = new User(null,"新冠病毒",7, "其他");
userMapper.insert(user);
}
/**
* MP案例1: 查询name="王昭君"的用户
* 注意事项: 1.查询的结果有几个???
* 2.查询的条件
* sql: select * from user where name = "王昭君"
* 语法: eq =, gt >, lt < , ge>= ,le <=
*/
@Test
public void testSelect01() {
//定义条件构造器 作用:拼接where条件
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("name", "王昭君");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* MP案例2: name属性中包含"精"的数据,并且为女性
* sql: select * from user where name like "%精%" and sex="女"
*/
@Test
public void testSelect02() {
//定义条件构造器 作用:拼接where条件
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.like("name", "精") //默认采用and的方式进行链接
.eq("sex", "女");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* MP案例3: 查询年龄在18-35之间的女性用户.
* Sql语句: SELECT id,sex,name,age FROM user WHERE (age BETWEEN ? AND ? AND sex = ?)
*/
@Test
public void testSelect03() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.between("age", 18, 35)
.eq("sex","女");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* MP案例4: 查询年龄大于100岁的,并且按照年龄降序排列,如果年龄相同按照Id降序排列
* Sql语句:
* SELECT id,sex,name,age FROM user WHERE (age > ?)
* ORDER BY age DESC , id DESC
*/
@Test
public void testSelect04() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.gt("age", 100)
.orderByDesc("age","id");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/**
* MP案例5:查询age < 100岁的用户,
* 并且性别与name="孙尚香"的性别相同的的用户数据.
* Sql语句:
* SELECT id,sex,name,age FROM user WHERE
* (age < ? AND sex IN (SELECT sex FROM USER WHERE NAME = '孙尚香'))
*/
@Test
public void testSelect05() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.lt("age", 100)
.inSql("sex", "SELECT sex FROM USER WHERE NAME = '孙尚香'");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
//根据ID查询数据 id=11的用户 ID是主键 主键不能重复
@Test
public void testSelect06() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("id", 11);
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
User user2 = userMapper.selectById(11); //根据主键进行查询
System.out.println(user2);
}
//批量查询 查询id=1,3,5,6等用户信息
//sql:SELECT id,sex,name,age FROM user WHERE id IN ( ? , ? , ? , ? )
@Test
public void testSelect07() {
Integer[] ids = {1,3,5,6};
List<Integer> idList = Arrays.asList(ids);
List<User> userList =
userMapper.selectBatchIds(idList);
System.out.println(userList);
}
@Test
public void testInsert2() {
User user = new User(null,"新冠病毒",7, "其他");
userMapper.insert(user);
}
/**
* 案例:删除name为null的数据
* sql:DELETE FROM user WHERE (name IS NULL)
*/
@Test
public void testDelete() {
//userMapper.deleteById(100); //删除id的值为100的用户数据
//userMapper.deleteBatchIds(idList);//可以进行批量的删除
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.isNull("name");
userMapper.delete(queryWrapper);
}
/**
* 需求:将id=228的数据,name改为实训课程,age=3 sex=其他
* 原则: 根据对象中不为null的属性当作更新要素.
* ById: 代表根据具体的主键的值更新数据. 就是where条件
* Sql: update xxxxxxx where id = 主键值
*/
@Test
public void testUpdate() {
User user = new User();
user.setName("实训课程")
.setAge(3)
.setSex("其他")
.setId(228);
userMapper.updateById(user);
}
/**
* 需求2: 更新name="新冠病毒"的数据改为
* name="疫苗正在路上" age=1 sex=其他
* Sql: update user set name="xxx",age=1,sex="其他"
* where name="新冠病毒"
*
* 参数说明:
* entity: 修改的值
* updateWrapper: 修改的条件构造器
*/
@Test
public void testUpdate2() {
User user = new User(null, "疫苗正在路上", 1, "其他");
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "新冠病毒");
userMapper.update(user, updateWrapper);
}