四、多表查询 一对一
上一章内容:持久层框架MyBatis的增删改查、映射与表间关系
实现:
思路:
1)在sqlyog中分析表的关系
2)画图分析代码实现思路
1.需求:
用户和订单信息一对一关联;查询用户和订单的扩展信息。
User表
jt_Order表
SELECT order_id ,total,user.user_id ,username FROM jt_order,USER
WHERE jt_order.order_id=1 AND user.user_id=jt_order.user_id
2.分析
3.1拷贝dbDemo,解压到工作区,更改项目名mybatis04,打开eclipse 导入项目
3.2导入后创建包mapper,pojo,controller
3.3创建JtOrder,User,JtOrder接口.select()
创建User 类
package com.tedu.DbDemo.pojo;
public class User {
Integer userId;
String username;
String password;
//get()、set()
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
创建JtOrder 类
package com.tedu.DbDemo.pojo;
//对应jt_order表
public class JtOrder {
Integer orderId;//对应order_id列
Integer total;
//一个订单属于一个用户的
User user;//体现jt_order和uesr表的一对一
//set(),get()
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3.4在mapper包中 创建JtOrderMapper 接口和 jtOrder.xml
package com.tedu.DbDemo.mapper;
import com.tedu.DbDemo.pojo.JtOrder;
//操作order,user表
public interface JtOrderMapper {
//@mapperscan("com.tedu.DbDemo.mapper")
//mybatis框架会自动为JtOrder创建代理类
//mybatis框架会为代理类创建代理对象
//代理对象放在spring ioc容器中了
//controller中@autowired JtOrder jtOrder
//jtOrder.select()
//com.tedu.DbDemo.mapper.jtOrder 方法名select
//从JtOrderMapper.xml中找到<select id=selectById>
//找到select from jtOrder,user执行
//mybatis框架根据xml中的resultMap把结果集转成jtOrder
public JtOrder selectById(Integer orderId);
}
创建 JtOrderMapper.xml
创建结果集映射
<?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=" ">
<!-- 结果集映射 -->
<!-- select放的是sql语句 -->
</mapper>
继续修改结果集映射
<?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.tedu.DbDemo.pojo.JtOrderMapper">
<!-- 结果集映射 -->
<resultMap type="com.tedu.DbDemo.pojo.jtOrder" id="map1">
<result column="order_id" property="order_id"/>
<result column="total" property="total"/>
<!-- 结果集中有user表的信息,映射到User类 -->
<!-- jtOrder{
User user} -->
<association property="user" javaType="com.tedu.DbDemo.pojo.User">
</association>
</resultMap>
<!-- select放的是sql语句 -->
</mapper>
增加修改select放的sql语句(完整的代码)
<?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.tedu.DbDemo.pojo.JtOrderMapper">
<!-- 结果集映射 -->
<resultMap type="com.tedu.DbDemo.pojo.jtOrder" id="map1">
<result column="order_id" property="order_id"/>
<result column="total" property="total"/>
<!-- 结果集中有user表的信息,映射到User类 -->
<!-- jtOrder{
User user} -->
<association property="user" javaType="com.tedu.DbDemo.pojo.User">
<result column="user_id" property="userId"/>
<result column="username" property="username"/>
</association>
</resultMap>
<!-- select放的是sql语句 -->
<!-- select标签必须放在resultMap标签的下面 -->
<!-- #{
}是占位符,被替换成方法的参数,mybatis本质就是拼接SQL语句
parameterType指定orderId的类型
parameterMap=值,值必须在前面声明
resultType=类名
resultMap=前面声明的resultMap
-->
<select id="selectById" resultMap="map1" parameterType="Integer">
SELECT
order_id ,total,user.user_id ,username
FROM jt_order,USER
WHERE jt_order.order_id=1={
orderId}
AND user.user_id=jt_order.user_id
</select>
</mapper>
3.5从mybatis02拷贝application.yml修改两个包名。
3.6在入口DbDemoApplication类中配置添加@mapperScan()
package com.tedu.DbDemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.tedu.DbDemo.mapper")
public class DbDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DbDemoApplication.class, args);
}
}
3.7 在controller包中创建JtOrderController类
package com.tedu.DbDemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.tedu.DbDemo.mapper.JtOrderMapper;
import com.tedu.DbDemo.pojo.JtOrder;
@RestController
public class JtOrderController {
//从spring框架的ioc容器中取JtOrderMapper
//接口的代理类的代理对象
@Autowired
JtOrderMapper jtOrderMapper;
@RequestMapping("/")
public JtOrder selectById() {
JtOrder jtOrder=jtOrderMapper.selectById(1);
return jtOrder;
}
}
Run As执行: