1.Mybatis 注解開發(fā)
2.Mybatis 注解實(shí)現(xiàn)多表操作
3.Mybatis 構(gòu)建SQL語(yǔ)句
4.Mybatis 案例實(shí)現(xiàn)
1.Mybatis 注解開發(fā)
- 常用注解
@Select("查詢的SQL語(yǔ)句"): 執(zhí)行查詢操作注解
@Insert("新增的SQL語(yǔ)句"): 執(zhí)行新增操作注解
@Update("修改的SQL語(yǔ)句"): 執(zhí)行修改操作注解
@Delete("刪除的SQL語(yǔ)句"): 執(zhí)行刪除操作注解- 配置映射關(guān)系
<!--配置映射關(guān)系-->
<mappers>
<package name="接口所在包"/>
</mappers>
注解實(shí)現(xiàn)查詢操作
1.創(chuàng)建接口和查詢方法
2.在核心配置文件中配置映射關(guān)系
3.編寫測(cè)試類
- 封裝類
public class Student {
private Integer id;
private String name;
private Integer age;
- 接口類-注解方法編寫sql語(yǔ)句
public interface StudentMapper {
//查詢?nèi)康牟僮? @Select("SELECT * FROM student")
public abstract List<Student> selectAll();
}
- 核心配置文件,只需添加配置文件,不需要加載映射配置文件標(biāo)簽
<!--配置映射關(guān)系-->
<mappers>
<package name="com.itheima.mapper"/>
</mappers>
- 測(cè)試單元
public class Test01 {
@Test
public void selectAll() throws IOException {
//1.加載核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//2.獲取SqlSession工廠類對(duì)象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3.通過工廠類對(duì)象獲取SqlSession對(duì)象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//4.獲取StudentMapper接口的實(shí)現(xiàn)類對(duì)象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
List<Student> list = mapper.selectAll();
//處理結(jié)果
for (Student student : list) {
System.out.println(student);
}
sqlSession.close();
is.close();
}
}
- 測(cè)試結(jié)果
注解實(shí)現(xiàn)新增操作
1.創(chuàng)建接口和新增方法
2.在核心配置文件中配置映射關(guān)系
3.編寫測(cè)試類
- 封裝類不變
- 接口類- 新增注解方法編寫SQL語(yǔ)句
//新增操作
@Insert("insert into student values(#{id},#{name},#{age})")
public abstract Integer insert(Student stu);
- 核心配置文件不變
- 測(cè)試單元
@Test
public void insert() throws IOException {
//注意: 這里前面四個(gè)步驟和查詢的測(cè)試單元一樣,我這里省略了..........
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
Student stu1 = new Student(12, "金吒", 555);
Integer insert = mapper.insert(stu1);
//處理結(jié)果
System.out.println(insert);
sqlSession.close();
is.close();
}
- 測(cè)試結(jié)果
注解實(shí)現(xiàn)修改操作
- 封裝類不變
- 接口類- 修改注解方法編寫SQL語(yǔ)句
//修改操作
@Update("update student set name=#{name},age=#{age} where id=#{id}")
public abstract Integer update(Student stu);
- 核心配置文件不變
- 測(cè)試單元
@Test
public void upadte() throws IOException {
//注意: 這里前面四個(gè)步驟和查詢的測(cè)試單元一樣,我這里省略了..........
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
Student stu1 = new Student(12, "哪吒", 18);
Integer result= mapper.update(stu1);
//處理結(jié)果
System.out.println(result);
sqlSession.close();
is.close();
}
- 測(cè)試結(jié)果
注解實(shí)現(xiàn)刪除操作
- 封裝類不變
- 接口類- 刪除注解方法編寫SQL語(yǔ)句
//刪除操作
@Delete("delete from student where id=#{id}")
public abstract Integer delete(Integer id);
- 核心配置文件不變
- 測(cè)試單元
@Test
public void delete() throws IOException {
//注意: 這里前面四個(gè)步驟和查詢的測(cè)試單元一樣,我這里省略了..........
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
Integer result = mapper.delete(12);
//處理結(jié)果
System.out.println(result);
sqlSession.close();
is.close();
}
- 測(cè)試結(jié)果
2.Mybatis 注解實(shí)現(xiàn)多表操作
一對(duì)一
- @Results: 封裝映射關(guān)系的父注解
Result[] value(): 定義了Result數(shù)組- @Restult: 封裝映射關(guān)系的子注解
column屬性: 查詢出的表中字段名稱
property屬性: 實(shí)體對(duì)象中的屬性名稱
javaType屬性: 被包含對(duì)象的數(shù)據(jù)類型
one屬性: 一對(duì)一查詢固定屬性- @One: 一對(duì)一查詢的注解
select屬性: 指定調(diào)用某個(gè)接口中的方法- 封裝對(duì)象
//get,set,toString等方法省略
public class Card {
private Integer id;
private String number;
private Person P;
}
//get,set,toString等方法省略
public class Person {
private Integer id;
private String name;
private Integer age;
}
- 核心配置文件
<!--配置映射關(guān)系-->
<mappers>
<package name="com.itheima.one_to_one"/>
</mappers>
- 查詢?nèi)拷涌?/li>
//一對(duì)一注解開發(fā)方式
public interface CardMapper {
//查詢?nèi)? @Select("select * from card")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "number",property = "number"),
@Result(
property = "P", //被包含對(duì)象的變量名
javaType = Person.class, //被包含對(duì)象的實(shí)際數(shù)據(jù)類型
column = "pid", //根據(jù)查詢處的card表中的pid字段,來查詢person表
/*
one,@One: 一對(duì)一查詢的固定寫法
select屬性: 指定調(diào)用哪個(gè)接口中的哪個(gè)方法
*/
one=@One(select ="com.itheima.one_to_one.PersonMapper.selectById" )
)
})
public abstract List<Card> selectAll();
}
- 根據(jù)id查詢接口
public interface PersonMapper {
//根據(jù)id查詢
@Select("select * from person where id=#{id}")
public abstract Person selectById(Integer id);
}
- 測(cè)試單元
public class Test01 {
@Test
public void selectAll() throws IOException {
//加載核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//獲取SqlSession工廠類對(duì)象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通過工廠類對(duì)象獲取SqlSession對(duì)象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//獲取StudentMapper接口的實(shí)現(xiàn)類對(duì)象
CardMapper mapper = sqlSession.getMapper(CardMapper.class);
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
List<Card> list = mapper.selectAll();
//處理結(jié)果
for (Card card : list) {
System.out.println(card);
}
sqlSession.close();
is.close();
}
}
- 測(cè)試結(jié)果
一對(duì)多
- many屬性: 一對(duì)多查詢固定屬性
- @Many: 一對(duì)多查詢的注解
select屬性: 指定調(diào)用某個(gè)接口中的方法
- 封裝類
//get,set,等方法省略
public class Person {
private Integer id;
private String name;
private Integer age;
}
//get,set,等方法省略
public class Classes {
private Integer id; //主鍵id
private String name; //班級(jí)名稱
private List<Student> students; //班級(jí)中所有學(xué)生對(duì)象
- 一對(duì)多的注解開發(fā)的接口
public interface ClassesMapper {
//查詢?nèi)? @Select("Select * from classes")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(
property = "students", //被包含對(duì)象的變量名
javaType = List.class, //被包含對(duì)象的數(shù)據(jù)類型
column = "id", //根據(jù)查詢處的classes表的id字段來查詢student表
/*
一對(duì)多固定的寫法
*/
many=@Many(select = "com.itheima.one_to_many.StudentMapper.selectById")
)
})
public abstract List<Classes> selectAll();
}
- 以ClassMapper接口的查詢結(jié)果的id,作為StudentMapper接口中查詢方法的參數(shù)
public interface StudentMapper {
//根據(jù)id查詢
@Select("Select * from student where cid=#{id}")
public abstract List<Student> selectById(Integer id);
}
- 測(cè)試單元
public class Test1 {
@Test
public void selectAll() throws IOException {
//加載核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//獲取SqlSession工廠類對(duì)象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通過工廠類對(duì)象獲取SqlSession對(duì)象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//獲取StudentMapper接口的實(shí)現(xiàn)類對(duì)象
ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
List<Classes> list = mapper.selectAll();
//處理結(jié)果
for (Classes cls : list) {
System.out.println(cls.getId()+","+cls.getName());
List<Student> stu = cls.getStudents();
for (Student student : stu) {
System.out.println(student);
}
}
sqlSession.close();
is.close();
}
}
- 測(cè)試結(jié)果
多對(duì)多查詢
- 封裝類
public class Course {
private Integer id; //主鍵id
private String name; //課程名稱
}
public class StudentAddCource {
private Integer id; //主鍵id
private String name; //學(xué)生新明
private Integer age; //學(xué)生年齡
private List<Course> courses; //指當(dāng)前學(xué)生所選擇的課程集合
}
- 接口
public interface CourseMapper {
//根據(jù)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> selectById();
}
- 查詢所有學(xué)生接口,通過結(jié)果的id,調(diào)用CourseMapper中的根據(jù)id查詢的方法
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")
//這條語(yǔ)句主要是篩選掉沒有選課的學(xué)生
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "age",property = "age"),
@Result(
property = "courses",
javaType = List.class,
column = "id",
many =@Many(select = "com.itheima.many_to_many.CourseMapper.selectById")
)
})
public abstract List<StudentAddCource> selectAll();
}
- 測(cè)試單元
@org.junit.Test
public void selectAll() throws IOException {
//加載核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//獲取SqlSession工廠類對(duì)象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通過工廠類對(duì)象獲取SqlSession對(duì)象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//獲取StudentMapper接口的實(shí)現(xiàn)類對(duì)象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//調(diào)用實(shí)現(xiàn)類中的方法,接收結(jié)果
List<StudentAddCource> studentAddCources = mapper.selectAll();
//處理結(jié)果
for (StudentAddCource cls : studentAddCources) {
System.out.println(cls.getId()+","+cls.getName()+","+cls.getAge());
List<Course> courses = cls.getCourses();
for (Course cours : courses) {
System.out.println("\t"+cours);
}
}
sqlSession.close();
is.close();
}
- 測(cè)試結(jié)果
3.Mybatis 構(gòu)建SQL語(yǔ)句
org.apache.ibatis.jdbc.SQL功能類,專門用于構(gòu)建SQL語(yǔ)句
- 定義功能類并提供獲取查詢的SQL語(yǔ)句的方法
- @SelectProvider: 生成查詢用的SQL語(yǔ)句注解
type屬性: 生成SQL語(yǔ)句功能類對(duì)象
method屬性: 指定調(diào)用方法
//定義方法,返回查詢的SQL語(yǔ)句
public String getSelectAll(){
String sql = new SQL() {
{
SELECT("*");
FROM("student");
}
}.toString();
return sql;
}
- 定義功能類并提供獲取新增的SQL語(yǔ)句的方法
- @InsertProvider: 生成新增用的SQL語(yǔ)句注解
type屬性: 生成SQL語(yǔ)句功能類對(duì)象
method屬性: 指定調(diào)用方法
//定義方法,返回添加的SQL語(yǔ)句
public String getInsert(Student stu){
return new SQL() {
{
INSERT_INTO("student");
INTO_VALUES("#{id},#{name},#{age}");
}
}.toString();
}
- 定義功能類并提供獲取修改的SQL語(yǔ)句的方法
- @UpdateProvider: 生成修改用的SQL語(yǔ)句注釋
type屬性: 生成SQL語(yǔ)句功能類對(duì)象
method屬性: 指定調(diào)用方法
//定義方法,返回修改的SQL語(yǔ)句
public String getUpdate(Student stu){
return new SQL() {
{
UPDATE("student");
SET("name=#{name},age=#{age}");
WHERE("id=#{id}");
}
}.toString();
}
- 定義功能類并提供獲取刪除的SQL語(yǔ)句的方法
- DeleteProvider: 生成刪除用的SQL語(yǔ)句注解
type屬性: 生成SQL語(yǔ)句功能類對(duì)象
method屬性: 指定調(diào)用方法
//定義方法,返回修改的SQL語(yǔ)句
public String getDelete(Integer id){
return new SQL() {
{
DELETE_FROM("student");
WHERE("id=#{id}");
}
}.toString();
}