目标: 熟练使用自定义resultmap
关键:
1.不使用join on连接两个表
2.association的select="第二步查询的方法全类名"
3.使用association
1. 创建一对一数据库表
1.1 创建锁表
create table t_lock(
`id` int primary key auto_increment,
`name` varchar(50)
);
1.2 创建钥匙表
create table t_key(
`id` int primary key auto_increment,
`name` varchar(50),
`lock_id` int ,
foreign key(`lock_id`) references t_lock(`id`)
);
1.3 插入初始化数据
insert into t_lock(`name`) values('阿里巴巴');
insert into t_lock(`name`) values('华为');
insert into t_lock(`name`) values('联想');
insert into t_key(`name`,`lock_id`) values('马云',1);
insert into t_key(`name`,`lock_id`) values('任正非',2);
insert into t_key(`name`,`lock_id`) values('柳传志',3);
2. 引入配置文件,和需要的库,创建接口
config/jdbc.properis
config/log4j.properties
config/mybatis-config.xml
lib/druid-1.1.10.jar
lib/log4j-1.2.17.jar
lib/mybatis-3.4.1.jar
lib/mysql-connector-java-5.1.37-bin.jar
3. 编写xml文件
3.1 association
association 标签专门映射Bean对象中的子对象(一个Bean)专门用来配置一对一标签
<mapper namespace="top.starrylsi.dao.KeyDAO">
<!-- 如果类中存在组合的情况 可以使用resultMap 将组合中的内容指定给对应的属性
column 需要sql中的列名
property 需要类中属性名.自身属性的
通常情况下 为了保证每个对象之间存在独立类关系
在resultMap标签中添加 对应关系
有两种关系标签 :
一对一标签 : <association>
<association>标签中的 property属性
1.需要指定类中的组合属性名
2.需要指定该属性的类型 javaType="全类名"
-->
<!-- <resultMap type="key" id="resultMap_queryKeyById">
<id column="id" property="id"/>
<result column="name" property="name" />
<result column="lock_id" property="lock.id"/>
<result column="lock_name" property="lock.name"/>
</resultMap> -->
<resultMap type="top.starrylsi.pojo.Key" id="resultMap_queryKeyById">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="lock" javaType="top.starrylsi.pojo.Lock">
<id column="lock_id" property="id"/>
<result column="lock_name" property="name"/>
</association>
</resultMap>
<select id="queryKeyById" resultMap="resultMap_queryKeyById">
select k.id, k.name, l.id lock_id ,l.name lock_name from t_key k join t_lock l on k.lock_id = l.id
where k.id = #{id}
</select>
</mapper>
3.2 分页查询
<resultMap type="top.starrylsi.pojo.Key" id="queryKeyByIdTwoStep_resultMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="lock" javaType="top.starrylsi.pojo.Lock"
select="top.starrylsi.dao.LockDAO.queryLockById" column="lock_id"></association>
</resultMap>
<select id="queryKeyByIdTwoStep" resultMap="queryKeyByIdTwoStep_resultMap">
select id,name,lock_id from t_key where id = #{id}
</select>
延迟加载在一定程序上可以减少很多没有必要的查询。给数据库服务器提升性能上的优化。
要启用延迟加载,需要在mybatis-config.xml配置文件中,添加如下两个全局的settings配置。
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 将积极加载改为消极加载 按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
错误点
mybatis-config中的mapper 路径用的是 resource,resouce只能读取一个文件,而class可以读取这个类的所有文件
junit 版本号与 代码写法不一样
在实现分页查询的时候,由于LockDAO的mapper没有在mybatis-config中声明而报错
评论 (0)