MyBatis框架配置文件解析

SqlMapConfig.xml

1、配置内容

-properties(属性)

    --property

-settings(全局配置参数)

    --setting

-typeAliases(类型别名)

    --typeAliase

    --package

-typeHandlers(类型处理器)

-objectFactory(对象工厂)

-plugins(插件)

-environments(环境集合属性对象)

    --environment(环境子属性对象)

        ---transactionManager(事务管理)

        ---dataSource(数据源)

-mappers(映射器)

    --mapper

    --package

2、properties属性

1、第一种方式:配置properties属性内容

   

   

   

   

在dataSource(数据源)中使用时,可以在value字段直接使用别名进行引用:${driver}

2、第二种方式:引用配置文件

1)方式1:通过resource 属性,指定 properties 配置文件的位置,要求配置文件必须在类路径下(resources目录)

2)方式2:通过url 属性

URL: Uniform Resource Locator 统一资源定位符

如:http://localhost:8080/web/myServlet 

 URL协议 主机        端口 URI

URI:Uniform Resource Identifier 统一资源标识符 即:web/myServlet 部分,可以在 web 应用中唯一定位一个资源的路径

示例:

mapper中的url也是这种定义方式

3、settings(全局配置参数)

1、延迟加载配置

    1)lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态,默认false

    2)aggressiveLazyLoading:开启时,任一方法的调用都会加载该对象的所有延迟加载属性, 否则,每个延迟加载属性会按需加载, 3.4.1 版本后默认关闭(false)

2、二级缓存配置

cacheEnabled:全局性地开启或关闭所有映射器配置文件中已配置的任何缓存,默认true

4、typeAliases(类型别名)

配置别名,只能配置domain中类的别名

当指定了别名就不再区分大小写,在映射文件中即可使用别名

标签:typeAlias 

   

type:用于指定实体类的全限定类名

alias:属性指定别名

标签:package 

    

name:指定要配置别名的包

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

5、typeHandlers(类型处理器)

6、objectFactory(对象工厂)

7、plugins(插件)

8、environments(环境集合属性对象)

示例

   

   

       

       

       

       

           

           

           

           

           

       

   

属性分析

MyBatis 在初始化时,根据的 type 属性来创建相应类型的的数据源 DataSource,即:

1)type=”POOLED”:MyBatis 会创建 PooledDataSource 实例,采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现

2)type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例,采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想

3)type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用

采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样

注意:如果不是web或者maven的war工程,是不能使用的,我们使用的tomcat服务器,采用连接池就是dbcp连接池

原理

连接池说明:

1)连接池是存储连接的一个容器

2)容器其实是一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一个连接

3)该集合必须实现队列的特性:先进先出

这里只考虑Mybatis中的POOLED类型的数据库连接池

1)空闲池:如果空闲池中还有连接,直接获取连接来使用

2)活动池:如果空闲池中没有连接,则到活动池中是否已经达到最大数量

    a)没有达到最大数量:创建一个新的连接返回

    b)达到最大数量:查找最先进来的一个活动连接,调整后将一个新的连接返回

9、mappers(映射器)

配置映射文件位置

标签:mapper

方式1:通过配置文件方式

   

指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件

方式2:通过注解的方式

   

如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名

方式3:通过url的方式

   

通过url方式,参照properties标签中的url

标签:package

   

package标签用于指定dao接口所在的包,当指定了包之后就不需要再写mapper

映射文件解析

1、mapper

namespace标签:dao接口的全限定类名

2、select

select语句对应的标签

属性:

1)id:当前dao下的唯一标识,和dao接口中的方法名一致

2)parameterType:查询语句对应的参数

3)resultType:定义查询结果的返回值类型

4)resultMap:定义查询结果的返回值封装类型

3、insert

insert语句对应标签

       

       

            select last_insert_id();

       

        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});

selectKey标签:作用是在insert语句执行后,查询刚刚插入数据的id,将id赋值给类中的主键,一般用于获取新增对象的主键

    1)keyProperty:实体类中定义的主键字段

    2)keyColumn:数据库中定义的主键字段

    3)resultType:返回值类型,主键的数据类型

    4)order:执行顺序在insert语句执行前/后

4、update

update语句对应标签

5、delete

delete语句对应标签

6、sql

自定义Sql语句,简化Sql片段

    select * from user

7、resultMap

1、格式

   

   

   

   

   

   

   

2、使用

在返回查询结果时,不再使用resultType定义的全限定类名,而是使用resultMap属性,如:

3、其他标签

一对一标签 association

1)association:一对一定义时使用association标签

2)property:代表实体类中字段名字(区分大小写),这里user

3)javaType:是指封装对象的全限定类名,因为已经使用别名,可以直接用user

一对多标签 collection

1)collection:一对多定义时使用collection标签

2)property:代表实体类中字段名字(区分大小写),这里roles

3)ofType:是指封装对象的全限定类名,因为已经使用别名,可以直接用role

8、动态Sql标签

1、标签

根据不同条件,使用不同的SQL语句进行查询,如:

注意:

1)标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法

2)标签的 test 属性中对多个条件进行判断,应该是用 and 进行连接

2、标签

类似sql语句中的where,可以简化上面的语句

3、标签

标签用于遍历集合,它的属性:

    collection:代表要遍历的集合元素,注意编写时不要写#{}

    open:代表语句的开始部分

    close:代表结束部分

    item:代表遍历集合的每个元素,生成的变量名

    sperator:代表分隔符

注意:foreach中的#{uid}必须和属性item中的字段uid保持一致

9、其他

1、Mybatis的参数

参数parameterType输入类型,有以下几种类型:

1)简单数据类型:如String、Integer等,不区分大小写

2)传递pojo对象:就是我们常用的javabean(实体类对象),Mybatis使用ognl表达式解析对象的值,#{}或${}括号中的值为pojo属性名称

    ognl表达式:Object Graphic Navigation Language 对象 图 导航 语言

    通过对象的取值方法来获取数据,在写法上省略get

    如获取用户名称,在类中:user.getUserName();,在ognl表达式中:user.username

    在parameterType中已经指定属性所属的类,所以在使用时不需要写对象名,如:#{username}

3)传递pojo包装对象:开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件,这时可以使用包装对象传递输入参数,即:Pojo 类中包含 pojo。

注意:在使用包装对象时,参数parameterType类型为QueryVo,其中包含User对象属性,User对象包含username属性,使用格式为:#{user.username}

2、Mybatis的输出结果封装

输出结果类型包括:

1)简单数据类型,如:Integer

2)Pojo对象:如实体对象(查询一个)

3)Pojo列表:如实体列表(查询所有)

4)resultMap结果类型:详见resultMap部分描述

要求:数据库字段名与实体类字段名一致,如果不一致可以通过以下两种方式解决:

1)查询语句中将返回数据结果起别名(执行效率更快,但是每条语句都要修改)

2)使用resultMap来进行匹配(开发效率变快,但是要解析xml)

3、二级缓存

1):让当前配置文件支持二级缓存

2)