4つのマルチテーブルクエリを1対1で
前の章の内容:永続層フレームワークMyBatisの追加、削除、変更、クエリ、マッピング、およびテーブルの関係
成し遂げる:
アイデア:
1)sqlyogのテーブル間の関係を分析します
2)絵を描き、コード実装のアイデアを分析します
1.要件:
ユーザーと注文情報の間の1対1の関連付け。ユーザーと注文に関する拡張情報を照会します。
ユーザーテーブル
jt_Orderテーブル
SELECTorder_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インポート後にパッケージマッパー、pojo、コントローラーを作成する
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マッパーパッケージに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をコピーし、2つのパッケージ名を変更します。
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コントローラーパッケージに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;
}
}
実行として実行: