映 射 器 注 解
映射器配置文件的缺陷
繁琐:配置文件的书写本身繁琐,需要掌 握的内容比较多
不直观:配置文件和接口直接只是名称相同, 对应起来比较麻烦.
常用的注解
基本注解 实现简单的增删改查操作。
结果映射注解 实现结果的映射关系, 也可以完成级联映射。
动态SQL注解 实现动态 SQL 的内容
基 本 注 解
基本注解的分类
增加操作:@Insert 类似 < insert > 完成新增
删除操作:@Delete 类似 < delete > 完成删除
修改操作:@Update 类似 < update > 完成修改
查询操作:@Select 类似 < select > 完成查询
@Insert 新增
功能:完成新增操作,类似配置文件的 元素;
说明:新增时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
主键回填
功能:完成数据库自增主键的回填;
主键自增
功能:完成自定义主键的自增;
@Delete 删除
功能:完成删除操作,类似配置文件的 元素;
说明:删除时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Update 更新
功能:完成更新操作,类似配置文件的 元素;
说明:更新时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
@Selete 查询
功能:完成查询操作,类似配置文件的 元素;
说明:查询时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。
传递多个参数的方式:
方法1:Map 方式 跟sqlmap一样 方法
2:JavaBean 方式 跟sqlmap一样 方法
3:@Param 方式
结 果 映 射 注 解
@Results 结果映射
功能:完成数据库字段和 JavaBean 属性的映射关系;
说明:每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。
@Results 复用
跟sqlmap的xml配合使用
跟当前接口中有定义使用id属性,每个sql 语句前要么有一个@Results映射关系,要 么要么@ResultMap,这两个不能同时给一 个sql语句
一对一映射
功能: 一对一的关系映射;
说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。
一对多映射
动 态 S Q L 注 解
注解动态sql
脚本sql:
XML配置方式的动态SQL,是 用<script>的方式把它照搬过 来,用注解来实现。适用于xml 配置转换到注解配置
方法中构建sql 2
@SelectProvider @InsertProvider @UpdateProvider @DeleteProvider 这些方法的使用
SQL 语句构造器
实现动态 SQL 的内容
脚本动态sql
在sql语句中加入标签,按照之前sqlmap中的动态sql的样式书写
@SelectProvider 的用法
其他的动态 SQL 方法
方法中构建动态sql
在接口中定义内部类,来构建需要的动态sql语句,比使用标签的方式结构更加清晰
SQL 语句构造器
SQL 语句构造器的常用方法
package com.xn.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.xn.bean.Student;
public interface StudentMapper {
@Insert("insert into student(sname,birthday,ssex,classid)"
+"values(#{sname},#{birthday},#{ssex},#{classid})")
@Options(useGeneratedKeys = true,keyProperty = "sid")
public int addStudent(Student s);
@Update("update student set sname=#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid} where sid=#{sid}")
public int updateStudent(Student s);
@Delete("delete from student where sid=#{v}")
public int deleteStudent(int sid);
@Select("select * from student where sid=#{v}")
public Student findStudentById(int sid);
@Select("select * from student")
public List<Student> findAllAtudent();
//多参 1.JavaBean 2.Map 3.param数(1) 4.arg(0) 5.@Param
@Select("select * from student where ssex=#{a} and classid=#{b} limit #{c},#{d}")
public List<Student> findStudentByssexAndClassidLimit(
@Param("a")String ssex,
@Param("b")int classid,
@Param("c")int weizhi,
@Param("d")int buchang);
//查询学生和班级信息 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 class where classid=#{v}")
public List<Student> findBanjiByClassid(int classid);
@Select("select * from student where classid=#{v}")
public List<Student> findStudentBycalssid(int classid);
}
package com.xn.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.xn.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.xn.mapper.StudentMapper.findStudentBycalssid"))
})
@Select("select * from class")
public List<Banji> findAllBanjiAndStu();
}
package com.xn.mapper;
import java.util.List;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.jdbc.SQL;
import com.xn.bean.Student;
public interface StudentMapper {
// 动态sql
// 方式1
@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);
// 方式2 在方法中创建sql语句
@SelectProvider(type = StudentSql.class, method = "getSelectStudentSql")
public List<Student> FindStudentFunc(Student s);
// 方式3 构造器生成动态sql语句 将方式2进行封装---构造器
@SelectProvider(type = StudentSql.class, method = "getSelectStudentSql")
public List<Student> FindStudentGZQ(Student s);
@InsertProvider(type = StudentSql.class, method = "getGZQInsertStudentSql")
public int AddStudent(Student s);
@UpdateProvider(type = StudentSql.class, method = "getGZQUpdateStudentSql")
public int UpdateStudent(Student s);
@DeleteProvider(type = StudentSql.class, method = "getGZQDeleteStudentSql")
public int DeleteStudent(int sid);
// 内部类
class StudentSql {
public String getSelectStudentSql(Student s) {
String sql = "select * from student where 1=1";
if (s.getSsex() != null) {
sql += "and ssex=#{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();
}
}
}