03_一对一_锁钥_分步查询

starrylsi
2024-09-10 / 0 评论 / 15 阅读 / 正在检测是否收录...

目标: 熟练使用自定义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

评论 (0)

取消