摘要:场合常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用将每一条记录映射到中,在前端页面遍历中是即可。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。
配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全
映射文件在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理sql语句
Statement的实际位置就等于namespace+StatementId
占位符在Mybatis中,有两种占位符
#{}解析传递进来的参数数据
${}对传递进来的参数原样拼接在SQL中
主键生成策略如果我们在Hibernate中,当我们插入数据的时候,我们是可以选择是UUID策略的...
那么在Mybatis是怎么做的呢??
UUID主键返回select uuid() INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
如果我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取
需求:
user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。
解决思路:
通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。
mysql:
select LAST_INSERT_ID() INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
oracle:
实现思路:
先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。
resultMapselect 序列.nextval() from dual INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address})
有的时候,我们看别的映射文件,可能看不到以下这么一段代码:
因为,如果我们的数据表的字段和JavaBean的属性名称是相同时,我们就不用上面那段代码了。Mybatis会自动帮我们把返回的结果进行封装成JavaBean
那当我们数据表的字段和JavaBean的属性名称不是相同时,我们就需要使用resultMap,也就是上面那段代码
当然了,在正常情况下列名和JavaBean的属性名一般都是不同的,因此还是需要resultMap的。
resultMap和resultType区别resultType :指定输出结果的类型(pojo、简单类型、hashmap..),将sql查询结果映射为java对象 。
使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。
resultMap:将sql查询结果映射为java对象。
如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)
使用resultMapresultType和resultMap用法总结
resultType:
作用:
将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:
常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
resultMap:
使用association和collection完成一对一和一对多高级映射。
association:
作用:
将关联查询信息映射到一个pojo类中。
场合:
为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。
collection:
作用:
将关联查询信息映射到一个list集合中。
场合:
为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。
Collection在前面好像并没有用过,下面就看一下它的用法:
Order与OrderDetails关系
package cn.itcast.mybatis.po; import java.io.Serializable; import java.util.Date; import java.util.List; public class Orders implements Serializable { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //关联用户信息 private User user; //订单明细 private Listorderdetails; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number == null ? null : number.trim(); } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getNote() { return note; } public void setNote(String note) { this.note = note == null ? null : note.trim(); } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List getOrderdetails() { return orderdetails; } public void setOrderdetails(List orderdetails) { this.orderdetails = orderdetails; } }
SQL语句
resultMap
一般地使用resultMap会多一点。
Mybatis映射文件处理特殊字符第一种方法:
用了转义字符把>和<替换掉,然后就没有问题了。
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE
第二种方法:
配置文件 别名typeAliases别名:
自定义别名:
Mapper加载
延迟加载
在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。
如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。
在Mybatis中延迟加载就是在resultMap中配置具体的延迟加载..
在Mybatis的文件中配置全局延迟加载
延迟加载测试
当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。
由于是对User进行延迟加载,那么我们只要查询Orders相关的信息即可了
使用resultMap来配置延迟加载
总结
在程序中调用的SQL语句是由映射文件的命令空间+sql片段的id所组成的。它内部会生成一个Statement对象的。
在使用别名的时候,可以指定包名,在使用总配置文件加载映射文件时,也可以指定包名。
主键如果需要返回的话,使用selectKey 标签即可。UUID也可以返回。在Oracle的话,是使用序列来返回自动增长的主键的。
占位符有两种,一种是解析传递进来的参数数据、一种是原样输出传递进来的数据。
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68757.html
摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...
摘要:有必要建一个资源服务器存放静态资源。一些用户级别的数据轻量可以考虑存储在中。存储的是值,可以通过来对和对象之间的转换如果我们的数据是在后台传过去或者转换而成的,在前台上并没有做什么改变的话。 移动商城项目总结 移动商城项目是我第二个做得比较大的项目,该项目系统来源于传智Java168期,十天的视频课程(想要视频的同学关注我的公众号就可以直接获取了) 通过这次的项目又再次开阔了我的视野,...
摘要:前言嗨,小伙伴们,这篇博文将带大家手写,让大家对的核心原理以及工作流程有更加深刻的理解。模块顾名思义,就是框架配置类,用于解析配置文件加载相关环境。配置模块这里的对框架的配置使用了简单的,主要原因还是简单易懂然后节省时间。 前言 (。・∀・)ノ゙嗨,小伙伴们,这篇博文将带大家手写mybatis,让大家对mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybat...
摘要:学习笔记有官方的中文开发文档并且针对使用者比较友好是一款优秀的持久层框架,它支持定制化存储过程以及高级映射。它只和配置有关,存在的意义仅在于用来减少类完全限定名的冗余,为了简化中的书写。 Mybatis学习笔记 mybatis有官方的中文开发文档并且针对使用者比较友好:http://www.mybatis.org/mybatis-3/zh/ MyBatis 是一款优秀的持久层框架,它支...
摘要:主要有两种解决方案,一种是使用注解解决一切问题,一种是简化后的老传统。新建项目默认为,直接改为,另外新增一个用户不同环境使用不同的配置文件用。配置指定配置文件为配置开启驼峰命名转换,如。 仓库地址:spring-boot-learning欢迎star、fork,给作者一些鼓励 前言 Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。my...
阅读 2364·2023-04-25 20:07
阅读 3302·2021-11-25 09:43
阅读 3661·2021-11-16 11:44
阅读 2528·2021-11-08 13:14
阅读 3177·2021-10-19 11:46
阅读 894·2021-09-28 09:36
阅读 2974·2021-09-22 10:56
阅读 2373·2021-09-10 10:51