5 SqlMapConfig.xml 配置文件
5.1 配置内容
SqlMapConfig.xml 中配置的内容和顺序如下:
- properties(属性)
- settings(全局配置参数)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- enviornments(环境集合对象属性)
- enviorment(环境子属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- enviorment(环境子属性对象)
- mappers(映射器)
5.2 properties
可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息。
内部:通过在 ${} 中写 properties 中的 name 值,来引用 value 值。
1 | <properties> |
外部:resource 属性用于指定配置文件的位置,必须按照类路径的写法来写,并且必须存在于类路径下。
${} 中的属性名必须与配置文件中的一致。
1 | <properties resource="jdbc.properties"> |
resource 属性也可以用 url 属性替代,在这里可以用 file 协议写 url 值:
url="file:///C:User/Desktop/jdbc.properties"
在这个路径中不能有中文。
5.3 typeAliases
使用 typeAliases 配置别名,它只能配置 domain 类中的别名。type 属性指的是实体类全限定类名。alias 属性指定别名,指定别名后不区分大小写。
1 | <typeAliases> |
这样指定当多了会很麻烦,所以可以指定package。
指定之后,该包下的实体类都会注册别名,并且类名就是别名,不区分大小写。
1 | <typeAliases> |
5.4 mappers
这里面也有一个 package 标签。用于指定 dao 接口所在的包,当指定了之后就不需要再写 resouce class 或mapper 了。
1 | <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 中的多表查询:
用户与账户:一个用户可以有多个账户,一个账户只能对应一个用户(多个账户属于同一个用户)。
步骤:
建立两张表:用户表,账户表。
让用户表和账户表具备一对多的关系,需要使用外键在账户表中添加。
建立两个实体类:用户实体类和账户实体类。
让用户和账户能的实体类体现出一对多的关系。
建立两个配置文件:
用户的配置文件
账户的配置文件
实现配置:
当我们查询用户时,可以得到用户下的所有账户信息。
当我们查询账户时,可以同时得到账户的所属用户信息。