MyBatis

学习主题:mybatis
学习目标:
1 掌握resultMap的使用
2 掌握association的使用
3 掌握collection的使用
4 掌握mybatis的注解开发
5 掌握mybatis的运行原理

1.列名和属性名不一致问题_resultMap标签的使用
(1)什么是ResultMap? 有什么作用?
<resultMap>用于自定义映射关系,可以由程序员自主制定列名和属性名的映射关系。一旦使用resultMap,表示不再采用自动映射机制

(2)resultType和resultMap有什么区别?
如果查询时使用 resultType 属性, 表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配. 因此, 当数据库表的列名和类的属性名不一致时,会导致查不到数据.所以这种情况下只能使用resultMap.

2.多表关联查询_设计表结构
(1)MyBatis实现多表关联查询有哪些情况?
一对多,多对一
(2)数据库表格间的关系有哪几种?
一对多,多对一,多对多

3.多表关联查询_业务装配方式
(1)什么是业务装配? 简述如何实现?
调用mapper层,先查询第一个表里的数据,再根据这个表查出的数据再去查询另外一个表中数据,手动进行组装,称之为业务装配。

public List<Student> selAll() {
		SqlSession session = MyBatisUtil.getSession();
		StudentMapper stuMapper = session.getMapper(StudentMapper.class);
		ClazzMapper cMapper = session.getMapper(ClazzMapper.class);
		List<Student> list = stuMapper.selAll();
		for (Student student : list) {
			Clazz clazz = cMapper.selByID(student.getCid());
			student.setClazz(clazz);
		}
		session.close();
		return list;
	}

(2)请总结MyBatis有哪些优点?
1)它支持定制化 SQL、存储过程以及高级映射。
2)避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
3)可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

4.多表关联查询_resultMap_单个对象_N+1方式实现
(1)标签有什么作用?
用于关联一个(多对一)关联对象。

(2)标签中有哪些属性? 分别有什么含义?
property属性:指定要关联的属性名
select属性:设定要继续引用的查询
column属性:查询时需要传递的列名

5.多表关联查询_resultMap_单个对象_关联方式实现
(1)请使用association节点实现根据用户id查询用户信息以及对应角色信息(User实体类中有一个对象Role,只写SQL映射文件)

<mapper namespace="an.sz.mapper.UserMapper">
 	<resultMap type="User" id="umap">
 		<id property="id" column="id"/>
 		<result property="username" column="username"/>
 		<result property="password" column="password"/>
 		<result property="rid" column="rid"/>
 		<association property="role" javaType="role" column="rid">
 			<id property="id" column="id"/>
 			<result property="rname" column="rname"/>
 			<result property="rsex" column="rsex"/>
 		</association>
 	</resultMap>
 	<select id="selAll" resultMap="umap">
 		select * from user
 	</select>
 </mapper>
<mapper namespace="an.sz.mapper.RoleMapper">
 	<select id="selByid" resultType="role" parameterType="int">
 		select * from role where id=#{0}
 	</select>
 </mapper>

(2)在mapper中如何传递多个参数?
1、接口中转入多个参数,Mapper文件SQL语句中用占位符 param1,param2,或arg0,arg1, 或索引0,1,2,
2、在接口中的形参前使用@Param命名参数,Mapper映射文件中的SQL语句的占位符用@Param命名的参数。注意,用@Param命名后,SQL中的占位符不仅能用命名的名字,还能用param1 param2…
3、在接口中转入对象,在Mapper映射文件中通过#{属性名}获取多个参数
4、在接口中转入Map集合,在Mapper映射文件中通过#{key}获取多个参数

6.多表关联查询_resultMap_集合对象_N+1方式实现
(1)标签有什么作用?
用于关联一个(一对多)关联对象

(2)标签中有哪些属性? 分别有什么含义?
property属性:指定要关联的属性名
select属性:设定要继续引用的查询
column属性:查询时需要传递的列名

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

(2)Mapper接口里的方法,参数不同时,方法能重载吗?
不可以,因为方法名和mapper文件里的id一一对应,id是唯一的,不能重复,所以接口里的方法名不能相同,不能重载。

8.多表关联查询_Auto-Mapping配合别名实现
(1)Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?
通过mapper映射。有自定义映射和auto-mapping自动映射

(2)什么情况下用注解绑定,什么情况下用xml绑定?
静态SQL语句可以用注解绑定,动态SQL用XML绑定

9.注解开发详解
(1)什么是注解? 有什么作用?
注解是用于描述代码的代码。简化配置文件.

(2)MyBatis中常用的注解有哪些?
@Override:用于描述方法的重写
@Param:用于描述属性的名称
@Test:用于描述方法的测试
@Select:用于进行查询操作
@Update:用于进行更新操作
@Insert:用于进行插入操作
@Delete:用于进行删除操作

10.MyBatis注解_CRUD
(1)MyBatis中使用注解需要注意什么?
基本类型和 String, 可以直接使用双引号的形式
数组类型, name={值 1, 值 2, …}; 如果数组元素只有
一个, 可以省略大括号
对象类型, name=@对象名(属性)
如果属性是该注解的默认属性, 而且该注解只配置这
一个属性, 可以将属性名省略
注解和配置文件可以配合使用

(2)哪些注解可以实现增删改查操作?

@Select:用于进行查询操作
@Update:用于进行更新操作
@Insert:用于进行插入操作
@Delete:用于进行删除操作

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

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

(2)如何通过注解实现多表关联查询?

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);
}

12.分析MyBatis的运行原理
(1)SqlSession对象的创建经理的哪些过程?
Resources->XMLConfigBuilder->DefaultSqlSessionFactory->SqlSession

(2)当实体类中的属性名和表中的字段名不一样 ,怎么办?
有两种方式解决:
1)给字段起别名,别名即为实体类的属性名
2)使用resultMap标签

13.详述MyBatis的运行原理
(1)MyBatis运行过程中涉及到哪些类或接口? 请列举并简述作用.
1、 Resources©:用于加载 MyBatis 核心配置文件
2、 XMLConfigBuilder©:用于解析 xml 文件(核心配置文件)
3、 Configuration©:用于存放 xml 文件解析后的结果
4、 DefaultSqlSessionFactory©:是 SqlSessionFactory(I)的 实 现 类 , 创 建 时 需 要 使 用Configuration 对象
5、 SqlSession(I):是 MyBatis 操作的核心
6、 DefaultSqlSession©:是 SqlSession 接口的实现类
7、 TransactionFactory(I):用于生产 Transaction 对象
8、 Transaction(I):用于表示操作数据库的事务对象
9、 Executor(I):是 MyBatis 的核心执行器, 类似于 jdbc 中的 Statement, 常用的实现类是 SimpleExecutor

(2)请总结MyBatis的运行原理
当 MyBatis 运行开始时, 先要通过 Resources 加载核心配置文件, 之后使用 XMLConfigBuilder 对配置文件进行解析, 将解析结果封装为 Configuration 对象, 接着, 使用Configuration对象构建一个DefaultSqlSessionFactory对象, 至此, SqlSession 工厂构建完成.
接下来, 通过工厂对象调用 openSession 方法创建SqlSession 对 象 . 在 这 个 过 程 中 , 需 要 通 过TransactionFactory 生成 Transaction 对象, 并且, 还需要创建核心执行器 Executor 对象, 之后, 通过这些对象来创建DefaultSqlSession对象, 至此, SqlSession对象创建成功.之后, 通过SqlSession 对象执行相应的操作, 如果执行成功, 调用 commit 方法提交事务; 如果失败, 调用rollback 方法事务回滚. 最后, 调用 close 方法关闭
session 资源. 以上, 就是 MyBatis 的运行原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值