目录
一:多张数据表写入同一个实体类
现在有两张表。一张student表,一张class表
实体类
@Data
public class ClassAndStudent {
private int cid;
private String course;
private int tid;
//以上为class表数据,以下为Student表数据
private int sid;
private String sname;
private String sbirth;
private String sgender;
}
Dao层
@Repository
public interface UseXmlDao {
List<ClassAndStudent> findAll();
}
Service层
//接口层
@Service
public interface UserService {
List<ClassAndStudent> findAll();
}
//实现接口层
@Service
public class UserServiceImp implements UserService {
@Autowired
private UseXmlDao useXmlDao;
@Override
public List<ClassAndStudent> findAll() {
return useXmlDao.findAll();
}
Controller层
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping ("/duobiao")
public @ResponseBody List<ClassAndStudent> findAll(){
List<ClassAndStudent> classAndStudentList = userService.findAll();
return classAndStudentList;
}
}
XML
<select id="findAll" resultType="com.xiaosuda.boot.Pojo.ClassAndStudent" >
select * from student,class
</select>
输出结果(笛卡儿积)
注意!使用这种方法进行多表查询时,
- 实体类中有哪些属性,输出结果就有哪些属性,
- sql语句中如果只查询其中一些属性,实体类中未查询的属性会显示 0 或 null
例如:去掉课程和生日属性,输出结果页没有
@Data
public class ClassAndStudent {
private int cid;
// private String course;
private int tid;
private int sid;
private String sname;
// private String sbirth;
private String sgender;
}
无课程和生日字段
例如:查询学生ID,学生姓名,课程名称
<select id="findAll" resultType="com.xiaosuda.boot.Pojo.ClassAndStudent" >
select student.sid,student.sname,class.course from student,class
</select>
返回学生ID,学生姓名,课程名称
二:多表查询 一对一
现在有两个表
user表(表名为aa_user)
order表 (表名为aa_order)
Order的实体类
@Data
public class Order {
private int oid;
private String ordertime;
private int total;
private User user;//数据库中为u_id,此处使用 User user 是为了与aa_user表连接关系
}
User的实体类
@Data
public class User {
private int uid;
private String username;
private String password;
private String gender;
}
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
//与Dao接口名字相同
<mapper namespace="com.xiaosuda.boot.Dao.UseXmlDao">
// resultMap名字自取,type为主体实体类名称
<resultMap id="OrderMap" type="com.xiaosuda.boot.Pojo.Order">
// column为数据库的列名,property为实体类的名字
<id column="o_id" property="oid"></id>
<result column="order_time" property="ordertime"></result>
<result column="to_tal" property="total"></result>
// property 为当前实体(Order)中的属性名称(Private User user);
// javaType 为当前实体(Order)中属性的类型
<association property="user" javaType="com.xiaosuda.boot.Pojo.User">
<id column="u_id" property="uid"></id>
<result column="user_name" property="username"></result>
<result column="pass_word" property="password"></result>
<result column="gen_der" property="gender"></result>
</association>
</resultMap>
<select id="findAll" resultMap="OrderMap" >
select * from aa_order,aa_user
where aa_order.u_id = aa_user.u_id
</select>
</mapper>
输出结果
多表查询使用 resultMap 进行二次封装
一对一使用 association
- property:为当前实体(Order)中的属性名称(Private User user);
- javaType:为当前实体(Order)中属性的类型
三:多表查询 一对多
user实体类
@Data
public class User {
private int uid;
private String username;
private String password;
private String gender;
private List<Order> orderList; //用于查询其他Order
}
XML
<mapper namespace="com.xiaosuda.boot.Dao.UserDao">
<resultMap id="UserMap" type="com.xiaosuda.boot.Pojo.User">
<id column="u_id" property="uid"></id>
<result column="user_name" property="username"></result>
<result column="pass_word" property="password"></result>
<result column="gen_der" property="gender"></result>
//property为当前集合名称 ofType:集合中的数据类型
<collection property="orderList" ofType="com.xiaosuda.boot.Pojo.Order">
<id column="o_id" property="oid"></id>
<result column="order_time" property="ordertime"></result>
<result column="to_tal" property="total"></result>
</collection>
</resultMap>
<select id="SearchAll" resultMap="UserMap" >
select * from aa_user,aa_order
where aa_order.u_id = aa_user.u_id
</select>
</mapper>
输出结果
一次多使用 collection
- property: 为当前集合名称
- ofType:集合中的数据类型
四:多表查询 多对多
。。。。 太复杂的 我觉得不会让我写 哈哈