学习主题:mybatis
学习目标:
- 列名和属性名不一致问题_resultMap标签的使用
- 什么是ResultMap? 有什么作用?
用于自定义映射关系,可以解决列名和属性名不一致的问题。
-
- resultType和resultMap有什么区别?
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
- 多表关联查询_设计表结构
- MyBatis实现多表关联查询有哪些情况?
多对一和一对多两种情况
-
- 数据库表格间的关系有哪几种?
一对一、一对多、多对多三种关系
- 多表关联查询_业务装配方式
- 什么是业务装配? 简述如何实现?
Mapper层只做单表查询操作,在service层进行手动装配,实现关联查询的结果。
-
- 请总结MyBatis有哪些优点?
- 解决了jdbc的每执行一次数据操作就要开关一次数据库,减少了数据库的负担。Mybatis使用连接池解决了该问题。
- 将sql语句和代码分离,提高了代码的可维护性减少了代码量
- 多表关联查询_resultMap_单个对象_N+1方式实现
- 标签<association>有什么作用?
用于关联一个对象
-
- <association>标签中有哪些属性? 分别有什么含义?
property:指定要关联的属性名
select:设定要继续引用的查询,namespace+id
column:查询时需要传递的列
- 多表关联查询_resultMap_单个对象_关联方式实现
- 请使用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>
-
- 在mapper中如何传递多个参数?
在mapper中编写和xml文件名字一样的接口,在接口中创建的方法包含多参数,mabatis会自动把接口和xml文件自动绑定,生成其对应实现类。从而实现传递多个参数。
- 多表关联查询_resultMap_集合对象_N+1方式实现
- 标签<collection>有什么作用?
用于关联一个集合
-
- <collection>标签中有哪些属性? 分别有什么含义?
property:指定要关联的属性名
select:设定要继续引用的查询
column:查询时需要传递的列
- 多表关联查询_resultMap_集合对象_关联方式实现
- 通常一个Xml映射文件,都会写一个Mapper接口与之对应,请问,这个Mapper接口的工作原理是什么?
MyBatis 会根据接口和对应的 xml 文件创建接口的实现类
-
- Mapper接口里的方法,参数不同时,方法能重载吗?
可以重载。
- 多表关联查询_Auto-Mapping配合别名实现
- Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?
由mybatis的自动映射机制,实现将列名和属性名的自动关联,实现将sql的执行结果封装为对象返回。
-
- 什么情况下用注解绑定,什么情况下用xml绑定?
单表查询用注解更简单,多表查询使用xml更好
- 注解开发详解
- 什么是注解? 有什么作用?
注解是用于描述代码的代码,基本上配置文件能做的,注解也能做。用来简化配置文件。
-
- MyBatis中常用的注解有哪些?
@Test(用于描述junit测试)
@Override(用于描述方法的重写)
@Param(用于描述属性的名称)
- MyBatis注解_CRUD
- MyBatis中使用注解需要注意什么?
1使用前必须先导包
2注解使用风格:@xxx(属性)
3属性设定方式:属性名=属性值
4基本类型和String,可以直接使用双引号形式
5数组类型:name={值1,值2,值3…},若只有一个数组元素,花括号可以省略
6对象类型:name=@对象名(属性)
7如果属性是该注解的默认属性, 而且该注解只配置这一个属性, 可以将属性名省略
-
- 哪些注解可以实现增删改查操作?
@Select:类似<select>
@Insert:类似<insert>
@Update:类似<update>
@Delete:类似<delete>
- MyBatis注解_关联查询
- @Results和@Result注解有什么作用?
@Results:类似与<resultMap>
@Result: 类似与<resultMap>的子标签
-
- 如何通过注解实现多表关联查询?
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);
}
- 分析MyBatis的运行原理
- SqlSession对象的创建经历的哪些过程?
- 通过resources加载核心配置资源
- 由其创建的configration作为参数放入XMLconfigbuilder中由build方法创建出sqlsessionfactory对象
- 由sqlsessionfactory的opensession方法即可创建出sqlsession对象
- 当实体类中的属性名和表中的字段名不一样 ,怎么办?
- 起别名,可以继续使用mybatis的自动映射机制(auto_maopping)
- 使用resultMap,自定义映射关系
- 详述MyBatis的运行原理
- 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
- 请总结MyBatis的运行原理
运行后,通过resources加载核心配置资源,再由XMLConfigBuilder解析xml核心配置文件封装成configration对象,由build方法生成DefaultSqlSessionFactory对象,至此,SqlSession工厂创建完成。接下来由该工厂对象,调用opensession方法,创建SqlSession对象,期间,需要TransactionFactory生成Tranction对象,以及excuter核心执行器执行,之后构建出DefaultSqlSession对象。至此SqlSession对象创建完成。