映射器的使用:
半自动化的体现
配置 SQL 语句,体现了半自动化
和灵活性。
ORM
的体现
对象关系映射的实现,数据库表
和
POJO
类的映射关系。
映射器与接口
<?xml version="1.0" encoding="uft-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd>
<mapper namespace="dao.Mapper">
<select id="get" resultType="pojo.News">
select * from 'news'
</select>
</mapper>
package dao;
import pojo.News;
public interface Mapper{
public News get();
}
映射器配置文件和接口绑定:配置文件名对应接口名,id 属性值对应方法名。
映射器的组成
映射器的组成
映射器 | |||||||
SQL语句 | 映射关系 | ||||||
<select> | <insert> | <delete> | <update> | <sql> | <parameterMap> | <resultMap> |
MyBatis映射器方法的分类:
1.sqlMapper.xml的映射;
2.注解的映射;
3.sqlMapper和注解的混合使用
使用sqlMapper注解的步骤
01 | 引入mybatis-config.xml配置文件 该配置文件主要是连接数据库所需的配置信息 |
02 | 引入Mapper映射文件 配置SQL语句和映射的配置文件 |
03 | 创建MyBatisUtil类 用来创建MyBatis的数据库SqlSession会话类 |
04 | 创建SqlSession类访问数据库 创建SqlSession后,利用SqlSession访问数据库 |
05 | 输出结果 查询所需的数据库的信息,并输信息。 |
1.1在src下面添加mybatis-config.xml文件,并创建SqlMapper.xml和Mapper文件并放在同一包下,其中SqlMapper.xml文件中的id唯一且和Mapper接口文件中的方法名相同
1.2在SqlMapper.xml文件中,各个元素的映射
select 元素结构
<select id = "get" resultType="pojoNews">
select * from student
</select>
属性 | 说明 |
id | 唯一标识,接口中的方法名 |
parameter | 参数的类型 |
resultType | 结果的类型 |
resultMap | 复杂的结果集映射关系 |
参数的传递
xml文件中 配置文件中利用 parameterType 属性设置参数类型,利用
#{}设置参数的使用及位置。
接口中
接口中,按照方法的入参方式指定参数类型和参数名称。
多个参数传递
方法1:Map 方式
XML 配置文件:
参数的类型使用Map
方法2:JavaBean 方式
XML 配置文件:
参数的类型使用类做为参数
insert 元素结构
属性 | 说明 |
id
|
唯一标识,接口中的方法名;
|
parameterType
|
参数的类型;
|
keyProperty
|
表示以哪个列作为属性的主键,不能和 keyColumn 同时使用;
|
keyColumn
|
指明哪一列是主键,不能和 keyProperty 同时使用;
|
useGeneratedKeys
|
使用 JDBC 的 getGeneratedKeys 方式来取有数据库内部生成的主键;
|
主键回填
功能
当主键在数据库中为自增字段时,新增成功后,回
填主键。
<mapper namespace="dao.Mapper">
<insert id="add" parameterType="News"
useGeneratedKeys="true" keyProperty="newsId">
insert into News(title) values(#{title}}
</insert>
</mapper>
自定义主键生成规则
<selectKey>
用来预先设定主键值。自定义主键生成规则时,可以使用该标签;
order
属性:
取值
BEFORE
,
AFTER ;
resultMap 元素
表的结构:
create table schoolmaster(
smid int PRIMARY KEY auto_increment,
sm_name varchar(10) ,
smsex varchar(2)
);
insert into schoolmaster(sm_name,smsex) values('老刘','男');
public class SchoolMasters{
private int smid;
private String smname;
private String smsex;}
表名和字段名不一致
01 | 02 | 03 |
定义映射规则
ORM 的特性,POJO 类和数据
库的映射关系;
|
级联操作
多表存在主外键关系时,主表和
从表之间的关联操作;
|
类型转换
数据库字段的类型和 POJO 类
属性的类型转换。
|
resultMap 元素的结构
<resultMap>
<constructor>
<idArg />
<arg />
</constructor>
<id />
<result />
<association />
<collection />
<discriminator>
<case />
</discriminator>
</resultMap
1
用于配置构造方法的元素。
<constructor>
2
标识主键列,允许多个主键。
<id>
3
POJO 到 SQL 列名的映射关系。
<result>
使用 POJO 存储结果集
<resultMap type="pojo.News" id="newsResultMap">
<id property="newId" column="news_id" />
<result property="title" column="title" />
<result property="author" column="author" />
</resultMap>
说明:
type 代表需要映射的 POJO 类;
id 是 resultMap 的唯一
标
识
@Delete 实现删除
@Update 实现更新
@Select 实现查询
@Result 实现结果集封装
@Results 可以与@Result 一起使用,封装多个结果集
@ResultMap 实现引用@Results 定义的封装
@One 实现一对一结果集封装
@Many 实现一对多结果集封装
属性
说明
property
映射到列结果的字段或者属性,通常是指 POJO 的属性;
column
对应的数据库字段;
javaType
Java 类型,可以是基本数据类型,也可以是类完全限定名;
jdbcType
JDBC 的类型,基本支持所有常用的数据库类型;
多表联查
级联(cascade),是指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率
一对一
一个对象对应唯一的对象,
举例:中国公民和身份证;
|
一对多
一个对象对应多个对象,
举例:班级和学生;
|
多对多
多个对象对应多个对象,
举例:公司角色和公司员工
|
一对一级联步骤
验证
编写测试类验证级联关系;
|
级联映射
利用 <association> 元素完
成一对一级联;
|
创建映射器
创建对应的映射器;
|
创建关联POJO
一对一级联时,以对象方式存
储关联关系;
|
一对多级联步骤
创建”一“方POJO
以集合的形式级联“多”方对
象
|
创建“多”方对象
创建“多”方的 POJO 对象
|
创建映射器
创建对应的映射器
|
实现一对多级联
利用 collection 元素实现一
对多的级联
|
测试
编写测试文件测试一对多级联
|
级联的缺陷
性能缺陷
级联操作会降低性能,
增加程序的执行时间;
复杂度缺陷
关联较多造成复杂度的
增加,不利于他人的理
解和维护;
使用建议
1.根据实际情况增加级联关系;
2.多层关联式,建议超过三层关联时尽量少用级联
mybatis的常用注解
@Insert 实现新增@Delete 实现删除
@Update 实现更新
@Select 实现查询
@Result 实现结果集封装
@Results 可以与@Result 一起使用,封装多个结果集
@ResultMap 实现引用@Results 定义的封装
@One 实现一对一结果集封装
@Many 实现一对多结果集封装