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">:让当前的操作支持二级缓存