一、resultMap(用来描述如何从数据库结果集中加载对象)
用处:
1.类似于全局配置文件中的Alias(别名)一样,在文件中定义后,在后面可以意使用.省去了多余的重复代码.
2.可以解决数据库中数据的字段名和java对象中属性名不对应的问题.
3.可以解决嵌套语句的映射问题.
如何使用:在mapper标签里面,使用resultMap标签.
这个id是它的标识,也就是名字,在被其他语句使用的时候就靠这个id了,
type是对应的类型,填写完全限定名或者在全局配置文件声明过的别名.
<typeAlias type="com.bean.Orders" alias="Orders"></typeAlias>
首先
还是要知道他们是干什么用的再学习如何使用
id和result一样,用来一对一从数据库中映射到java属性上.
association,英文意思是关联的,当一个java对象中的属性是另一个对象的时候就用到它了
collection,这个就是集合了,当java对象中的属性是一个集合的时候就用到它了
constructor,英文意思是结构体,这个用在对象的构造方法中,用来还原一个对象.
discriminator相当于一个选择语句,根据不同情况来执行不同的resultMap
其次
下面是java代码和数据库列名
在书写id和result时就可以这样写
<id property="id" column="id"></id>
<result property="userID" column="user_id"></result>
<result property="number" column="number"></result>
<result property="note" column="note"></result>
其中id用来标识唯一的主键,result用来标识其他属性. property是对应的java属性,column是数据库中的列名,这样就解决了不对应的问题.如果不写的话就会根据名称自动映射.
比如我上面写的语句是这样的,没有指定createtime属性,查询后返回的结果却是
Orders{id=5, userID=10, number=‘1000012’, createtime=Thu Feb 12 16:13:23 CST 2015, note=‘null’}
association使用在java对象中有个属性是另外一个对象的时候,也用在联合查询中.
比如在刚才的属性中添加上User这个对象,作为订单这个类的一个属性
两个对应的数据库表是
现在对他们做嵌套查询,对应的SQL是这样子的,并且将两个ID区分开.
select o.id as ordersID,
o.number,
o.createtime,
o.note,
u.id as userID,
u.username,
u.sex,
u.address
from orders o,user u where o.user_id=u.id and o.user_id=10;
得到的结果
那么在映射文件中要怎么写才能比较快捷简单方便呢??就要用到association这个标签了
接下来要讲解的就是collection这个标签了,
其实区别就在于一个ofType,要标注出来集合中的类型.
二、select
select标签中允许很多属性来控制作用细节
<id="" 作为命名空间,可以被其他association和collection标签调用,经常用在嵌套查询的时候
<parameterType="int" 来指定参数的类型,mybatis会通过类型处理器(TypeHandler)来推断类型.
<resultType="hashmap" <resultMap="personResultMap" 这两个只能出现一个,用来指定返回类型是什么参数
<flushCache="false" 默认为false,设置为true后,只要当语句调用,就会刷新本地和二级缓存
<useCache="true" 默认值:对select元素为true,设置后,会将本句的结果被二级缓存存起来
三、update、insert、delete
这三种比较相近,所以放在一起讲
<id 还是一样的,可以被用来代表这条语句
<flushCache 一样的,默认为false
<useGeneratedKeys="true" 仅对insert和update有效,默认为false,
这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键