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 在初始化时,根据
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属性,如:
select * from user
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语句进行查询,如:
select * from user where 1 = 1
and username = #{username}
注意:
1)
2)
2、标签
类似sql语句中的where,可以简化上面的语句
select * from user
and username = #{username}
3、标签
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
select * from user
#{uid}
注意: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)