多表联查
级联
级联(cascade),是指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率
一对一:一个对象对应唯一的对象
举例:中国公民和身份证
一对多:一个对象对应多个对象
举例:班级和学生
多对多:多个对象对应多个对象
举例:公司角色和公司员工
一对一级联:
步骤:
映射:首先在实体类中添加级联表的对象
一对多级联:
步骤:
映射:首先在实体类中添加级联表的对象list集合
级联的缺陷
性能缺陷:
级联操作会降低性能,增加程序的执行时间;
复杂度缺陷:
关联较多造成复杂度的 增加,不利于他人的理 解和维护
使用建议:
1、根据实际情况增加级联关系
2、多层关联式,建议超过三层关联时尽量少使用级联
3、非用不可的话,可以将多层关联分解成一对一 、 一对多
注解
映射器配置文件的缺陷:
1、繁琐:
配置文件的书写本身繁琐,需要掌握的内容比较多
2、不直观:
配置文件和接口直接只是名称相同,对应起来比较麻烦
映射器注解:
1、基本注解:
实现简单的增删改查操作。
分类:
//增加操作 @Insert
类似 < insert > 完成新增
//删除操作 @Delete
类似 < delete > 完成删除
//修改操作 @Update
类似 < update > 完成修改
//查询操作 @Select
类似 < select > 完成查询
@Insert
语法:
@Insert (“ sql 语句”)
示例:
@Insert (“insert into news (title,author)values (#{ title } ,#{author}) ”)
public void addNews (News news);
说明:
新增时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
【主键回填】:完成数据库自增主键的回填
语法:
@Options(useGeneratedKeys = true, keyProperty = "主键属性")
示例:
@Insert (“insert into news (title,author)values (#{ title } ,#{author}) ”)
@Options( useGeneratedKeys = true, keyProperty = "newsId" )
public void addNews (News news);
【主键自增】:完成自定义主键的自增
语法:
@SelectKey ( statement = "自增规则", keyProperty = "主键属性", resultType = 结果类型, before = true )
示例:
@SelectKey ( statement = "select max(newsid) + 1 as newsId from news", keyProperty = "newsId",resultType = int.class, before = true )
@Insert(...)
public void addNews (News news);
@Delete
语法:
@Delete (“ sql 语句”)
示例:
@Delete (“delete from news where newsid = #{ newsId } ”)
public void delNews (News news);
说明:
删除时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Update
语法:
@Update (“ sql 语句”)
示例:
@Update (“update news set title =#{title},author = #{author})
public void updateNews (News news);
说明:
更新时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合
@Select
语法:
@Selete (“ sql 语句”)
示例:
@Selete (“select * from news where title = #{title}”)
public List<News> getNews (News news);
说明:
查询时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。
传递多个参数的方式:
方法1:Map
方法2:JavaBean
方法3:@Param
方法4:arg0,arg1(数字从0开始)
方法5:@param(从1开始)
2、结果映射注解:
实现结果的映射关系,也可以完成级联映射。
@Results 结果映射
语法:
@Results({ @Result(id = 是否为主键, column = "字段", property = "属性" ) })
示例:
@Results({
@Result(id = false, column = "title", property = "title"),
@Result(id = false, column = "author", property = "author")})
public void getNews (News news);
说明:
每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。
@Results 复用 (跟 sqlmap 的 xml 配合使用)
语法:
<resultMap id=”结果名称”>...</resultMap>
@ResultMap (“结果名称”)
示例:
<resultMap id=”result1”>...</resultMap>
@ResultMap (“result1”)
public List<News> getNews (News news);
注意:跟当前接口中有定义使用id属性,每个sql语句前要么有一个@Results映射关系,要么要么@ResultMap,这两个不能同时给一个sql语句
语法:
以前定义过的的@Results(id=“xxx”value={...})
@ResultMap (“xxx”)
示例:
一对一映射:
语法:
@One( Select = 一对一查询方法, fetchType = FetchType.EAGER )
示例:
@Results({@Result(column="card_id",property="card", one = @One ( select="dao.CardMapper.getCardById",fetchType=FetchType.EAGER ) ) })
public void getNews (News news);
说明:
FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。
案例:
一对多映射:
语法:
@Many( Select = 一对多查询方法,fetchType = FetchType.EAGER )
示例:
@Results({@Result(column="type_id",property="news", many = @Many ( select="dao.NewsMapper.getNewsByType",fetchType=FetchType.EAGER ) ) })
public void getNews (News news);
说明:
FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。