ORM映射

ORM映射
ORM映射:对象关系映射
Mybatis会做数据映射
查询返回的是结果集(ResultSet),Mybatis会把结果集根据映射规则自动转成list
更大的减少代码量
主要针对的是查询
0
 
0
 
 
0
 
0
 
Mybatis有一套默认的规范
如果表字段的名字与类属性的名字一致,那么Mybatis就会做一个自动的映射
会把表中userCode的值放在类中的userCode属性中
MyBatis究竟是什么映射规则?
先获取表的字段,例如获取到id
然后会找到user类对应的set+表字段名(首字母大写)方法
找到此方法后,运行此方法,把表中字段映射到对象的属性中
得到id
找到user的setld()方法
 
0
 
用反射进行setid方法的调用
 
0
 
在这里已经告诉框架的类的路径
利用反射实例化User对象
因为得到方法名,可以利用反射根据方法名获取到方法
再利用反射进行方法的调用
 
如果哦表的字段跟类的属性不一致咋办
一般开发的时候会定义规范,可以免去很多烦恼
 
如果不一样,解决方案
1.起别名
 
0
 
2.自定义映射规则
 
0
 
 
 
 
 
 
除了上面的规范之外,MyBatis还支持驼峰命名规范
类的属性:userCode
表的字段:user_code
也是可以的,但是需要开启MaBatis的驼峰命名规范
在MyBatis的配置文件中添加一行配置即可
如果开启驼峰命名规范user_code 会字段转换成userCode
 
四、常见的SqlSession方法
 
0
 
 
看源码SqlSession中有很多方法,主要就是两类,一个是增删改查,一个事务查询的操作
 
所以进行增删改查的时候,要考虑事务,查找的时候,不修改数据库的数据,所以不考虑事务
后面框架整合之后,我们就不需要在手动进行事务的提交和回滚
直接用注解就可以
注意:不管是什么操作,Mybatis都是面向对象的,所以我们传参数的时候,一般是把数据封装对象即可
一:新增数据
向smbms_user表中新增一条记录
先写sql语句
怎么写?查看官网即可
 
0
 
 
注意:
官网中用的是预编译,所以我们也用预编译
 
0
 
0
 
 
0
 
删除数据
 
执行
0
 
注意:
因为MyBatis 是面向对象的,传递的参数是对象;sql语句中的 #{} 值是类的属性
 
删除数据
0
 
0
 
0
 
0
 
0
 
0
 
0
 
0
 
 
修改数据
 
0
 
0
 
三、 查找数据
单表查询,一般查询所有的字段,或者查询某几个字段,或者查询记录数,平均值等
查询所有
 
0
 
0
 
查询
 
0
 
套路:先分析需求,根据需求写sql,写代码调用sql
五:多张表的增删改查
基本不存在多张表的的增删改查,一般都是多张表的查询
表的级联操作 on delete :no action set null;cascade
如果上设置了级联删除,那么只要执行delete from grade where gname ="三年级二班"
一般不要这么做,比较危险
 
一般是分布步骤来做的
1.根据三年级二班 获取班级的的id 101
 
2.根据id删除对应的学生
 
3.根据id删除班级
delete from grade where gid = 101
级联操作不一定是好事,假设数据量比较大几百万的数据,级联操作会消耗大量的时间
响应速度会比较慢
 
 
增删改的级联操作基本都可以拆分的,所以这里主要是多张表额级联查询
 
一:四种关联的关系
一对一 一对多 多对一 多对多
关于多对多问题
我们一般添加一个中间表,把多对多编程两个一对多,多对一的关系
一对一又是特殊的一对多
本质上讲只存在一对多,多对一
0
 
在这里,我们将两种方案 ,大家可以自由发挥
先说相对比较观发那个的解决方案
一对一
0
 
 
 
 
如果返回值是User那么后面的数据是没有办法封装的
如果返回值的是Role那么前面的数据灭法封装的
0
 
然后自定义映射规则
0
 
 
0
 
0
 
 
0
 
 
测试:
可以成功的查询到user和Role两个表中的数据
User表中的数据映射到User类中;Role表中的数据映射到ROle类中
通过User获取到Role对象,然后在从Role对象拿到数据
 
0
 
 
 
0
 
 
第二种方法
新建一个实体类
一般实体类跟数据库的表对应,有几张表就有几个类
当然也可以新建一个类,接收返回的数据,有一个弊端,就是被动
如果业务很多,需要大量的创建实体类
新建Role类
在User中添加role属性
 
 
0
 
0
 
 
0
 
 
0
 
 
数据全部查到
这种把多表查询变成了单表查询;不需要在考虑映射关系
反正查询出来的一张表,我们只需要针对这个表创建一个类,接收数据即可
在一定的程度上降低查询的难度,但是增加的类的编写
第一种官方推荐
 
自由发挥
问题:
刚才讲的两张表的联查,如果多张呢
可以两两处理
 
一对一,多对一案例
0
 
 
看User和Address
假设:
一个user对应多个address
 
0
 
 
我们查询用户信息以及此用户的所有地址信息
先写SQL语句
0
 
查询结果
 
0
 
 
 
结果来自两张表
所以要把这两个类关联,因为一个用户对应n个地址
在User类中添加
 
0
 
 
 
0
通过起别名,实现一 一对应的关系,表的字段起名字要有一定规范,否则后期写代码的时候,可能出现各种问题(映射关系不清晰)
 
0
 
User id uid
Address id aid
单张表和多张表的操作讲完了
 
 
总结:
  1. 写项目的时候,尽量拆分,把多表的操作变成n个单表的操作
  2. 没办法拆分,,我们在写复杂的SQL语句
  3. sql语句写完之后先测试
  4. 严格遵守命名规范
  5. 写多表的映射规则,每次只考虑两张表
 
 
 
posted @ 2022-05-17 16:46  码农在广场  阅读(172)  评论(0编辑  收藏  举报