对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
核心: 采用对象的方式操作数据库.
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
ORM思想:一对象的方式操作数据库
应用场景:数据库只能识别sql语句,不能识别对象,如果每天都写简单的sql语句没有任何价值
核心原理:
1、利用注解@TableName(“表明”)去标识对象与表的映射关系,字段与属性的映射
2、将通用的接口方法进行抽取,抽取到公共的接口中,如果需要使用只需要继承该接口即可,泛型必须写
3、操作对象时需要有专门的API实现对象与Sql的转化,最终交给Mybatis去执行
com.baomidou
mybatis-plus-boot-starter
3.2.0
# 配置数据源
# serverTimezone=GMT%2B8& %2B=+ 设定时区
# useUnicode=true&characterEncoding=utf8& 设定字符集编码格式
# autoReconnect=true& 如果链接中断是否自动重连
# allowMultiQueries=true 是否允许批量操作.
spring:
datasource:
url: jdbc:mysql:///jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
# Spring整合Mybatis-plus配置
mybatis-plus:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/mappers/*.xml
/**
* mybatis-plus
* 1)实现对象与表的映射 @TableName(value="user")连接user表 如果表明与对象名一致可以省略
* 设置主键自增 @TableId(type = IdType.AUTO)
* 设置字段映射 @TableField("name") 如果数据库字段与属性名一致则可以不用写
* 2)自己写的dao层接口继承baseMapper然后直接调用里面的方法即可不需要要自己写sql
*
*/
@Data //get/set/toString(只能打印自己的属性,不能输出父类的属性,如想获取通过getXX方法获取)/equals等方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //全参构造
@Accessors(chain = true) //链式加载规则
@TableName(value = "user")//如果表明与对象名一致可以省略
public class User{
//POJO实体对象中属性类型必须使用包装类型
@TableId(type = IdType.AUTO)//设置主要自增
private Integer id;
//@TableField("name") 如果数据库字段与属性名一致则可以不用写
private String name;
private Integer age;
private String sex;
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
1、查询所有
/**查询所有*/
@Test
public void testMybatisPlus(){
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
2、基于id查询用户信息
/**
* 1、查询用户数据
* 1.1根据id=51d数据
* select * from user where id =?
*/
@Test
public void testSelect(){
System.out.println(userMapper.selectById(51));//根据主键id查询
}
3、条件查询
/**
* 查询name为王昭君的用户
* select * from user where name=?
* queryWrapper:条件构造器,主要作用动态拼接where条件
* 特殊符号:
* 1、= eq 等于
* 2、> gt 大于
* 3、< lt 小于
* 4、>= ge 大于等于
* 5、<= le 小于等于
*/
@Test
public void testSelect02(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//name为条件,eq为等于符号,name=王昭君
queryWrapper.eq("name", "王昭君");
System.out.println(userMapper.selectList(queryWrapper));//根据主键id查询
}
/**
* 查询年龄大于200的用户信息
* select * from user where age>200
*/
@Test
public void testSelect03(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 200);
System.out.println(userMapper.selectList(queryWrapper));//根据主键id查询
}
4、查询性别为男性,降序排序
/**
* 查询性别为男性,降序排序
* select * from user where sex='男' order by age desc
*/
@Test
public void testSelect04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("sex", "男")
.orderByDesc("age");
System.out.println(userMapper.selectList(queryWrapper));//根据主键id查询
}
5、查询name中包含“精”的用户,按年龄升序排序
/**
* 查询name中包含“精”的用户,按年龄升序排序
* select * from user where name like '%精%' order by age asc
*/
@Test
public void testSelect05(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "精")
.orderByAsc("age");
System.out.println(userMapper.selectList(queryWrapper));//根据主键id查询
}
6、查询age在18到100之间,性别为男的用户信息
/**
* 查询age>18 and age<100 男性用户 ,
* select * from user where age > 18 and age < 100 and sex='男'
* select * from user where age between 18 and 100 and sex='男'
*/
@Test
public void testSelect06(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//使用between and
queryWrapper.between("age", 18, 100)
.eq("sex", "男");
// queryWrapper.ge("age", 18)//默认为and 连接
// .lt("age", 100)
// .eq("sex", '男');
System.out.println(userMapper.selectList(queryWrapper));
}
7、in关键字的使用
/**查询id=1,2,3,4的用户
* select * from useer where id in (1,2,3,4)
* */
@Test
public void testSelect07(){
Integer [] ids ={1,2,3,4};//声明一个数组,存储条件
List asList = Arrays.asList(ids); //把数组转成集合,转换时需要使用包装类型
System.out.println(userMapper.selectBatchIds(asList));//主键可以直接调用selectBatchIds()方法
}
/**查询name='黑熊精、白龙驴'
* select * from user where name in ("黑熊精","白龙驴")
*/
@Test
public void testSelect08(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.in("name", "黑熊精","白龙驴");
System.out.println(userMapper.selectList(queryWrapper));//根据主键id查询
}
8、查询全部用户信息显示id,name字段
/**查询全部用户信息显示id,name字段
* select id,name from user
*/
@Test
public void testSelect09(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id","name");
System.out.println(userMapper.selectList(queryWrapper));
}
9、修改id为65的信息 name改为熊大
/**修改id为65的信息
* update user set name='熊大' where id=65
* */
@Test
public void testUpdate(){
User user = new User();//封装数据
user.setName("熊大").setId(65);
userMapper.updateById(user);
}
10、要求将黑熊精改为 熊大 age改为18
/**要求将黑熊精改为 熊大 age改为8`
* 参数说明:
* 1、实体对象 需要修改的数据采用实体对象封装
* 2、修改条件 修改条件采用Wrapper形式进行构建
* */
@Test
public void testUpdate2(){
User user = new User();
user.setName("熊大").setAge(18);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "黑熊精");
userMapper.update(user,updateWrapper);
}
11、删除id为(1,3,5,7)的数据
public void deleteItems() {
Integer [] ids = {1,3,5,7};
//把数组转成集合
List<Integer> id = Arrays.asList(ids);
//批量删除
itemMapper.deleteBatchIds(id);
}
说明:MP仅适用于单表的操作,如果需要多表操作还是的写sql,还有具体使用MP还是SQL的看具体业务,有时候单表操作用MP反而会变得复杂
官网:https://baomidou.com