mybatis映射XML文件详解及实例
mybatis映射XML文件
一个简单的映射文件:
1
2
3
4
|
<? xml version = "1.0" encoding = "UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace = "com.cnx.wxcar.mapper.CustomerMapper" >
</ mapper >
|
当然这个文件中没有任何的元素
The Mapper XML files have only a few first class elements :
- cache – Configuration of the cache for a given namespace.
- cache-ref – Reference to a cache configuration from another namespace.
- resultMap – The most complicated and powerful element that describes how to load your objects from the database result sets.
- sql – A reusable chunk of SQL that can be referenced by other statements.
- insert – A mapped INSERT statement.
- update – A mapped UPDATE statement.
- delete – A mapped DELETE statement.
- select – A mapped SELECT statement.
select
简单的例子:
1
2
3
|
< select id = "selectPerson" parameterType = "int" resultType = "hashmap" >
SELECT * FROM PERSON WHERE ID = #{id}
</ select >
|
select也有很多属性可以让你配置:
1
2
3
4
5
6
7
8
9
10
11
12
|
< select
id = "selectPerson"
parameterType = "int"
parameterMap = "deprecated"
resultType = "hashmap"
resultMap = "personResultMap"
flushCache = "false"
useCache = "true"
timeout = "10000"
fetchSize = "256"
statementType = "PREPARED"
resultSetType = "FORWARD_ONLY" >
|
insert, update and delete
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
< insert
id = "insertAuthor"
parameterType = "domain.blog.Author"
flushCache = "true"
statementType = "PREPARED"
keyProperty = ""
keyColumn = ""
useGeneratedKeys = ""
timeout = "20" >
< update
id = "updateAuthor"
parameterType = "domain.blog.Author"
flushCache = "true"
statementType = "PREPARED"
timeout = "20" >
< delete
id = "deleteAuthor"
parameterType = "domain.blog.Author"
flushCache = "true"
statementType = "PREPARED"
timeout = "20" >
|
语句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
< insert id = "insertAuthor" >
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</ insert >
< update id = "updateAuthor" >
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</ update >
< delete id = "deleteAuthor" >
delete from Author where id = #{id}
</ delete >
|
f your database supports auto-generated key fields (e.g. MySQL and SQL Server),上面的插入语句可以写成:
1
2
3
4
5
|
< insert id = "insertAuthor" useGeneratedKeys = "true"
keyProperty = "id" >
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</ insert >
|
如果你的数据库还支持多条记录插入,可以使用下面这个语句:
1
2
3
4
5
6
7
|
< insert id = "insertAuthor" useGeneratedKeys = "true"
keyProperty = "id" >
insert into Author (username, password, email, bio) values
< foreach item = "item" collection = "list" separator = "," >
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</ foreach >
</ insert >
|
sql
这个element可以定义一些sql代码的碎片,然后在多个语句中使用,降低耦合。比如:
1
|
< sql id = "userColumns" > ${alias}.id,${alias}.username,${alias}.password </ sql >
|
然后在下面的语句中使用:
1
2
3
4
5
6
7
|
< select id= "selectUsers" resultType= "map" >
select
<include refid= "userColumns" ><property name = "alias" value= "t1" /></include>,
<include refid= "userColumns" ><property name = "alias" value= "t2" /></include>
from some_table t1
cross join some_table t2
</ select >
|
Result Maps
官网给了个最最复杂的例子
大体意思呢就是一个博客系统有一个作者,很多博文,博文中有一个作者,很多评论,很多标签(包括了一对多,一对一)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
<! -- Very Complex Statement -->
< select id= "selectBlogDetails" resultMap= "detailedBlogResultMap" >
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
A.id as author_id,
A.username as author_username,
A. password as author_password,
A.email as author_email,
A.bio as author_bio,
A.favourite_section as author_favourite_section,
P.id as post_id,
P.blog_id as post_blog_id,
P.author_id as post_author_id,
P.created_on as post_created_on,
P. section as post_section,
P.subject as post_subject,
P.draft as draft,
P.body as post_body,
C.id as comment_id,
C.post_id as comment_post_id,
C. name as comment_name,
C.comment as comment_text,
T.id as tag_id,
T. name as tag_name
from Blog B
left outer join Author A on B.author_id = A.id
left outer join Post P on B.id = P.blog_id
left outer join Comment C on P.id = C.post_id
left outer join Post_Tag PT on PT.post_id = P.id
left outer join Tag T on PT.tag_id = T.id
where B.id = #{id}
</ select >
<! -- Very Complex Result Map -->
<resultMap id= "detailedBlogResultMap" type= "Blog" >
<constructor>
<idArg column = "blog_id" javaType= "int" />
</constructor>
<result property= "title" column = "blog_title" />
<association property= "author" javaType= "Author" >
<id property= "id" column = "author_id" />
<result property= "username" column = "author_username" />
<result property= "password" column = "author_password" />
<result property= "email" column = "author_email" />
<result property= "bio" column = "author_bio" />
<result property= "favouriteSection" column = "author_favourite_section" />
</association>
<collection property= "posts" ofType= "Post" >
<id property= "id" column = "post_id" />
<result property= "subject" column = "post_subject" />
<association property= "author" javaType= "Author" />
<collection property= "comments" ofType= "Comment" >
<id property= "id" column = "comment_id" />
</collection>
<collection property= "tags" ofType= "Tag" >
<id property= "id" column = "tag_id" />
</collection>
<discriminator javaType= "int" column = "draft" >
< case value= "1" resultType= "DraftPost" />
</discriminator>
</collection>
</resultMap>
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:https://my.oschina.net/gef/blog/704880
本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/shujuku/2907.html