Mybatis框架(03)

Mybatis框架(03)

1.Mybatis连接池与事务深入

1.1Mybatis的连接池技术

1.1.1 Mybatis连接池的分类

1.1.2 Mybatis中数据源的配置

1.1.3 Mybatis中DataSource的存取

1.1.4 Mybatis中连接的获取过程分析

1.2 Mybatis的事务控制

1.2.1 JDBC中事务的回顾

1.2.2 Mybatis中事务提交方式

1.2.3 Mybatis自动提交事务的设置

2.Mybatis的动态SQL语句

2.1 <.if>标签

2.1.1 持久层Dao接口

2.1.2 持久层Dao映射配置

2.1.3 测试

2.2<.where>标签

为简化上面where 1=1的条件拼装,可以采用标签来简化开发。

2.2.1 持久层Dao映射配置

2.3 <.foreach>标签

2.3.1 需求

2.3.1.1 在QueryVo中加入一个List集合用于封装参数

2.3.2 持久层Dao接口

2.3.3 持久层Dao映射配置

2.3.3.1 编写测试方法

2.4 Mybatis中简化编写的SQL片段

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

2.4.1 定义代码片段

2.4.2 引用代码片段

3.Mybatis 多表查询之一对多

本次案例主要以最为简单的用户和账户的模型来分析Mybatis 多表关系。用户为User 表,账户为Account
表。一个用户(User)可以有多个账户(Account)。具体关系如下:
在这里插入图片描述

3.1 一对一查询(多对一)

在这里插入图片描述

需求
查询所有账户信息,关联查询下单用户信息。
注意
因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。如
果从用户信息出发查询用户下的账户信息则为一对多查询,因为一个用户可以有多个账户。

数据库准备

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');





DROP TABLE IF EXISTS `account`;

CREATE TABLE `account` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `UID` int(11) default NULL COMMENT '用户编号',
  `MONEY` double default NULL COMMENT '金额',
  PRIMARY KEY  (`ID`),
  KEY `FK_Reference_8` (`UID`),
  CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



insert  into `account`(`ID`,`UID`,`MONEY`) values (1,46,1000),(2,45,1000),(3,46,2000);



DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',
  `ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



insert  into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院长','管理整个学院'),(2,'总裁','管理整个公司'),(3,'校长','管理整个学校');





DROP TABLE IF EXISTS `user_role`;

CREATE TABLE `user_role` (
  `UID` int(11) NOT NULL COMMENT '用户编号',
  `RID` int(11) NOT NULL COMMENT '角色编号',
  PRIMARY KEY  (`UID`,`RID`),
  KEY `FK_Reference_10` (`RID`),
  CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
  CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user_role`(`UID`,`RID`) values (41,1),(45,1),(41,2);



3.1.1 方式一

3.1.1.1 定义账户信息的实体类

Account.java

public class Account implements Serializable {
    
    

    private Integer id;
    private Integer uid;
    private Double money;

    //从表实体应该包含一个主表实体的对象引用
    private User user;

    public User getUser() {
    
    
        return user;
    }

    public void setUser(User user) {
    
    
        this.user = user;
    }

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public Integer getUid() {
    
    
        return uid;
    }

    public void setUid(Integer uid) {
    
    
        this.uid = uid;
    }

    public Double getMoney() {
    
    
        return money;
    }

    public void setMoney(Double money) {
    
    
        this.money = money;
    }

    @Override
    public String toString() {
    
    
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

3.1.1.2 编写Sql语句

实现查询账户信息时,也要查询账户所对应的用户信息。

SELECT
	account.*,
	USER.username,
	USER.address 
FROM
	account,
USER 
WHERE
	account.uid = USER.id

在这里插入图片描述

3.1.1.3 定义AccountUser类

3.1.1.4 定义账户的持久层Dao接口

3.1.1.5 定义AccountDao.xml文件中的查询配置信息

3.1.1.6 创建AccountTest测试类

3.1.1.7 小结

3.1.2 方式二

3.1.2.1 修改Account类

3.1.2.2 修改AccountDao接口中的方法

3.1.2.3 重新定义AccountDao.xml文件

3.1.2.4 在AccountTest类中加入测试方法

3.2 一对多查询

3.2.1 编写SQL语句

3.2.2 User类加入List

3.2.3 用户持久层Dao接口中加入查询方法

3.2.4 用户持久层Dao映射文件配置

3.2.5 测试方法

4.Mybatis 多表查询之多对多

4.1实现Role 到User 多对多

4.1.1 用户与角色的关系模型

4.1.2 业务要求及实现SQL

4.1.3 编写角色实体类

4.1.4 编写Role持久层接口

4.1.5 编写映射文件

4.1.6 编写测试类

4.2实现User到Role的多对多

4.2.1 User到Role的多对多

4.2.2 作业:实现User到Role的一对多查询

猜你喜欢

转载自blog.csdn.net/gy99csdn/article/details/114818332