目录
一、映射器注解
1.映射器配置文件的缺陷
- 繁琐:配置文件的书写本身繁琐,需要掌握的内容比较多
- 不直观:配置文件和接口直接只是名称相同,对应起来比较麻烦.
2.常用的注解
- 基本注解:实现简单的增删改查操作。
- 结果映射注解:实现结果的映射关系, 也可以完成级联映射。
- 动态SQL注解:实现动态 SQL 的内容
二、基本注解
1.基本注解的分类
增加操作:@Insert 类似 < insert > 完成新增
删除操作:@Delete 类似 < delete > 完成删除
修改操作:@Update 类似 < update > 完成修改
查询操作:@Select 类似 < select > 完成查询
2.@Insert 新增
语法:
@Insert (“ sql 语句”)
功能:
完成新增操作,类似配置文件的元素;
说明:
新增时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map集合。
//接口:
@Insert("insert into student(sname,birthday,ssex,classid) values (#{sname},#{birthday},#{ssex},#{classid})")
public int addStudent(Student s);
注意:这时候就不需要xml文件了!
2.1. 主键回填
语法:
@Options(useGeneratedKeys = true, keyProperty = "主键属性")
功能:完成数据库自增主键的回填;
@Insert("insert into student(sname,birthday,ssex,classid) values (#{sname},#{birthday},#{ssex},#{classid})")
@Options(useGeneratedKeys = true , keyProperty = "sid")
public int addStudent(Student s);
2.2.主键自增
语法:
@SelectKey ( statement = "自增规则", keyProperty = "主键属性", resultType = 结果类型, before = true )
功能:完成自定义主键的自增;
3.@Delete 删除
语法:
@Delete (“ sql 语句”)
功能:完成删除操作,类似配置文件的 元素;
说明:删除时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Delete("delete from student where sid = #{v}")
public int deleteStudent(int sid);
4.@Update 更新
语法:@Update (“ sql 语句”)
功能:完成更新操作,类似配置文件的 元素;
说明:更新时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Update("update student set sname=#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid} where sid=#{sid}")
public int updateStudent(Student s);
5. @Selete 查询
语法:@Selete (“ sql 语句”)
功能:完成查询操作,类似配置文件的 元素;
说明:查询时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。
@Select("select * from student")
public List<Student> findAllStudent();
@Select("select * from student where sid = #{v}")
public Student findStudentById(int sid);
6. 传递多个参数的方式:
- 方法1:Map 方式 跟sqlmap一样
//传递多参的方式:Map(不推荐,耦合度太高) public List<Student> findStudentByClassidAndSsexLimit(Map<String,Object> map);
- 方法2:JavaBean 方式 跟sqlmap一样
//传递多参的方式:javaBean对象 public List<Student> findStudentByClassAndSsex(Student s);
- 方式3:arg方式
//传递多参的方式:arg数 数是从0开始 --> 和后面框架内置参数的名称 public List<Student> findStudentByClassidAndSsexLimitArg(int classid,String ssex,int weizhi,int buchang);
- 方法4:@Param 方式
//传递多参的方式:param数 数从1开始 推荐 public List<Student> findStudentByClassidAndSsexLimitParam(int classid,String ssex,int weizhi,int buchang);
三、结果映射注解
1.@Results 结果映射
语法:@Results({ @Result(id = 是否为主键, column = "字段", property = "属性" ) })
功能:完成数据库字段和 JavaBean 属性的映射关系;
说明:每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。
@Results({
@Result(column = "classid",property = "classid"),
@Select("select * from student")
public List<Student> findAllStudentAndClass();
2.@Results 复用(两种方式)
2.1跟sqlmap的xml配合使用
语法:
<resultMap id=”结果名称”>...</resultMap>
@ResultMap (“结果名称”)
2.2跟当前接口中有定义使用id属性,每个sql 语句前要么有一个@Results映射关系,要么要么@ResultMap,这两个不能同时给一 个sql语句
语法:
以前定义过的@Results(id=“xxx”value={...})
@ResultMap (“xxx”)
3.一对一映射
语法:
@One( Select = 一对一查询方法, fetchType = FetchType.EAGER )
功能:一对一的关系映射;
说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。
实现类中:
接口中:
//查询学生和班级的信息,一对一
@Results({
@Result(column = "classid",property = "classid"),
//一对一
@Result(property = "bj",column = "classid",one=@One(select = "com.zad.mapper.BanjiMapper.findBanjiByClassid"))
})
@Select("select * from student")
public List<Student> findAllStudentAndClass();
4.一对多映射
语法:@Many( Select = 一对多查询方法, fetchType = FetchType.EAGER )
功能:一对多的关系映射;
说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。
实现类中:
接口中:
@Select("select * from class where classid = #{v}")
public Banji findBanjiByClassid(int classid);
//一对多
@Results({
@Result(column = "classid",property = "classid"),
@Result(property = "stulist",column = "classid",many=@Many(select="com.zad.mapper.StudentMapper.findStudentByClassid"))
})
@Select("select * from class")
public List<Banji> findAllBanjiAndStu();
四、动态SQL注解
1.注解动态sql
(1)脚本sql:
XML配置方式的动态SQL,是用<script>的方式把它照搬过 来,用注解来实现。适用于xml 配置转换到注解配置
(2)方法中构建sql:
@SelectProvider
@InsertProvider
@UpdateProvider
@DeleteProvider 这些方法的使用
(3)SQL 语句构造器:
实现动态 SQL 的内容
2.脚本动态sql
在sql语句中加入标签,按照之前sqlmap中的动态sql的样式书写
// 方式一 脚本sql
@Select("<script>"
+ "select * from student"
+ "<where>"
+ "<if test=\"ssex != null\"> and ssex = #{ssex}</if>"
+ "<if test=\"classid != 0\"> and classid = #{classid}</if>"
+ "</where>"
+ "</script>")
public List<Student> findStudent(Student s);
3.@SelectProvider 的用法
(1)创建 SQL 语句类:该类包含需要动态生成的 SQL 语句;
(2)创建Mapper接口类:该类和配置文件的接口文件一 样,用来处理数据库操作;
(3)利用@SelectProvider:将 SQL 语句类和 Mapper 接 口类关联,利用 @SelectProvider 的 type 属 性和 method 属性;
(4)测试验证:编写测试类,测试动态生成的 SQL 语句是否准确。
// 方式二 在方法中创建动态sql语句
@SelectProvider(type = StudentSql.class, method = "getSelectStudentSql")
public List<Student> findStudentFunc(Student s);
4.其他的动态 SQL 方法
@InsertProvider:创建动态的 INSERT 语句
@UpdateProvider:创建动态的 UPDATE 语句
@DeleteProvider :创建动态的 DELETE 语句
5.方法中构建动态sql
在接口中定义内部类,来构建需要的动态sql语句,比使用标签的方式结构更加清晰
内部类:
@SelectProvider(type = StudentSql.class, method = "getSelectStudentSql")
public List<Student> findStudentFunc(Student s);
6.SQL 语句构造器
功能:解决 Java 代码中嵌入 SQL 语句,通过简单 地创建一个实例来调用方法生成SQL语句
特点:没有过多的使用类如 and的连接词
// 方式三 构造器生成动态sql语句 将方式二进行封装-- 构造器
@SelectProvider(type = StudentSql.class, method = "getGZQSelectStudentSql")
public List<Student> findStudentGZQ(Student s);
@InsertProvider(type = StudentSql.class, method = "getGZQInsertStudentSql")
public int addStudentGZQ(Student s);
@UpdateProvider(type = StudentSql.class, method = "getGZQUpdateStudentSql")
public int updateStudentGZQ(Student s);
@DeleteProvider(type = StudentSql.class, method = "getGZQDeleteStudentSql")
public int deleteStudentGZQ(int sid);
内部类:
// 内部类
class StudentSql{
public String getGZQSelectStudentSql(Student s) {
return new SQL() {
{
// 字段名
SELECT("sid,sname");
SELECT("birthday");
SELECT("ssex,classid");
// 表
FROM("student");
// 条件
if(s.getSsex() != null) {
WHERE("ssex = #{ssex}");
}
if(s.getClassid() != 0) {
WHERE("classid = #{classid}");
}
}
}.toString();
}
public String getGZQInsertStudentSql(Student s) {
return new SQL() {
{
INSERT_INTO("student");
if(s.getSid() != 0) {
VALUES("sid","#{sid}");
}
if(s.getSname() != null) {
VALUES("sname","#{sname}");
}
if(s.getBirthday() != null) {
VALUES("birthday","#{birthday}");
}
if(s.getSsex() != null) {
VALUES("ssex", "#{ssex}");
}
if(s.getClassid() != 0) {
VALUES("classid", "#{classid}");
}
}
}.toString();
}
public String getGZQUpdateStudentSql(Student s) {
return new SQL() {
{
UPDATE("student");
if(s.getSname() != null) {
SET("sname = #{sname}");
}
if(s.getBirthday() != null) {
SET("birthday=#{birthday}");
}
if(s.getSsex() != null) {
SET("ssex= #{ssex}");
}
if(s.getClassid() != 0) {
SET("classid=#{classid}");
}
WHERE("sid = #{sid}");
}
}.toString();
}
public String getGZQDeleteStudentSql(int sid) {
return new SQL() {
{
DELETE_FROM("student");
WHERE("sid = #{v}");
}
}.toString();
}
}
7.SQL 语句构造器的常用方法
属性名 | 说明 |
SELECT | 开始或插入到 SELECT 子句,可以被多次调用,参数也会添加到 SELECT子句。 |
FROM | 开始或插入到 FROM 子句,可以被多次调用,参数也会添加到 FROM 子句 |
WHERE | 插入新的 WHERE 子句条件,可以多次被调用 |
OR / AND | 使用 OR / AND 来分隔当前的 WHERE 子句的条件 |
DELETE_FROM | 开始一个 delete 语句并指定需要从哪个表删除的表名。 |
INSERT_INTO | 开始一个 insert 语句并指定需要插入数据的表名 |
VALUES | 插入到 insert 语句中。第一个参数是要插入的列名,第二个参数则是该列的值。 |
UPDATE | 开始一个 update 语句并指定需要更新的表名 |
SET | 针对 update 语句,插入到 "set" 列表中 |
总结:
• @Insert ,@Delete,@Update,@Select 注解的功能
• 分别完成新增,删除,修改和查询操作;
• @Results 注解和 @ResultMap 注解的功能
• @Results 定义结果映射,@ResultMap 调用对应的结果映射;
• 动态 SQL 的注解
• @SelectProvider 查询语句的动态SQL,@InsertProvider 新增语句的动态SQL, @DeleteProvider 删除语句的动态SQL,@UpdateProvider 修改语句的动态SQL;
• SQL 语句构造器的功能
• 解决 Java 代码中嵌入 SQL 语句,通过简单地创建一个实例来调用方法生成SQL语句;