0%

MyBatis更多操作

5 SqlMapConfig.xml 配置文件

5.1 配置内容

SqlMapConfig.xml 中配置的内容和顺序如下:

  • properties(属性)
  • settings(全局配置参数)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • enviornments(环境集合对象属性)
    • enviorment(环境子属性对象)
      • transactionManager(事务管理)
      • dataSource(数据源)
  • mappers(映射器)

5.2 properties

可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息。

内部:通过在 ${} 中写 properties 中的 name 值,来引用 value 值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mbdemo"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</properties>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源/连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>

外部:resource 属性用于指定配置文件的位置,必须按照类路径的写法来写,并且必须存在于类路径下。

${} 中的属性名必须与配置文件中的一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<properties resource="jdbc.properties">
</properties>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源/连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>

resource 属性也可以用 url 属性替代,在这里可以用 file 协议写 url 值:

url="file:///C:User/Desktop/jdbc.properties"

在这个路径中不能有中文。

5.3 typeAliases

使用 typeAliases 配置别名,它只能配置 domain 类中的别名。type 属性指的是实体类全限定类名。alias 属性指定别名,指定别名后不区分大小写。

1
2
3
<typeAliases>
<typeAlias type="cn.Retur0.domain.User" alias="user"></typeAlias>
</typeAliases>

这样指定当多了会很麻烦,所以可以指定package。

指定之后,该包下的实体类都会注册别名,并且类名就是别名,不区分大小写。

1
2
3
<typeAliases>
<package name="cn.Retur0.domain"></package>
</typeAliases>

5.4 mappers

这里面也有一个 package 标签。用于指定 dao 接口所在的包,当指定了之后就不需要再写 resouce class 或mapper 了。

1
2
3
<mappers>
<package name="cn.Retur0.dao"></package>
</mappers>

6 连接池与事务控制

6.1 连接池

我们在实际开发中会使用连接池,因为它可以减少我们获取连接的时间。

连接池就是用于存储链接的一个容器。容器其实是一个集合对象。该集合必须是线程安全的,不能两个线程拿到同一个连接。该集合还实现了队列的特性:先进先出。

6.2 MyBatis 中的连接池

MyBatis 连接池提供了3种配置的方式。配置的位置在 SqlMapConfig.xml 中 dataSource 标签的 type 属性,type属性表示采用何种连接池方式。

  • type 属性的取值:

    POOLED 采用传统的 javax.sql.DataSouce 规范中的连接池,MyBatis 中有针对规范的实现。
    UNPOOLED 采用传统的获取连接的方式,虽然也实现 javax.sql.DataSouce 接口,但是并没有使用池的思想。
    JNDI 采用服务器提供的 JNDI 技术实现,来获取 DataSouce 对象。不同的服务器能拿到的 DataSource 服务器也是不一样的。(如果不是 web 或者 maven 的 war 工程,是不能使用的)例如 tomcat 服务器,采用的是 dbcp 连接池。

在 POOLED 模式下获取连接的流程:

  • 连接池分为空闲池和活动池。如果空闲池还有连接的话,直接拿一个来用。
  • 如果空闲池中没有连接可用,则到活动池中看看是否已经到了最大数量。若没到最大数量,则在活动池中创建一个新的连接。
  • 若活动池中的连接已达到最大数量,则把活动池中连接时间最长的连接返回回去。

很明显在开发中使用 POOLED。

6.3 事务

什么是事务:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

事务的四大特性 ACID:原子性,隔离性,持久性,一致性。

不考虑隔离性会产生的三个问题:脏读,重复度,幻读。

解决办法:四种隔离级别。读未提交,读提交,重复读,幻读。

在 MyBatis 中,它是通过 sqlsession 对象的 commit() 方法和 rollback() 方法实现事务的提交和回滚。

7 动态SQL

可以在 sql 语句的查询标签里添加<if/><where/><foreach/>标签实现动态查询。

8 多表操作

MyBatis 中把 多对一 看成由多个 一对一 组成的。

一对多

  • 用户与订单

    一对多

    多对一

一对一

  • 人和身份证号

多对多

  • 老师与学生

MyBatis 中的多表查询:

  • 用户与账户:一个用户可以有多个账户,一个账户只能对应一个用户(多个账户属于同一个用户)。

  • 步骤:

    1. 建立两张表:用户表,账户表。

      让用户表和账户表具备一对多的关系,需要使用外键在账户表中添加。

    2. 建立两个实体类:用户实体类和账户实体类。

      让用户和账户能的实体类体现出一对多的关系。

    3. 建立两个配置文件:

      用户的配置文件

      账户的配置文件

    4. 实现配置:

      当我们查询用户时,可以得到用户下的所有账户信息。

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