目录
ORM思想:
Mybatis -plus
JPA思想:
spring整合mybatis-plus具体步骤
Mybatis Plus中提供的API
查询操作API
删除操作API
更新操作API
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据
对象关系映射:对象的名称映射表的名称、对象的属性名称映射表的字段
mybatis是半自动的ORM,Hibernate是全自动的ORM
先定义访问数据层的接口,之后书写sql语句来访问数据库,工程师们不满足于此,他们还想让访问数据库的操作再简单一点.....
于是,又一个让人摸不着头脑的概念诞生了!!!
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
简单点说就是:以对象的方式访问数据库,而不用手写sql语句的方式访问数据库。
当然诞生的不光只是这个概念,与之诞生的还有一个猴赛雷的东东,它就是今天的主角 mybatis -plus , 这个名字是不是似曾相识呢?没错,它是在mybatis 的框架的基础上做的增强,所以是plus,意为mybatis 的升级版。
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
这是Mybatis-plus的官网
https://mp.baomidou.com
以上就是有关mybatis-plus的相关介绍 ,下面让我们直奔主题,看看如何整合mybati-plus吧
一、在pom文件中导入spring整合mybatis -plus的jar包,最新版本可以参考官网~
!--spring整合mybatis-plus -->
com.baomidou
mybatis-plus-boot-starter
3.2.0
注意:mybatis -plus与mybatis 的jar包只能存在一个,因为mybatis -plus包含mybatis,为了避免发生无可预期的错误,只保留mybatis -plus即可
二、编辑配置文件配置mybatis-plus这里以YML文件为例,其实与mybatis的配置没啥区别,只是把开头换成了mybatis-plus
#mybatis-plush配置 mp比mybatis功能更加强大 引用一个即可
mybatis-plus:
#定义别名包
type-aliases-package: com.jt.vip.pojo #这里是po对象的包路径
mapper-locations: classpath:/mybatis/mappers/*.xml #动态的导入xml映射文件
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true #为了user_id与userId完美映射.无需手动转化
注意:配置文件中mybatis-plus与mybatis的配置也只需保留一个即可奥~
三、创建PO对象,用于访问数据库
@Data //生成get/set/toString/equals
@Accessors(chain=true) //表示链式加载 重写set方法,将对象返回
@NoArgsConstructor //添加无参构造 为以后框架的使用做准备
@AllArgsConstructor //全部参数的构造方法.
@TableName(value="user")//定义对象与表映射关系 编辑表名
//如果表名与对象的名称一致,则可以省略不写.
public class User {
@TableId(type=IdType.AUTO) //标识主键 主键自增.
private Integer id;
//@TableField(value="name") //如果字段的名称与属性名称一致(包含驼峰规则),则可以省略
private String name; //字段与属性一一映射
private Integer age; //user_name userName
private String sex;
}
底层通过反射技术根据你的@TableName注解的value值映射你的数据库中的表,如果你的po对象的名字与表名一致可以省略value属性
会根据@TableId(type=IdType.AUTO)注解得知你的主键
四、继承BaseMapper
在mybatis -plus提供了大多数常用的访问数据库的方法,我们只需要实现BaseMapper
public interface userMapper extends BaseMapper{
}
五、整合完毕后,在测试类里面查询表中所有数据,检查是否整合成功
@Test
void findAll() {
List selectList = userMapper.selectList(null).forEach((item)->System.out.println(item));
}
六、此外,还可以在YML配置文件中配置打印SQL的日志,方便我们编写程序
#打印sql日志
logging:
level:
com.jt.vip.mapper: debug //这里是我们访问数据库的接口包路径
1.selectBatchIds(Collection idList)
根据多个ID查询信息,idList主键ID列表,不能为null或empty
/**
* 根据多个id查询
*/
@Test
void findByIds() {
Integer[] ids = {1,2,3,4,5,6};
List idList = Arrays.asList(ids);
List userList=userMapper.selectBatchIds(idList);
userList.forEach((item)->System.out.println(item));
}
2.selectById(id)
根据ID查询,返回值是BaseMapper
/**
* 根据单个id查询
*/
@Test
void test01() {
User user= userMapper.selectById(2);
System.out.println(user);
}
3.selectByMap(Map
根据传入的Map,key为查询字段,value为查询字段对应的值
/**
* 根据map条件查询
*/
@Test
void test02() {
Map map = new HashMap<>();
map.put("name","蕾姆");
map.put("sex", "女");
userMapper.selectByMap(map).forEach((user)->System.out.println(user));
}
4.selectList(Wrapper
根据 entity 条件,查询全部记录,一般查询后是一个List集合的时候会使用
条件构造器:QueryWrapper
> 用gt表示
< 用lt表示
= 用eq表示
>= 用ge表示
<= 用le表示
其中有:> gt < lt = eq >= ge <= le
/**
* 条件构造器
* where语句条件
* 查询age大于18 and sex是女的用户
* 语法: >gt =ge <=le
* 多个条件默认使用 and 连接
*/
@Test
void test03() {
QueryWrapper qw=new QueryWrapper();
qw.gt("age",18).eq("sex", "女");
userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}
5.QueryWrapper.like()
QueryWrapper对象中的模糊查询的方法,其中还有likeRight、 likeLeft .....
/**
* 模糊查询
* 查询name值以蕾开头的用户信息
*/
@Test
void test04() {
QueryWrapper qw=new QueryWrapper();
qw.likeRight("name", "蕾");
userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}
6.QueryWrapper.between()
QueryWrapper对象中的方法,类似于sql语法中的between and
/**
* 查询年龄在18-35之间的用户,并且name以王开头
* between的用法
*/
@Test
void test05() {
QueryWrapper qw=new QueryWrapper();
qw.between("age", 18, 35).likeRight("name", "王");
userMapper.selectList(qw).forEach((user)->System.out.println(user));
}
7.QueryWrapper.orderBy()
QueryWrapper对象中的方法,排序时使用根据业务还有orderByAsc、orderByDesc...等方法
/**
* 查询年龄大于100并按照年龄降序排列,如果年龄相同则按照id降序
*/
@Test
void test06() {
QueryWrapper qw=new QueryWrapper();
qw.orderByDesc("age","id").gt("age", 100);
userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}
8.QueryWrapper.inSql()
QueryWrapper对象中的方法,方法中可以自定义sql语句,并将结果放在in中再次进行查询。
类似in的子查询
/**
* 查询age < 100岁的用户,并且性别与name="孙尚香"的性别相同的的用户数据.
*/
@Test
void test07() {
QueryWrapper qw=new QueryWrapper();
qw.lt("age", 100).inSql("sex", "select sex from user where name='孙尚香'");
userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}
9.QueryWrapper.select()
指定字段查询
@Test
public void test09() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.select("id","name").eq("age", 18);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
//完善业务
QueryWrapper queryWrapper2 = new QueryWrapper();
queryWrapper2.select("id","name").eq("age", 18);
List
10.Condition
在QueryWrapper对象的许多方法参数中存在这样一个参数Condition
Condition:true时,执行where语句,false时则不执行
/**
* Condition: true时,则添加where条件。
* 条件:以name和sex不为null的数据当做where条件.
* 非空条件查询
* 模拟mybatis中的动态sql的写法 由Condition进行控制
*/
@Test
public void test10() {
String name = "貂蝉"; //用户传递的参数
Integer age = 18;
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq(!StringUtils.isEmpty(name), "name",name);
queryWrapper.eq( age!=null, "age",age);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
11.根据传入的对象查询数据
/**
* 根据对象查询数据
*/
@Test
public void test11() {
User user = new User(); //用户数据的传递,采用user对象的方式接收
user.setName("李白");
user.setSex("男");
//用户要求根据传递的对象进行查询,
//根据对象中不为null的属性之后拼接where条件
QueryWrapper queryWrapper = new QueryWrapper(user);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
此外还有:
selectOne方法:如果只查询一条数据的时候可以使用。
selectObjs方法:只查询第一列数据
/**
* 用户删除操作
* 说明:将name属性中为null的数据删除.
*/
@Test
public void test13() {
//userMapper.deleteById(id); //传递主键,之后删除
//userMapper.deleteBatchIds(idList); //根据id批量删除数据.
//userMapper.deleteByMap(columnMap) //根据指定的字段删除数据.
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.isNull("name");
int rows = userMapper.delete(queryWrapper);
System.out.println("影响行数:"+rows);
/**
* 1.根据主键进行修改.
* 要求: id=50号的信息,修改为name="娜可露露" age= 19 sex=女
*/
@Test
public void test14() {
User user = new User();
user.setId(50).setName("娜可露露").setAge(19).setSex("女");
//如何解析sql byId说明 只有id属性充当where条件 其余属性充当set条件.
//如果获取主键信息时使用
int rows = userMapper.updateById(user);
System.out.println("影响的行数:"+rows);
//2. entity:需要修改的数据
// updateWrapper: 修改的条件
User user2 = new User();
user2.setAge(25).setSex("男");
UpdateWrapper updateWrapper= new UpdateWrapper();
updateWrapper.eq("id", 50);
//具有通用性.任何条件都可以使用update(xx,xxx)
userMapper.update(user2, updateWrapper);