Mybatis多表关联查询以及注解开发

学习主题:mybatis

学习目标:

  1. 列名和属性名不一致问题_resultMap标签的使用
    1. 什么是ResultMap? 有什么作用?

用于自定义映射关系,可以解决列名和属性名不一致的问题。

    1. resultType和resultMap有什么区别?

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

  1. 多表关联查询_设计表结构
    1. MyBatis实现多表关联查询有哪些情况?

多对一和一对多两种情况

    1. 数据库表格间的关系有哪几种?

一对一、一对多、多对多三种关系

  1. 多表关联查询_业务装配方式
    1. 什么是业务装配? 简述如何实现?

Mapper层只做单表查询操作,在service层进行手动装配,实现关联查询的结果。

    1. 请总结MyBatis有哪些优点?
  1. 解决了jdbc的每执行一次数据操作就要开关一次数据库,减少了数据库的负担。Mybatis使用连接池解决了该问题。
  2. 将sql语句和代码分离,提高了代码的可维护性减少了代码量
  3. 多表关联查询_resultMap_单个对象_N+1方式实现
    1. 标签<association>有什么作用?

用于关联一个对象

    1. <association>标签中有哪些属性? 分别有什么含义?

property:指定要关联的属性名

select:设定要继续引用的查询,namespace+id

column:查询时需要传递的列

  1. 多表关联查询_resultMap_单个对象_关联方式实现
    1. 请使用association节点实现根据用户id查询用户信息以及对应角色信息(User实体类中有一个对象Role,只写SQL映射文件)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
	<resultMap type="role" id="swp">
		<result column="uid" property="uid"/>
		<association property="role" select="com.bjsxt.mapper.RoleMapper.selById" column="uid">		
		</association>
	</resultMap>
	<select id="" resultMap="swp">
		select * from t_user
	</select>
</mapper>
    1. 在mapper中如何传递多个参数?

在mapper中编写和xml文件名字一样的接口,在接口中创建的方法包含多参数,mabatis会自动把接口和xml文件自动绑定,生成其对应实现类。从而实现传递多个参数。

  1. 多表关联查询_resultMap_集合对象_N+1方式实现
    1. 标签<collection>有什么作用?

用于关联一个集合

    1. <collection>标签中有哪些属性? 分别有什么含义?

property:指定要关联的属性名

select:设定要继续引用的查询

column:查询时需要传递的列

  1. 多表关联查询_resultMap_集合对象_关联方式实现
    1. 通常一个Xml映射文件,都会写一个Mapper接口与之对应,请问,这个Mapper接口的工作原理是什么?

MyBatis 会根据接口和对应的 xml 文件创建接口的实现类

    1. Mapper接口里的方法,参数不同时,方法能重载吗?

可以重载。

  1. 多表关联查询_Auto-Mapping配合别名实现
    1. Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?

由mybatis的自动映射机制,实现将列名和属性名的自动关联,实现将sql的执行结果封装为对象返回。

    1. 什么情况下用注解绑定,什么情况下用xml绑定?

单表查询用注解更简单,多表查询使用xml更好

  1. 注解开发详解
    1. 什么是注解? 有什么作用?

注解是用于描述代码的代码,基本上配置文件能做的,注解也能做。用来简化配置文件。

    1. MyBatis中常用的注解有哪些?

@Test(用于描述junit测试)

@Override(用于描述方法的重写)

@Param(用于描述属性的名称)

  1. MyBatis注解_CRUD
    1. MyBatis中使用注解需要注意什么?

1使用前必须先导包

2注解使用风格:@xxx(属性)

3属性设定方式:属性名=属性值

4基本类型和String,可以直接使用双引号形式

5数组类型:name={值1,值2,值3…},若只有一个数组元素,花括号可以省略

6对象类型:name=@对象名(属性)

7如果属性是该注解的默认属性, 而且该注解只配置这一个属性, 可以将属性名省略

    1. 哪些注解可以实现增删改查操作?

@Select:类似<select>

@Insert:类似<insert>

@Update:类似<update>

@Delete:类似<delete>

  1. MyBatis注解_关联查询
    1. @Results和@Result注解有什么作用?

@Results:类似与<resultMap>

@Result: 类似与<resultMap>的子标签

    1. 如何通过注解实现多表关联查询?
public interface StudentMapper { 
 @Select("select * from t_student")  
@Results(value = {   
@Result(column="id",property="id",id=true),   
@Result(column="name",property="name"),   
@Result(column="age",property="age"),   
@Result(column="gender",property="gender"),   
@Result(column="cid",property="cid"),   
@Result(property="clazz", 
one=@One(select="com.bjsxt.mapper.ClazzMapper.selById"), column="cid")  })  
List<Student> sel(); 
} 
-----------------------------------------------------------------------------------------------
public interface ClazzMapper {  
@Select("select * from t_class where id=#{0}")  
Clazz selById(int id); 
}
  1. 分析MyBatis的运行原理
    1. SqlSession对象的创建经历的哪些过程?
  2. 通过resources加载核心配置资源
  3. 由其创建的configration作为参数放入XMLconfigbuilder中由build方法创建出sqlsessionfactory对象
  4. 由sqlsessionfactory的opensession方法即可创建出sqlsession对象
    1. 当实体类中的属性名和表中的字段名不一样 ,怎么办?
  5. 起别名,可以继续使用mybatis的自动映射机制(auto_maopping)
  6. 使用resultMap,自定义映射关系
  7. 详述MyBatis的运行原理
    1. MyBatis运行过程中涉及到哪些类或接口? 请列举并简述作用.

1 Resources(C)

用于加载 MyBatis 核心配置文件

2 XMLConfigBuilder(C)

用于解析 xml 文件(核心配置文件)

3 Configuration(C)

用于存放 xml 文件解析后的结果

4 DefaultSqlSessionFactory(C)

是 SqlSessionFactory(I)的 实 现 类 , 创 建 时 需 要 使 用

Configuration 对象

5 SqlSession(I)

是 MyBatis 操作的核心

6 DefaultSqlSession(C)

是 SqlSession 接口的实现类

7 TransactionFactory(I)

用于生产 Transaction 对象

8 Transaction(I)

用于表示操作数据库的事务对象

9 Executor(I)

是 MyBatis 的核心执行器, 类似于 jdbc 中的 Statement, 常用的实现类是 SimpleExecutor

  1. 请总结MyBatis的运行原理

运行后,通过resources加载核心配置资源,再由XMLConfigBuilder解析xml核心配置文件封装成configration对象,由build方法生成DefaultSqlSessionFactory对象,至此,SqlSession工厂创建完成。接下来由该工厂对象,调用opensession方法,创建SqlSession对象,期间,需要TransactionFactory生成Tranction对象,以及excuter核心执行器执行,之后构建出DefaultSqlSession对象。至此SqlSession对象创建完成。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值