ORM映射


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