MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.
SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号, Oracle 可以使用("")符号.
什么意思呢?
就是在我们之前的操作过程中,我们是没法获取属性是对象的属性的
也就是Student类中的Clazz属性我们没法直接获取
需要借助resultMap或者是collection标签来操作
具体实现的mapper.xml写法如下
<mapper namespace="com.lin.mapper.StudentMapper"> <resultMap id="smap" type="Student"> <id property="id" column="sid"/> <result property="name" column="sname"/> <result property="age" column="age"/> <result property="gender" column="gender"/> <association property="clazz" javaType="Clazz"> <id property="id" column="id"/> <result property="name" column="cname"/> <result property="room" column="croom"/> </association> </resultMap> <select id="selAll" resultMap="smap"> select s.id sid ,s.`name` sname ,s.age age ,s.gender gender ,s.cid cid, c.id cid ,c.`name` cname ,c.room croom from t_student s LEFT JOIN t_class c on s.cid = c.id </select> </mapper>
但是如果说不想写上面这种繁琐的代码,那就可以试试mybatis中的auto-mapping机制,自动绑定就要求我们要遵循一定的规范
一般我们获取属性都是对象.属性,但是在sql中 . 是特殊的符号,所以需要使用 ` ` 来扩起别名实现自动绑定,进行查询,这么写的好处是,代码简单,但是相对应的就是要注意写法,不能有错
<mapper namespace="com.lin.mapper.StudentMapper"> <select id="selAll" resultType="student"> select s.id, s.name, s.age, s.gender, s.cid, c.id `clazz.id`, c.name `clazz.name`, c.room `clazz.room` from t_student s left join t_class c on s.cid=c.id </select> </mapper>
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
表结构学生表(t_student),字段有id,name,age,gender,cid.班级表(t_class)字段有id,name,room语句:--班级表createtablet_class(idint(3)primarykeyauto_increment,namevarchar(20)notnull,roomvarchar(30));--学生表createtablet_student(idi
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级业务装配模式,实际上就是mapper层做单表查询操作,在service层做手动装配,实现关联查询的结果思路:①首先实体之间的关系,学生之于班级是多对一所以在学生的实体类从传入一个Class对象用于封装班级信息②然后分别定义学生的查询操作和班级的查询操作③在service层中创建两个mapper对象,进行业务装配,首先先查询
思路整理一下之前一直做的都是多对一的查询多:学生一:班级通过查到学生后在去查询班级现在倒过来,做1对多的查询,一个班级多个学生那怎么处理这个多呢,实际上就是吧所有的学生封装进一个集合里表现出来,最直观的就是在class的实体类中添加一个学生类型的集合思路:在pojo里的Class类的属性中加入Student的集合,将查到的Student信息封装进Class类里面pojo层Clazz.classpu
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级所谓的N+1次查询呢,实际上就是mybatis帮我们做了业务装配来看下下面的图执行一次学生的查询,有几个学生执行几次班级的查询实际上就是在上一篇文章的StudentMapper.xml里面使用了resultMap来实现n+1查询
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级之前用的业务装配或者是n+1查询都是存在一个缺点的,就是都是分别执行单次查询,然后再组装,无形之中就给数据库增加了巨大的压力,毕竟是要执行多次查询所以接下来要介绍使用resultMap标签来实现两张表一起查并且拼接在一起这样就只有查询一次sql缺点就是写的时候要细心一点就是了首先先是要使用的sql语句selects.ids
forearch另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的.正常的sql语句中使用in的例子select*fromtb_userwhereidin(1,2,3,4)在mysql中,就将后面的查询的条件(1,2,3,4)封装成一个集合传入,并且用forearch处理接口代码packagecom.lin.mapper;importcom.lin.pojo.User;imp
mybatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。mybatis3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的。要开启二级缓存,你需要在你的SQL映射文件中添加一行:cache;mybatis的一级缓存是session缓存作用到SqlSession对象,二级缓
include这个标签一般是用来实现sql语句复用的比如select*fromtb_user这个*包含了id,username,password*虽然方便了我们,但实际上麻烦都交给了程序,所以面对多次复用的语句可以配合sql标签提取处理来,具体处理为运行sql语句查看
mybatis框架简介a)mybatis是一个ORM框架,用于操作数据库,底层是对jdbc进行的封装.b)mybatis的前身是iBatis,是Apache下的一个开源项目.现在被迁移到了GitHub上.c)中文网址:https://mybatis.org/mybatis-3/zh/getting-started.htmld)mybatis各版本下载地址:https://github.com/my
Trimprefix:前缀,表示向前面添加内容prefixOverrides:从前面删除内容suffix:后缀,表示向后面添加内容suffixOverrides:从后面删除内容先对灵活,实际开发中用于解决where和set做不到的操作的时候使用Bind常用在模糊查询上两个标签name:要用于模糊查询的关键字value:写法"'%'+用于模糊查询的关键字+'%'"使用后后面的查询条件不再使用等号,而
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!