目录
一、映射器注解
1.映射器配置文件的缺陷
繁琐 配置文件的书写本身繁琐,需要掌 握的内容比较多
不直观 配置文件和接口直接只是名称相同, 对应起来比较麻烦
2.常用的注解
基本注解 | 实现简单的增删改查操作 |
结果映射注解 | 实现结果的映射关系, 也可以完成级联映射。 |
动态SQL注解 | 实现动态 SQL 的内容 |
二、基本注解
1.基本注解的分类
增加操作 | @Insert 类似 < insert > 完成新增 |
删除操作 | @Delete 类似 < delete > 完成删除 |
修改操作 | @Update 类似 < update > 完成修改 |
查询操作 | @Select 类似 < select > 完成查询 |
1.1 @Insert 新增
语法 : insert( " sql语句”)
功能:完成新增操作,类似配置文件的 元素;
说明:新增时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Insert("insert into student(sname,birthday,ssex,classid)"
+"values(#{sname},#{birthday},#{ssex},#{classid})")
//主键回填
@Options(useGeneratedKeys = true,keyProperty = "sid")
public int addStudent(Student s);
1.2 主键回填
语法:Options(useGeneratedKeys = true,keyProperty = "主键属性")
功能:完成数据库自增主键的回填;
1.3 主键自增
语法:SelectKey ( statement ="自增规则",keyProperty="主键属性",resultType =结果类型, before = true )
功能:完成自定义主键的自增;
1.4 @Delete 删除
语法:@Delete ( " sql语句”)
功能:完成删除操作,类似配置文件的 元素;说明:删除时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Delete("delete from student where sid=#{v}")
public int deleteStudent(int sid);
1.5 @Update 更新
语法:@Update ( " sql语句”)
功能:完成更新操作,类似配置文件的 元素;
说明:更新时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Update("update student set sname=#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid} where sid=#{sid}")
public int updateStudent(Student s);
1.6 @Selete 查询
语法:Selete ( " sql语句”)
功能:完成查询操作,类似配置文件的 元素;
说明:查询时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Select("select * from student where sid=#{v}")
public Student findStudentById(int sid);
@Select("select * from student")
public List<Student> findAllAtudent();
2.传递多个参数的方式
方法1:Map 方式 跟sqlmap一样
方法2:JavaBean 方式 跟sqlmap一样
方法3:@Param 方式
//多参 1.javaBean 2.Map 3.param数(1) 4.args 5.@param
@Select("select * from student where ssex=#{hehe} and classid=#{haha} limit #{weizhi},#{bc}")
public List<Student> findStudentByssexAndClassidlimit(
@Param("hehe") String ssex,
@Param("haha")int classid,
@Param("weizhi")int weizhi,
@Param("bc")int buchang
);
三、结果映射注解
1.@Results 结果映射
语法:Results({ @Result(id =是否为主键,column = "字段",property ="属性")))
功能:完成数据库字段和 JavaBean 属性的映射关系;
说明:每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。
2.@Results 复用
跟sqlmap的xml配合使用
语法:<resultMap id=”结果名称”>...</resultMap>ResultMap (“结果名称”)
跟当前接口中有定义使用id属性,每个sql 语句前要么有一个@Results映射关系,要 么要么@ResultMap,这两个不能同时给一 个sql语句语法
以前定义过的的@Results(id=“xxx"value={..})@ResultMap ("xxx”)
3.一对一映射
语法:One( Select =一对一查询方法,fetchType = FetchType.EAGER)
功能:一对一的关系映射;
说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。
3.1 一对一映射的实现案例
//查询学生和班级信息 1对1
@Results(id = "sc_Map",value= {
@Result(column="classid",property="classid"),
@Result(property = "bj",column="classid",
one=@One(select= "com.xn.mapper.BanjiMapper.findBanjiByClassid"))
})
@Select("select * from student")
public List<Student> findAllStudentAndClass();
@Select("select * from student where classid=#{v}")
public List<Student> findStudentBycalssid(int classid);
}
4.一对多映射
语法:Many( Select =一对多查询方法,fetchType = FetchType.EAGER )
功能:一对多的关系映射;
说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。
4.1 一对多映射的实现案例
package com.ztt.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.ztt.bean.Banji;
public interface BanjiMapper {
//一对多
@Select("select * from class where classid=#{v}")
public List<Banji> findBanjiByClassid(int classid);
@Results({
@Result(column = "classid",property="classid"),
@Result(property = "stulist",column="classid",
many=@Many(select="com.ztt.mapper.StudentMapper.findStudentBycalssid"))
})
@Select("select * from class")
public List<Banji> findAllBanjiAndStu();
}
四、动 态 S Q L 注 解
1.注解动态sql
- 脚本sql:XML配置方式的动态SQL,是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置
- 方法中构建sql@SelectProvider@lnsertProvider@UpdateProvider@ DeleteProvider这些方法的使用
- SQL 语句构造器实现动态 SQL 的内容
1.1 脚本动态sql
在sql语句中加入标签,按照之前sqlmap中的动态sql的样式书写
//方式1 脚本sql
@Select("<script>"
+"select * from student"
+"<where>"
+"<if test=\"ssex!=null\">#{ssex}</if>"
+"<if test=\"classid!=0\">#{classid}</if>"
+ "</where>"
+ "</script>")
public List<Student> findStudent(Student s);
1.2 @SelectProvider 的用法
- 创建 SQL 语句类 该类包含需要动态生成的 SQL 语句;
- 创建Mapper接口类 该类和配置文件的接口文件一 样,用来处理数据库操作;
- 利用@SelectProvider 将 SQL 语句类和 Mapper 接 口类关联,利用 @SelectProvider 的type 属 性和 method 属性;
- 测试验证 编写测试类,测试动态生成的 SQL 语句是否准确。
//方式二 在方法中创建sql语句
@SelectProvider(type=StudentSql.class,method = "getSelectStudentSql")
public List<Student> findStudentFunc(Student s);
1.3 方法中构建动态sql SQL 语句构造器
在接口中定义内部类,来构建需要的动态sql语句,比使用标签的方式结构更加清晰
功能:解决 Java 代码中嵌入 SQL 语句通过简单 地创建一个实例来调用方法生成SQL语句
特点 :没有过多的使用类如 and的连接词
//方式3 构造器生成sql语句 将方式2进行了封装 --构造器
@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 getSelectStudentSql(Student s) {
String sql="select * from student where 1=1 ";
if(s.getSsex()!=null){
sql += "and sssex=#{ssex}";
}
if(s.getClassid()!=0){
sql += "and classid=#{classid}";
}
return sql;
}
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}");
}
if (s.getSid() != 0) {
WHERE("sid = #{sid}");
}
}
}.toString();
}
public String getGzqDeleteStudentSql(int sid) {
return new SQL() {
{
DELETE_FROM("student");
WHERE("SID=#{V}");
}
}.toString();
}
1.4 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" 列表中 |