天天看點

好程式員Java學習路線分享mybatis映射Sql建表語句

好程式員Java學習路線分享mybatis映射

好程式員Java學習路線分享mybatis映射,希望對大家有所幫助。

Mybatis 1對1關聯 實作方式

  1. 通過resultType方式
  2. 通過級聯屬性的方式【resultType 和 resultMap方式】
  3. 通過association關聯的方式
  4. 通過association的分步查詢方式
  5. 通過包裝類的雙association的關聯方式
  6. 通過association的嵌套定義方式

案例: 查詢 訂單 對應的使用者資訊

Sql建表語句

使用者表:

-- ----------------------------

-- Table structure for `user`

-- ----------------------------

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(32) NOT NULL COMMENT '使用者名稱',

  `birthday` date DEFAULT NULL COMMENT '生日',

  `sex` char(1) DEFAULT NULL COMMENT '性别',

  `address` varchar(256) DEFAULT NULL COMMENT '位址',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of user

-- ----------------------------

INSERT INTO `user` VALUES ('1', '王五', '2019-08-30', '2', '杭州');

INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市');

INSERT INTO `user` VALUES ('16', '張小明', '2019-08-15', '1', '河南鄭州');

INSERT INTO `user` VALUES ('22', '陳小明', '2019-08-08', '1', '河南鄭州');

INSERT INTO `user` VALUES ('24', '張三豐', '2019-08-15', '1', '長沙');

INSERT INTO `user` VALUES ('25', '吳小明', '2019-08-08', '1', '河南鄭州');

INSERT INTO `user` VALUES ('26', '王五', '2019-08-14', '2', '武漢');

訂單表:

-- ----------------------------

-- Table structure for `orders`

-- ----------------------------

DROP TABLE IF EXISTS `orders`;

CREATE TABLE `orders` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `user_id` int(11) NOT NULL COMMENT '下單使用者id',

  `number` varchar(32) NOT NULL COMMENT '訂單号',

  `createtime` datetime NOT NULL COMMENT '建立訂單時間',

  `note` varchar(100) DEFAULT NULL COMMENT '備注',

  PRIMARY KEY (`id`),

  KEY `FK_orders_1` (`user_id`),

  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of orders

-- ----------------------------

INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);

INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);

INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);

INSERT INTO `orders` VALUES ('6', '10', '1000013', '2015-08-30 10:11:56', null);

INSERT INTO `orders` VALUES ('7', '16', '100014', '2019-08-16 10:12:54', null);

實體類:

使用者:User

public class User {

    private Integer id;

    private String name;

    private Date birthday;

    private String sex;

    private String address;

    //getter.. setter.. toString..

}

訂單:Orders

public class Orders {

    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //getter.. setter.. toString..

}

方式一:resultType方式

一個訂單 對應 一個使用者

對訂單實體類進行擴充: 【隻增加 對應的字段 ;例如案例中的 使用者名稱】

建立OrdersExtByColumn 的擴充類,繼承 Orders, 并增加相應的字段

public class OrdersExtByColumn extends Orders {

    private String username;

   //getter.. setter.. toString..

}

OrdersMapper映射檔案中,寫對應的sql語句

<select id="queryOrdersByType" parameterType="int" resultType="OrdersExtByColumn">

   SELECT o.id,number,createtime,note,user_id userId,username

   FROM orders o ,user u

   WHERE o.id = u.id and o.id = #{id}

</select>

編寫測試程式:

public class TestAssociation {

    private SqlSession sqlSession;

    @Before

    public void initSqlSession(){

        //1.讀取核心配置檔案 SqlMapConfig.xml

        InputStream resourceAsStream = TestMain.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");

        //2. 産生 SqlSessionFactory

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        //3. 産生 SqlSession

        sqlSession = sqlSessionFactory.openSession();

    }

    @Test

    public void testQryName(){

        //找對應的sqlID

        String sqlID = "orders.queryOrdersByType";

        //sqlSession 執行對應的資料庫操作

        OrdersExtByColumn orderInfo = sqlSession.selectOne(sqlID, 3);

        //對查詢的結果進行處理

        System.out.println(orderInfo);

    }

    @After

    public void closeResource(){

        sqlSession.close();

    }

}

方式二 : 級聯屬性的方式

在orders類中, 增加 級聯屬性User user;

好程式員Java學習路線分享mybatis映射Sql建表語句

ResultType方式:

好程式員Java學習路線分享mybatis映射Sql建表語句

ResultMap方式:

好程式員Java學習路線分享mybatis映射Sql建表語句

方式三:association關聯的方式

好程式員Java學習路線分享mybatis映射Sql建表語句

方式四:association的分步查詢方式

分步查詢:即多個sql查詢 算出結果

此種方式,可以結合mybatis核心配置檔案mybatisCfg.xml的配置項,産生延遲緩存;

好程式員Java學習路線分享mybatis映射Sql建表語句

mybatisCfg.xml 延遲加載相關設定項

好程式員Java學習路線分享mybatis映射Sql建表語句

方式五:包裝類的雙association的關聯方式

建立包裝類:

OrdersAndUser

public class OrdersAndUser {

    private Orders orders;

    private User user ;

   //getter.. setter..

}

好程式員Java學習路線分享mybatis映射Sql建表語句

方式六:内嵌association級聯

這種内嵌association會關聯三張表;

需求簡單變更為: 從某訂單詳情中,查詢訂單及對應 使用者資訊

追加一張訂單詳情表

-- ----------------------------

-- Table structure for `orderdetail`

-- ----------------------------

DROP TABLE IF EXISTS `orderdetail`;

CREATE TABLE `orderdetail` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `orders_id` int(11) NOT NULL COMMENT '訂單id',

  `items_id` int(11) NOT NULL COMMENT '商品id',

  `items_num` int(11) DEFAULT NULL COMMENT '商品購買數量',

  PRIMARY KEY (`id`),

  KEY `FK_orderdetail_1` (`orders_id`),

  KEY `FK_orderdetail_2` (`items_id`),

  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,

  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of orderdetail

-- ----------------------------

INSERT INTO `orderdetail` VALUES ('1', '3', '1', '1');

INSERT INTO `orderdetail` VALUES ('2', '3', '2', '3');

INSERT INTO `orderdetail` VALUES ('3', '4', '3', '4');

INSERT INTO `orderdetail` VALUES ('4', '4', '2', '3');

新增OrderDeatil類 【關聯Orders屬性】

public class OrderDetail {

    private Integer id;

    private Integer orderId;

    private Integer itemsId;

    private Integer itemsNum;

    private Orders orders;

    //setter.. getter..

}

好程式員Java學習路線分享mybatis映射Sql建表語句

繼續閱讀