【MyBatis】关联映射和缓存机制
一、一对一查询
实体类IdCard和Person创建:

IdMapeer.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.xiaobiti.pojo.IdCard"> 6 <!-- 根据id查询证件 --> 7 <select id="findCodeById" parameterType="Integer" resultType="com.xiaobiti.pojo.IdCard"> 8 select * form tb_idcard where id=#{id} 9 </select> 10 </mapper>
PersonMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.xiaobiti.pojo.Person"> 6 <!-- 嵌套查询:通过执行另一条语句返回结果 --> 7 <select id="findById" parameterType="Integer" resultMap="idCardResult"> 8 <!-- select * from tb_person where id=#{id}--> 9 select * from tb_person a,tb_idcard b where a.card_id=b.id and a.id=#{id} 10 11 </select> 12 <!-- selectd的resultMap即为设置结果的键值 --> 13 <resultMap id="idCardResult" type="com.xiaobiti.pojo.Person"> 14 <id property="id" column="id"/> 15 <result property="sex" column="sex"/> 16 <result property="name" column="name"/> 17 <result property="age" column="age"/> 18 19 <!-- 一对一关联,需要引入另外的sql语句 --> 20 <!-- <association property="card" column="card_id" javaType="com.xiaobiti.pojo.IdCard" select="com.xiaobiti.pojo.IdCard.findCodeById"/>--> 21 <!-- com.xiaobiti.pojo.IdCard.findCodeById对应了另一个Mapper里面的select的,将findCodeById的结果对象对应输出card的键也对应是数据库中的列card_id --> 22 23 <association property="card" column="card_id" javaType="com.xiaobiti.pojo.IdCard"/> 24 25 </resultMap> 26 </mapper>
二、一对多查询
实体类Order和User创建:

UserMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.xiaobiti.pojo.User"> 6 <!-- 一对多查询 --> 7 <select id="findUser" parameterType="Integer" resultMap="userMap"> 8 SELECT u.*,o.id as order_id,o.number FROM tb_order o,tb_user u where o.user_id = u.id and u.id =#{id} 9 </select> 10 <resultMap id="userMap" type="com.xiaobiti.pojo.User"> 11 <id property="id" column="id"/> 12 <result property="username" column="username"/> 13 <result property="address" column="address"/> 14 <!-- 一对多 --> 15 <collection property="orderList" ofType="com.xiaobiti.pojo.Order"> 16 <id property="id" column="order_id"/><!-- order表中id别名改为order_id,所以这里的column对应为order_id --> 17 <result property="number" column="number"/> 18 </collection> 19 </resultMap> 20 </mapper>
OrderMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.xiaobiti.pojo.Order"> 6 <select id="findOrders" parameterType="Integer" resultMap="orderResult"> 7 SELECT o.*,p.id as product_id,p.name,p.price FROM tb_order o,tb_product p,orderitem oi where o.id = oi.order_id AND p.id = oi.product_id AND o.id = 1 8 </select> 9 <resultMap id="orderResult" type="com.xiaobiti.pojo.Order"> 10 <id property="id" column="id"/> 11 <result property="number" column="number"/> 12 <collection property="productList" ofType="com.xiaobiti.pojo.Product"> 13 <id property="id" column="product_id"/><!-- product表中id别名改为product_id,所以这里的column对应product_id --> 14 <result property="name" column="name"/> 15 <result property="price" column="price"/> 16 </collection> 17 </resultMap> 18 </mapper>
运行查询结果:


需要将mapper文件配置到mybatis-config.xml中
三、一级缓存
添加依赖:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
在src/main/resources目录下创建log4j.properties文件
log4j.properties
#全局日志配置
log4j.rootLogger=DEBUG, Console
#控制台输出配置
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#日志输出级别,只展示了一个
log4j.logger.java.sql.PreparedStatement=DEBUG
四、二级缓存
开启二级缓存需要在mybatis-config.xml中插入。。。需要在properties后面插入
<settings> <setting name="cacheEnabled" value="true" /> </settings>

然后再在对应的Mapper文件中加入。。。开启二级缓存

缓存总结:数据没有改变进行同样的查询时可以在缓存区中直接拿出查询数据。

浙公网安备 33010602011771号