动态SQL与多表关联
sqlMapConfig.xml中常用标签
配置标签名称 | 功能 | 属性或子元素 |
---|---|---|
properties | 加载外部的属性文件 | 属性 resource:加载类路径下属性文件 属性 url:加载网络或本地目录下文件 子元素property:在文档内部定义键和值, 内部同名的会被外部覆盖 |
typeAliases | 给实体类定义别名 | 子元素 typeAliase: 每行定义一个实体类 子元素 package: 给整个包下所有的实体类定位别名,别名是类名 |
mappers | 指定实体映射文件 | 子元素 mapper: 每行指定一个实体类映射文件 子元素 package: 指定一个包下所有的实体类映射文件 文件名与DAO接口名字要相同,在同一个包下 |
实体类映射文件的配置元素
-
select 标签的属性 说明 namespace 指定DAO接口的完全限定类名字 id 方法名,所以在DAO接口中没有方法重载 resultType 返回的数据类型,如果是集合,指定集合中元素类型 标签体 要查询的SQL语句 -
测试类
三个核心类 作用 SqlSessionFactoryBuilder 工厂建造类,只需要直接new出来就可以了 SqlSessionFactory 创建会话工厂,读取核心配置文件 SqlSession 通过会话工厂创建会话,每次访问数据库都要创建自己的会话
会话是轻量级对象,不能共享使用,每次使用完毕要关闭 -
说说以下标签的使用
标签 子标签 说明 <select> 查询 <insert> 添加 <selectKey> 获取主键的值
mysql函数:last_insert_id()<update> 更新 <delete> 删除 注:insert, update, delete这三个可以乱用,但不建议乱用。
-
sqlSession提交事务的2种方式
增删改必须要提交事务,mybatis默认是手动提交事务
- factory.openSession(true)
- sqlSession.commit()
学习标签
-
if
<if test="id != null"> id = #{id} </if>
-
where
- 自定生成where关键字
- 自动去掉多余的and
-
foreach
- collection:指定遍历的对象(list)
- item: 对应遍历中每一次的对象
- separator: 分隔符
properties
- 作用: 加载properties文件,并在核心配置文件中使用
- 使用:
- 利用properties标签加载properties文件
- 利用$直接使用对应配置文件中的key
一对一
-
映射配置文件的变化
SELECT c.id cid,number,pid,NAME,age FROM card c,person p WHERE c.pid=p.id
-
ResultMap
- 作用:通过手动的方式将查询的字段映射到实体的某一个字段
- 作用:相当于方法的返回值
-
ResultMap标签
- id: 指定表中的id属性
- colunm: 指定查询结果字段名
- property:指定的是实体属性名
- result: 其他的属性
- colunm: 指定查询结果字段名
- property:指定的是实体属性名
- association: 定义引用数据类型
- property:指定实体中的引用属性名
- javaType:当前属性的类型
- id: 指定表中的id属性
-
一对一
- 修改了SQL映射文件中标签返回值的部分
- association
-
一对多
- collection
ResultMap
- 作用:ResultMap他就是一个方法的返回值的对应映射,等价于ResultType
- ResultMap相当于一个通用返回值类型,具体返回值类型通过type属性指定
标签
- association, 一对一
- collection, 一对多
注解开发
-
注解
- @Select
- @insert
- @Update
- @Delete
ResultMap, 对应方法的返回值
- 被封装类型中包含实体类型(student),用什么子标签
- association
- 如果被封装类型中包含集合属性
- collection
- 主键属性标签
- id
- 普通属性标签
- result
- 在映射配置文件中使用ResultMap也就相当于最终需要把查询结果集的每一字段封装为一个Id标签或则Result
注解开发多表查询
- @Results,作用:可以包含多个@Result
- @Result,作用:每一个Result映射一个查询字段到实体属性
- 如果被封装类型包含单个实体类型(student)
- @One
- @Many
- 在注解开发中每一查询结果字段最终都将被封装为一个Result
注意:
在开发中,不要混用注解开发和配置文件配置。
单表:
@Select @Insert @Update @Delete
如果结果集和最终的实体类属性没有直接对应关系,映射关系的配置使用 @Results注解。
在Results注解中,使用 @Result注解配置单个字段的对应关系。id属性用于指定当前是否是主键。
Results注解可以使用id属性指定一个唯一标识,供其他方式复用
在方法上,如果使用 @ResultMap指定一个Results注解的id,就代表引用了这个Results注解中配置的映射关系。
多表
一对一:
使用Result注解的one属性指定要封装的实体类
one属性的数据类型是一个注解
@One:
select:指定的是一个statement的id,用于查找另一个dao中的方法查询实体类作为值设置到当前属性上。
fetchType:用于指定加载的方式,可以是懒加载或者直接加载。一般配置为直接加载
一对多:
使用Result注解的many属性指定要封装的实体类
many属性的数据类型是一个注解
@Many:
select:指定的是一个statement的id,用于查找另一个dao中的方法查询实体类作为值设置到当前属性上。
fetchType:用于指定加载的方式,可以是懒加载或者直接加载。一般配置为懒加载
第一步首先 导入mybatis 相关jar包;
2 配置mybatis核心配置文件
添加注解和操作的SQL语句
最后测试