MyBatis接口代理方式多表操作和注解开发
多表模型分类:
- 一对一:在任意一方建立外键,关联对方的主键。
- 一对多:在多的一方建立外键,关联一的一方的主键。
- 多对多:借助中间表,中间表至少两个字段,分别关联两张表的主键
一对一的多表操作
一对一模型:人和身份证,一个人只能有一个身份证,一个身份证也只代表一个人
环境准备:
-
导包
-
数据库准备两张表
-
bean包下准备两个类,分别代表两张表
-
创建核心配置文件
-
创建映射配置文件并引入到核心配置文件
<!-- mappers引入映射配置文件 --> <mappers> <mapper resource="com/itheima/one_to_one/OneToOneMapper.xml"/> <mapper resource="com/itheima/one_to_many/OneToManyMapper.xml"/> <mapper resource="com/itheima/many_to_many/ManyToManyMapper.xml"/> </mappers>
-
创建一对一多表操作接口
一对一多表操作实现
- 编辑映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.table01.OneToOneMapper">
<!--配置字段和实体对象属性的映射关系-->
<resultMap id="oneToOne" type="card">
<!--把id的值赋值给cid-->
<id column="cid" property="id" />
<result column="number" property="number"/>
<!--
association:配置被包含对象的映射关系
property:被包含对象的变量名
javaType:被包含对象的数据类型
-->
<association property="p" javaType="Person">
<id column="pid" property="id" />
<result column="NAME" property="name"/>
<result column="age" property="age"/>
</association>
</resultMap>
一对多多表操作实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.table02.OneToManyMapper">
<resultMap id="oneToMany" type="classes">
<id column="cid" property="id"/>
<result column="cname" property="name"/>
<!--
collection:配置被包含的集合对象映射关系
property:被包含对象的变量名
ofType:被包含对象的实际数据类型
-->
<collection property="students" ofType="student">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="sage" property="age"/>
</collection>
</resultMap>
<select id="selectAll" resultMap="oneToMany">
SELECT c.id cid,c.name cname,s.id sid,s.name sname,s.age sage FROM classes c,student s WHERE c.id=s.cid
</select>
</mapper>
-
:配置字段和对象属性的映射关系标签
- id属性:唯一标识
- type属性:实体对象类型
-
:配置主键映射关系标签
-
:配置非主键映射关系标签
- column属性:表中字段名称
- property属性:实体对象变量名称
-
:配置被包含对象的映射关系标签。
- property属性:被包含对象的变量名
- javaType属性:被包含对象的数据类型
-
:配置被包含集合对象的映射关系标签
- property属性:被包含集合对象的变量名
- oftype属性:集合中保存的对象数据类型
MyBatis注解开发
我们除了可以使用映射配置文件来操作以外,还可以使用注解形式来操作。
注解可以简化开发操作,省略映射配置文件的编写
注解实现查询操作
-
创建接口和查询方法
-
在核心配置文件中配置映射关系
-
编写测试类
接口代码:
public interface StudentMapper {
//查询全部
@Select("SELECT * FROM student")
public abstract List<Student> selectAll();
//新增操作
@Insert("INSERT INTO student VALUES (#{id},#{name},#{age})")
public abstract Integer insert(Student stu);
//修改操作
@Update("UPDATE student SET name=#{name},age=#{age} WHERE id=#{id}")
public abstract Integer update(Student stu);
//删除操作
@Delete("DELETE FROM student WHERE id=#{id}")
public abstract Integer delete(Integer id);
}
配置映射关系:
<mappers>
<package name="com.itheima.mapper"/>
</mappers>
测试方法:
public void selectAll() throws Exception{
//1.加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//2.获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3.通过工厂对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//4.获取StudentMapper接口的实现类对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//5.调用实现类对象中的方法,接收结果
List<Student> list = mapper.selectAll();
//6.处理结果
for (Student student : list) {
System.out.println(student);
}
//7.释放资源
sqlSession.close();
is.close();
}
注解实现多表操作
注解实现多表操作的重点就在于接口方法的编写
一对一的注解写法:
public interface CardMapper {
//查询全部
@Select("SELECT * FROM card")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "number",property = "number"),
@Result(
property = "p", // 被包含对象的变量名
javaType = Person.class, // 被包含对象的实际数据类型
column = "pid", // 根据查询出的card表中的pid字段来查询person表
/*
one、@One 一对一固定写法
select属性:指定调用哪个接口中的哪个方法
*/
one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")
)
})
public abstract List<Card> selectAll();
}
一对多的注解:
@Select("SELECT * FROM classes")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(
property = "students", // 被包含对象的变量名
javaType = List.class, // 被包含对象的实际数据类型
column = "id", // 根据查询出的classes表的id字段来查询student表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
)
})
多对多的注解:
//查询全部
@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, // 被包含对象的实际数据类型
column = "id", // 根据查询出student表的id来作为关联条件,去查询中间表和课程表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
)
})
-
@Results:封装映射关系的父注解。
Result[] value():定义了Result数组
-
@Result:封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
one属性:一对一查询固定属性
many属性:一对多查询固定属性
-
@One:一对一查询的注解。
select属性:指定调用某个接口中的方法
-
@Many:一对多查询的注解。
select属性:指定调用某个接口中的方法