Mybatis基于注解開發(fā)
這幾年來注解開發(fā)越來越流行彼念,Mybatis也可以使用注解開發(fā)方式凿傅,這樣我們就可以減少編寫Mapper映射文件了
注解 | 說明 |
---|---|
@Insert | 實現(xiàn)新增 |
@Update | 實現(xiàn)更新 |
@Delete | 實現(xiàn)刪除 |
@Select | 實現(xiàn)查詢 |
@Result | 實現(xiàn)結(jié)果集封裝 |
@Results | 可以與@Result 一起使用,封裝多個結(jié)果集 |
@One | 實現(xiàn)一對一結(jié)果集封裝 |
@Many | 實現(xiàn)一對多結(jié)果集封裝 |
@Select("select * from student")
public List<Student> findAll();
@Insert("insert into student values (#{sid}, #{sname}, #{age}, #{birthday})")
@Options(useGeneratedKeys = true, keyColumn = "sid", keyProperty = "sid") //此操作只限于新增操作后放回主鍵值
int addStu(Student student);
@Update("update student set sname = #{sname}, age = #{age}, birthday = #{birthday} where sid = #{sid}")
int updateStu(Student student);
@Delete("delete from student where sid = #{id}")
int deleteStu(Integer id);
注意
:修改MyBatis的核心配置文件,我們使用了注解替代的映射文件熊昌,所以我們只需要加載使用了注解的Mapper接口即可
<mappers>
<!--掃描使用注解的類-->
<mapper class="com.itheima.mapper.UserMapper"></mapper>
</mappers>
或者指定掃描包含映射關(guān)系的接口所在的包也可以
<mappers>
<!--掃描使用注解的類所在的包-->
<package name="com.itheima.mapper"></package>
</mappers>
Mybatis基于注解實現(xiàn)多表操作
實現(xiàn)復(fù)雜關(guān)系映射之前我們可以在映射文件中通過配置<resultMap>,<result>,<association>,<collection>組合來實現(xiàn)蒲稳,使用注解開發(fā)后,我們可以使用@Results注解辜御,@Result注解鸭你,@One注解,@Many注解組合完成復(fù)雜關(guān)系的配置
測試數(shù)據(jù)來源于Mybatis進階階段
一對一操作
//PersonMapper接口
public interface PersonMapper {
//根據(jù)id查詢
@Select("SELECT * FROM person WHERE id=#{id}")
public abstract Person selectById(Integer id);
}
//CardMapper接口
public interface CardMapper {
//查詢?nèi)? @Select("SELECT * FROM card")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "number",property = "number"),
@Result(
property = "p", // 被包含對象的變量名
javaType = Person.class, // 被包含對象的實際數(shù)據(jù)類型
column = "pid", // 根據(jù)查詢出的card表中的pid字段來查詢person表
/*
one擒权、@One 一對一固定寫法
select屬性:指定調(diào)用哪個接口中的哪個方法
*/
one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")
)
})
public abstract List<Card> selectAll();
}
一對一操作注解解析
@Results:封裝映射關(guān)系的父注解
- Result[] value():定義了 Result 數(shù)組
@Result:封裝映射關(guān)系的子注解袱巨。
- column 屬性:查詢出的表中字段名稱
- property 屬性:實體對象中的屬性名稱
- javaType 屬性:被包含對象的數(shù)據(jù)類型
- one 屬性:一對一查詢固定屬性
@One:一對一查詢的注解。
- select 屬性:指定調(diào)用某個接口中的方法
一對多操作
//StudentMapper接口
public interface StudentMapper {
//根據(jù)cid查詢student表
@Select("SELECT * FROM student WHERE cid=#{cid}")
public abstract List<Student> selectByCid(Integer cid);
}
//ClassesMapper接口
public interface ClassesMapper {
//查詢?nèi)? @Select("SELECT * FROM classes")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(
property = "students", // 被包含對象的變量名
javaType = List.class, // 被包含對象的實際數(shù)據(jù)類型
column = "id", // 根據(jù)查詢出的classes表的id字段來查詢student表
/*
many碳抄、@Many 一對多查詢的固定寫法
select屬性:指定調(diào)用哪個接口中的哪個查詢方法
*/
many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
)
})
public abstract List<Classes> selectAll();
}
一對多操作注解解析
@Results:封裝映射關(guān)系的父注解愉老。
- Result[] value():定義了 Result 數(shù)組
@Result:封裝映射關(guān)系的子注解。
- column 屬性:查詢出的表中字段名稱
- property 屬性:實體對象中的屬性名稱
- javaType 屬性:被包含對象的數(shù)據(jù)類型
- many 屬性:一對多查詢固定屬性
@Many:一對多查詢的注解剖效。
- select 屬性:指定調(diào)用某個接口中的方法
多對多操作
//CourseMapper接口
public interface CourseMapper {
//根據(jù)學(xué)生id查詢所選課程
@Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")
public abstract List<Course> selectBySid(Integer id);
}
//StudentMapper接口
public interface StudentMapper {
//查詢?nèi)? @Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "age",property = "age"),
@Result(
property = "courses", // 被包含對象的變量名
javaType = List.class, // 被包含對象的實際數(shù)據(jù)類型
column = "id", // 根據(jù)查詢出student表的id來作為關(guān)聯(lián)條件嫉入,去查詢中間表和課程表
/*
many、@Many 一對多查詢的固定寫法
select屬性:指定調(diào)用哪個接口中的哪個查詢方法
*/
many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
)
})
public abstract List<Student> selectAll();
}
構(gòu)建SQL語句
- org.apache.ibatis.jdbc.SQL:構(gòu)建 SQL 語句的功能類璧尸。通過一些方法來代替
- SQL 語句的關(guān)鍵字咒林。
SELECT()
FROM()
WHERE()
INSERT_INTO()
VALUES()
UPDATE()
DELETE_FROM() - @SelectProvider:生成查詢用的 SQL 語句注解。
- @InsertProvider:生成新增用的 SQL 語句注解爷光。
- @UpdateProvider:生成修改用的 SQL 語句注解垫竞。
- @DeleteProvider:生成刪除用的 SQL 語句注解。
type 屬性:生成 SQL 語句功能類對象
method 屬性:指定調(diào)用方法
構(gòu)建SQL語句中最為常用的是@SelectProvider蛀序;
以@SelectProvide為例代碼演示:
//1.構(gòu)建SQL語句的生成類
public class sqlBuilder {
public String findByNameAge(@Param("sname") String sname, @Param("age") Integer age) {
//此處1=1是為后面參數(shù)拼接更加規(guī)范欢瞪,還有注意之間的空格
StringBuffer sql = new StringBuffer("select * from student where 1=1");
if (sname != null) {
sql.append(" and sname = #{sname}");
}
if (age != null) {
sql.append(" and age = #{age}");
}
return sql.toString();
}
}
//2.使用@xxxprovider注釋引入生成類
public interface StudentMapper {
@SelectProvider(type = sqlBuilder.class, method = "findByNameAge")
List<Student> findByNameAge(@Param("sname") String sname, @Param("age") Integer age);
}
//3.使用test類(這里使用了三層架構(gòu))
public class StudentTest {
private StudentService studentService = new StudentServiceImpl();
@Test
public void testQueryByNameAndAge() {
Student student = new Student(25, "小花", 18, new Date());
List<Student> s = studentService.findByNameAge(null, student.getAge());
//執(zhí)行后的SQL:select * from student where 1=1 and age = ?
System.out.println(s);
}
}