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属性内容

<properties>

    <property name="driver" value="com.mysql.jdbc.Driver"/>

    <property name="url" value="jdbc:mysql://localhost:3306/db1"/>

    <property name="username" value="root"/>

    <property name="password" value="root"/>

</properties>

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

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

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

<properties resource="jdbcConfig.properties">

</properties>

2)方式2:通过url 属性

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

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

 URL协议 主机        端口 URI

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

示例:

<properties url="file:///C:/Users/Q/resources/jdbcConfig.properties"></properties>

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

3、settings(全局配置参数)

1、延迟加载配置

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

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

2、二级缓存配置

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

4、typeAliases(类型别名)

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

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

标签:typeAlias 

<typeAliases>

    <typeAlias type="q.perter.domain.User" alias="user"></typeAlias>

</typeAliases>

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

alias:属性指定别名

标签:package 

<typeAliases>

    <package name="q.perter.domain"/>

</typeAliases>

name:指定要配置别名的包

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

5、typeHandlers(类型处理器)

6、objectFactory(对象工厂)

7、plugins(插件)

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

示例

<!-- 配置环境 -->

<environments default="mysql">

    <!-- 配置mysql的环境-->

    <environment id="mysql">

        <!-- 配置事务的类型-->

        <transactionManager type="JDBC"></transactionManager>

        <!-- 配置数据源(连接池) -->

        <dataSource type="POOLED">

            <!-- 配置连接数据库的4个基本信息 -->

            <property name="driver" value="com.mysql.jdbc.Driver"/>

            <property name="url" value="jdbc:mysql://localhost:3306/db1"/>

            <property name="username" value="root"/>

            <property name="password" value="root"/>

        </dataSource>

    </environment>

</environments>

属性分析

MyBatis 在初始化时,根据<dataSource>的 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:通过配置文件方式

<mappers>

    <mapper resource="q/perter/dao/IUserDao.xml"></mapper>

</mappers>

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

方式2:通过注解的方式

<mappers>

    <mapper class="q.perter.dao.IUserDao"></mapper>

</mappers>

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

方式3:通过url的方式

<mappers>

    <mapper url="file:///C:/Users/Q/IUserDao.xml"></mapper>

</mappers>

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

标签:package

<mappers>

    <package name="q.perter.dao"/>

</mappers>

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

映射文件解析

1、mapper

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

2、select

select语句对应的标签

属性:

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

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

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

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

3、insert

insert语句对应标签

<insert id="saveUser" parameterType="user">

        <!-- 配置插入操作后,获取插入数据的id -->

        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">

            select last_insert_id();

        </selectKey>

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

</insert>

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

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

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

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

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

4、update

update语句对应标签

5、delete

delete语句对应标签

6、sql

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

<sql id="defaultSql">

    select * from user

</sql>

<select id="findOne" resultType="q.perter.domain.User">

    <include refid="defaultSql"></include> where id = #{id}

</select>

7、resultMap

1、格式

<!-- 配置查询结果的列名和实体类属性名的对应关系 -->

<resultMap id="userMap" type="q.perter.domain.User">

    <!-- 主键字段对应 -->

    <id property="userId" column="id"></id>

    <!-- 非主键字段对应 -->

    <result property="userName" column="username"></result>

    <result property="userSex" column="sex"></result>

    <result property="userBirthday" column="birthday"></result>

    <result property="userAddress" column="address"></result>

</resultMap>

2、使用

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

<select id="findAll" resultMap="userMap">

    select * from user

</select>

3、其他标签

一对一标签 association

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

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

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

一对多标签 collection

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

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

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

8、动态Sql标签

1、<if>标签

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

<select id="findUserByCondition" resultType="user" parameterType="user">

    select * from user where 1 = 1

    <if test="username != null and username != ''">

        and username = #{username}

    </if>

</select>

注意:

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

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

2、<where>标签

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

<select id="findUserByCondition" resultType="user" parameterType="user">

    select * from user

    <where>

        <if test="username != null and username != ''">

            and username = #{username}

        </if>

    </where>

</select>

3、<foreach>标签

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

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

    open:代表语句的开始部分

    close:代表结束部分

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

    sperator:代表分隔符

<select id="findByIds" parameterType="queryVo" resultType="user">

    select * from user

    <where>

        <if test="ids != null and ids.size() > 0">

            <foreach collection="ids" open=" id in (" close=")" item="uid" separator=",">

                #{uid}

            </foreach>

        </if>

    </where>

</select>

注意: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)<cache></cache>:让当前配置文件支持二级缓存

2)<select id="findOne" resultType="user" parameterType="Integer" useCache="true">:让当前的操作支持二级缓存

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。