mapper映射文件是Mybatis的核心所在,对数据库的操作都在里头了。
在mapper映射文件中,以<mapper/>
作为根节点,其下可以有的子节点分别是:
1 |
|
本节就来介绍这些子节点。
先来看看 insert
insert, update, delete三个标签的属性和使用方法相似,这里就以insert为例介绍。
1 |
|
代码见真章:
数据库表
1 |
|
DO 类
省略getter/setter方法:
1 |
|
Mapper 接口
1 |
|
Mapper 映射文件
1 |
|
测试类
1 |
|
执行后数据库的 tb_user 表中多了一条数据。
userMapper.insert(user)
成功执行返回1(失败则为0)。
如果插入时不指定id,采用数据库的自增主键,并想要得到记录的id值,可以这样修改:
1 |
|
或者使用 <selectKey/>
标签:
1 |
|
如此,在userMapper.insert(user)
后便可从user
对象中取得id了。
注意: 数据库的自增id赋值给了keyProperty
指定的属性,insert
方法的返回值仍然是1或0。
这里用到了 <selectKey/>
标签,它可以返回记录在数据库中的id,看上去和<insert/>
标签的属性useGeneratedKeys
和keyProperty
功能重复了。
那么除了这个作用外,<selectKey/>
还有什么作用呢?
我们知道,MySQL支持主键自增,但是其它的数据库(如oracle)不支持啊;此外如果主键是UUID的,自增也无能为力了。此时<selectKey/>
就能派上用场了。
先将DO类的id改成String类型,然后mapper映射文件变成这样:
1 |
|
这样就会在insert语句前先执行selectKey,将UUID赋给id,然后再插入数据库。
不过在网上看到这里有个隐患,就是通过mybatis生成的UUID可能存在重复,emmm,所以实际工程中还是用java的UUID,更加方便,还不重复!
重头戏 select
先来看看mapper映射文件中,select 标签可以有哪些属性:
1 |
|
要更全的可以查看相应的官方文档。
现在来看看select的demo。以上面的tb_user表为例,查询某个id的user记录的select为:
1 |
|
DAO层接口为:
1 |
|
可以看到select语句中的#{userId}
来自接口方法的入参,返回类型resultType
为user(这是个别名)。
这里有个注意点: 入参只有一个时,可以直接这么取;若是有多个,则需要加注解 @Param()
了,比如要根据性别和年龄来查:
1 |
|
1 |
|
在上面介绍select的属性时提到,返回类型可以用两个属性来指定,resultType
和 resultMap
,上面的demo用到了resultType
,下面讲讲resultMap
的用法。
什么都能转 resultMap
resultMap 最简单的用法就是字段的映射。 若数据库中字段和用来接收的Javabean的属性一致时,用resultType即可,但若是不一致,resultMap就派上用场了。 比如说数据库中的字段是uuid,Javabean中是id,此时需要这样配置:
1 |
|
这样就完成了一个简单地字段映射。不过resultMap的强大之处远不止此。
在上面的demo中,返回接收的user的属性都是简单的基本类型的包装类型和String,但如果是个自定义的类,resultMap也可以处理得很好:
现在我们给User类中增加一个Role属性
1 |
|
在数据库中增加两张表,分别是角色表tb_role,和用户角色关联表tb_user_role_relation:
1 |
|
在mapper映射文件中,可以用 <association/>
进行关联:
1 |
|
便可将role和user关联起来:
1 |
|
在上面这个例子中,一个user只有一个role,但实际上一个user可能对应着多个role,在Javabean中的表现就是:
1 |
|
此时可以用 <collection/>
进行关联:
1 |
|
可以得到结果:
1 |
|
到此,mapper映射文件介绍告一段落。