使用MyBatis实现条件查询
SQL映射文件
Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处。
它的功能强大,SQL映射文件的配置却比较简单。
使用SQL映射文件可以减少50%以上的代码量。
Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能,
下面是SQL映射文件的几个顶级元素配置
- mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespace绑定某个接口之后,就可以不写该接口的实现类,因为mybatis会根据接口的完整名称来找到对应的mapper配置来执行SQL语句。因此namespace的命名必须跟你设置的接口同名比如
2.cache:配置给命名空间的缓存
<!-- cache配置 -->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" />
在mapper文件配置支持cache后如果需要对个别查询进行调整,可以单独设置cache,代码如下
<select id="selectTest" resultType="int" useCache="true">
select id from text where id = 1
</select>
由于Mybatis框架不擅长缓存查询结果数据集,所以不对它进一步了解,所以采用OSCahe,Memcached等专门的缓存服务器做更为合理。
3.cache-ref:从其他命名空间引用缓存
4.resultMap:用于描述数据库结果集合对应关系
5.SQL:可以重用的SQL 块,也可以被其他语句引用
6.insert:映射插入语句
7.delete:映射删除语句
8.update:映射更新语句
9.映射查询语句
使用SELECT完成单条件查询
Select 元素的属性 id 命名空间中唯一的标识符,可以被用来引用这条语句
ParameterType 表示查询语句传入参数的类型的完全限定名或别名,
它支持基础数据类型和复杂数据类型
除了内建的类型别名外,还可以为自定义的类设置别名,该表格只列出了部分映射,其他的别名请参考mybatis的帮助文档,ResultType 查询语句返回结果类型的完全限定名或别名。别名的使用方式与parameterType是一样的
<select id="selectTest" resultType="User" parameterType="string">
select * from text where name = #{
name}
</select>
这是一个 id为 selectTest的SQL映射语句 ,它的参数类型为 string 也可为复杂类型,返回值是 User类型,如果使用类 做返回值的话 类中的字段设置的和数据库表的字段一致,这样可以使数据库和类中的属性自动匹配以便开发(注意如果数据库表和实体类的属性命名不一样则需要手动配置),参数类型为 #{参数名} 它会告诉Mybatis生成PreparedStatement参数 ,对于JDBC该参数会被识别成 ? 若采用JDBC来实现代码如下:
String sql = "select * from text where name = ? ";
PreparedStatement ps = new PreparedStatement(sql);
ps.setString(1,name);
由此看出,Mybatis可以节省大量的代码,如果想完成复杂一些的查询或者让配置文件更简洁些,这就需要了解select元素的属性和mybatis配置文件的属性,
介绍属性:
- id:命名空间中的唯一标识符,可以被用来引用这条语句
- parameterType:表示查询语句传入的参数的类型的完全限定名或别名
- resultType:查询语句返回结果类型的完全限定名或别名
使用SELECT完成多条查询
上面只是对一个表进行查询,但是在实际操作中查询数据会有多条件,
结果也会有各种类型。
<!-- 设置resultMap的映射 -->
<resultMap id="TestMap" type="text">
<id property="id" column="id" />
<reuslt property="name" column="name" />
<!-- 比如text类中有个 List<User> 的属性
则需要使用该该标签绑定User表
如果只是 User类型的参数的话使用 association 标签
他们两个标签的属性差不多只,是association是javaType来指定类型
而collection使用的是ofType来指定类型,
多表查询时最好给每个id设置别名,以免插入到其他的id
-->
<collection property="userList" ofType="User">
<id property="id" column="u_id" />
<result property="UserName" column