MyBatis—学习笔记#day03

MyBatis

Posted by DiCaprio on July 18, 2019

目录

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 自动提交事务设置

2.mybatis基于XML配置的动态SQL语句使用       会用即可

2.1 if标签

2.2 where标签

2.3 foreach标签

3、mybatis中的多表操作                        掌握应用

一对一查询

一对多查询

多对多查询

扩展

JNDI数据源


1.mybatis中的连接池以及事务控制                     原理部分了解,应用部分会用

1.1mybatis中连接池使用及分析

在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过<dataSource type=”pooled”>来实现 Mybatis 中连接池的配置。

1.1.1 Mybatis  连接池的分类

在 Mybatis 中我们将它的数据源 dataSource 分为以下几类:


可以看出 Mybatis 将它自己的数据源分为三类:
UNPOOLED 不使用连接池的数据源
POOLED 使用连接池的数据源
JNDI 使用 JNDI 实现的数据源

在这三种数据源中,我们一般采用的是 POOLED 数据源(很多时候我们所说的数据源就是为了更好的管理数据库连接,也就是我们所说的连接池技术)。

1.1.2 Mybatis  中数据源的配置

我们的数据源配置就是在 SqlMapConfig.xml 文件中,具体配置如下:

  1. <!-- 配置数据源(连接池)信息 -->
  2. <dataSource type="POOLED">
  3. <property name="driver" value="${jdbc.driver}"/>
  4. <property name="url" value="${jdbc.url}"/>
  5. <property name="username" value="${jdbc.username}"/>
  6. <property name="password" value="${jdbc.password}"/>
  7. </dataSource>

MyBatis 在初始化时,根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
type=”POOLED”:MyBatis 会创建 PooledDataSource 实例
type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例
type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用

1.1.3 Mybatis  中 DataSource  的存取

MyBatis 是通过工厂模式来创建数据源 DataSource 对象的,  MyBatis 定义了抽象的工厂接口:org.apache.ibatis.datasource.DataSourceFactory,通过其 getDataSource()方法返回数据源DataSource。

下面是 DataSourceFactory 源码,具体如下:

  1. package org.apache.ibatis.datasource;
  2. import java.util.Properties;
  3. import javax.sql.DataSource;
  4. /**
  5. * @author Clinton Begin
  6. */
  7. public interface DataSourceFactory {
  8. void setProperties(Properties props);
  9. DataSource getDataSource();
  10. }

 MyBatis 创建了 DataSource 实例后,会将其放到 Configuration 对象内的 Environment 对象中, 供以后使用。

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

1.2 mybatis事务控制的分析

1.2.1 自动提交事务设置

此时事务就设置为自动提交了,同样可以实现CUD操作时记录的保存。虽然这也是一种方式,但就编程而言,设置为自动提交方式为 false再根据情况决定是否进行提交,这种方式更常用。因为我们可以根据业务情况来决定提交是否进行提交。

2.mybatis基于XML配置的动态SQL语句使用       会用即可

       mappers配置文件中的几个标签:

2.1 if标签

配置

注意:<if>标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。另外要注意 where 1=1 的作用~!

where 1=1 的作用:

在不定数量查询条件情况下,1=1可以很方便的规范语句

此时即使if标签都不成立,都会有一条正确的语句 select * from user where 1=1

测试

2.2 where标签

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

配置

2.3 foreach标签

需求

传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
这样我们将如何进行参数的传递?

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

持久层 Dao  接口

配置

#{}里的内容有item所决定

SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部
item:括号里的内容,id
separator:以逗号为分隔符

测试

3、mybatis中的多表操作                        掌握应用

示例:用户和账户
            一个用户可以有多个账户(一对多)
            一个账户只能属于一个用户(多个账户也可以属于同一个用户)(一对一)
        步骤:
            1、建立两张表:用户表,账户表
                让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
            2、建立两个实体类:用户实体类和账户实体类
                让用户和账户的实体类能体现出来一对多的关系
            3、建立两个配置文件
                用户的配置文件
                账户的配置文件
            4、实现配置:
                当我们查询用户时,可以同时得到用户下所包含的账户信息
                当我们查询账户时,可以同时得到账户的所属用户信息

一对一查询

当我们查询账户时,可以同时得到账户的所属用户信息

建立对应关系

实现类

一对多查询

当我们查询用户时,可以同时得到用户下所包含的账户信息

建立对应关系

实现类

示例:用户和角色
            一个用户可以有多个角色
            一个角色可以赋予多个用户(多对多)
        步骤:
            1、建立两张表:用户表,角色表
                让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
            2、建立两个实体类:用户实体类和角色实体类
                让用户和角色的实体类能体现出来多对多的关系
                各自包含对方一个集合引用
            3、建立两个配置文件
                用户的配置文件
                角色的配置文件
            4、实现配置:
                当我们查询用户时,可以同时得到用户所包含的角色信息
                当我们查询角色时,可以同时得到角色的所赋予的用户信息

多对多查询

实现类

 

建立对应关系

当我们查询角色时,可以同时得到角色的所赋予的用户信息

当我们查询用户时,可以同时得到用户所包含的角色信息

测试

扩展

JNDI数据源

JNDI:Java Naming and Directory Interface。是SUN公司推出的一套规范,属于JavaEE技术之一。目的是模仿windows系统中的注册表。

1.创建Maven的war工程并导入坐标 

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.4.5</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>5.1.6</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>log4j</groupId>
  14. <artifactId>log4j</artifactId>
  15. <version>1.2.12</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>junit</groupId>
  19. <artifactId>junit</artifactId>
  20. <version>4.10</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>javax.servlet</groupId>
  24. <artifactId>servlet-api</artifactId>
  25. <version>2.5</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>javax.servlet.jsp</groupId>
  29. <artifactId>jsp-api</artifactId>
  30. <version>2.0</version>
  31. </dependency>
  32. </dependencies>

2.在webapp文件下创建META-INF目录,在META-INF目录中建立一个名为context.xml的配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context>
  3. <!--
  4. <Resource
  5. name="jdbc/mybatis" 数据源的名称
  6. type="javax.sql.DataSource" 数据源类型
  7. auth="Container" 数据源提供者,这里指tomcat
  8. maxActive="20" 最大活动数
  9. maxWait="10000" 最大等待时间
  10. maxIdle="5" 最大空闲数
  11. username="root" 用户名
  12. password="123456" 密码
  13. driverClassName="com.mysql.jdbc.Driver" 驱动类
  14. url="jdbc:mysql://localhost:3306/mybatis" 连接url字符串
  15. />
  16. -->
  17. <Resource
  18. name="jdbc/mybatis"
  19. type="javax.sql.DataSource"
  20. auth="Container"
  21. maxActive="20"
  22. maxWait="10000"
  23. maxIdle="5"
  24. username="root"
  25. password="123456"
  26. driverClassName="com.mysql.jdbc.Driver"
  27. url="jdbc:mysql://localhost:3306/mybatis"
  28. />
  29. </Context>

 

3.修改SqlMapConfig.xml中的配置

源码:https://github.com/DiCaprio17/MyBatis/tree/master/mybatis_day03