xml
编写查询语句。
- 查询所有
- 查询详情
- 条件查询
查询所有
mapper
接口 List<User> getUsers();
xml
映射文件
1 | <select id = "selectAll" resultType = "User"> |
在上面有一个属性是 resultType
,这个通常要和 ResultMap
一起说。
resultType 和 ResultMap
如果你搜索只是返回一个值,比如说 String
,或者是 int
,那你直接用 resultType
就行了。
1 | //dao中的接口 |
该 SQL
返回的是 int
型,那么 ResultType
定义成 int
型即可直接与 Java
进行绑定(基本数据类型默认可不写)。
如果是返回一个复杂的对象,并且,对象中的参数和数据库中的参数一致。就可以使用 ResultType
。
创建 User
对象, 拥有两个字段id
,userName
。
1 | User queryUser(String id); |
上面的参数请参考 mybatis | xml 的 property 和 column
可以发现 User
对象,其属性 userName
和数据库中实际参数 user_name
并不一致,这个时候就不能用 resultType
了,因为,解析不上。
这个时候,就可以用 resultMap
。resultMap
可以对返回的参数进行配置,mybatis
可以进行驼峰自动转换(默认是关闭的),当数据库字段和Java对象字段不满足驼峰(列名不匹配),可以通过 resultMap
这里来配置,进行字段匹配。「注意,resultMap
属性 需要和 resultMap
标签结合使用」
如果不想用 resultMap
可以使用 as
别名。如
1 | <select id="queryUser" resultType="User"> |
查询详情
1 | //dao中的接口 |
- parameterType
- 传参的参数类型「可以不写,因为可以找到接口里面的参数」
一个特殊情况,特殊字符,比如
1 | <select id ="getUser" ResultType="User" parameterType = "int"> |
其中 id < #{id};
中的 <
这个标识可能会误被认为是标签。
所以,<
有两种方式处理
- 使用
<
替代<
- 使用
CDATA
区
1 | <select id ="getUser" ResultType="User" parameterType = "int"> |
CDATA
区里面的内容是纯文本。
条件查询
多条件查询
接口传参一共有 3
种方式。
1 | @Data |
接口的三种方式
- 参数传递
- 对象传递
Map
传递
1 | List<User> getUsers1(@param("name") String name,@param("password") String password); |
相关的 xml
为
1 | <select id="getUser" resultType="User"> |
动态条件查询
上面的多条件查询有一个问题,如果参数 name
不进行传参,为 null
的话,那么就查询不出来数据。
- if
- choose [when、otherwise]
- trim [where、set]
- foreach
if
1 | <select id="getUser" resultType="User"> |
<if>
标签里面,test
写表达式,并且,里面的参数,应该和传递参数相同,如
1 | <if test="nickName != null and nickName != ''"> |
and
情况解决。
如果 <if>
里面的标签内容不符合,那么 sql
就会变成 select * from user where and password like ?
显然不符合规范,所以,有两种方法解决上面的问题。
恒等式
1 | <select id="getUser" resultType="User"> |
where 标签
1 | <select id="getUser" resultType="User"> |
mybatis
会自动处理这种情况。
单条件的动态查询
从多个条件中选择一个进行查询。
- choose [when、otherwise]
类似于,图书馆查询的时候,大条件是 书名、期刊、作者、内容,小条件是具体查询的内容。
1 | <select id="test" resultMap="Test"> |