一.xml映射配置文件(全局配置文件)
1.XML 文档的高层级结构如下(再写配置文件的时候不能更改此顺序):
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
映射器
1.1properties 属性
properties的配置有三种方式:
第一种
<properties>
<property name="password" value="123456"/>
</properties>
第二种:在db,properties文件中配置,然后加载此资源
<properties resource="db.properties" >
</properties>
第三种
//编写Properties
Properties properties = new Properties();
properties.setProperty("password", "1234");
//建立sqlsessionFactory
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream,properties);
如果三种都配置,那么加载顺序是:第一种——>第二种——>第三种
1.2settings 设置
settings配置会影响MyBatis的运行方式
<!-- 是否使用缓存 -->
<setting name="cacheEnabled" value="true"/>
<!--是否启用延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
1.3typeAliases
类型别名就是为java类型设置一个短的名称
<!-- 单个别名定义 -->
<typeAlias type="com.study.mybatis.Customer" alias="customer"/>
<!--
包别名定义:指定包名称为该包下的po类声明别名,默认别名就是类名(不区分大小写)
-->
<package name="com.study.mybatis"/>
</typeAliases>
1.4typeHandlers
无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成 Java 类型,如果我们想将获取的值按照自己的方式转换,那么就得自己写一个类型处理器.
重写TypeHandler 接口
1.5objectFactory
Mybatis每次创建一个新的结果对象实例时,它使用一个 ObjectFactory 实例来完成,我们可以重写该实例,以自己的方式创建
继承 ObjectFactory
1.6plugins
添加插件
1.7environments
environments可以配置我们的数据库连接池,事物管理等
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,采用mybatis连接池,使用POOLED方式 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
1.7.1transactionManager
在MyBatis中有两种事物管理,JDBC ,MANAGED
JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文)
1.7.2dataSsource
数据源的配置,有三种配置:
第一种:UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接
第二种:POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间
第三种:JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用
1.8Mappers
有四种种配置mapper映射文件路径的方式
第一种:<mapper resource=""/> 相对于类路径的资源
<mapper resource="OrdersExtMapper.xml"/>
第二种:<mapper url=""/> 使用完全限定路径
<mapperurl="file:///D:\workspace1\mybatis_01\config\sqlmap\User.xml"/>
第三种:<mapper class=""/> 使用接口的全限定名
<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;
第四种:<mapper package=""/> 指定包下的所有映射文件
<packagename="com.study.mybatis.mapper"/>
注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
二.SqlMapper映射配置文件
结构如下:
cache - 配置给定命名空间的缓存。
cache-ref – 从其他命名空间引用缓存配置。
resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。
parameterMap – 已经被废弃了!老式风格的参数映射。
sql – 可以重用的 SQL 块,也可以被其他语句引用。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
主要详解insert中的一些配置属性,update,delete,insert和select一样。sql片段,resultMap
1.select
1.1输入类型
输入类型有四种,简单类型,pojo类型,包装pojo类型,map类型,主要来看下map类型
map类型:
sqlMapper配置文件
<select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap">
SELECT * FROM t_customer WHERE id=#{id}
</select>
mapper接口:
public Customer findUserByHashMap(Map<String, Object> hashmap) throws Exception;
测试代码:
@Test
public void test6() throws Exception{
Map<String, Object> hash=new HashMap<String, Object>();
hash.put("id", 4);
String resource="SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessionFactory
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session=sqlSessionFactory.openSession();
//调用session的增删改查
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
//传入map类型的参数
System.out.println(mapper.findUserByHashMap(hash).getCname());
//提交事物
session.commit();
session.close();
}
1.2输出类型
1.2.1resultType
使用resultType映射的规范:
使用resultType进行结果映射时,需要查询出的列名和映射的对象的属性名一致,才能映射成功。
如果查询的列名和对象的属性名全部不一致,那么映射的对象为空。
如果查询的列名和对象的属性名有一个一致,那么映射的对象不为空,但是只有映射正确那一个属性才有值。
如果查询的sql的列名有别名,那么这个别名就是和属性映射的列名。
简单类型
使用简单类型规则:
查询的列必须是一列,才能映射为简单类型,比如,统计计数
po类
1.2.2resultMap
resultMap进行结果映射时,不需要其列名和属性名一致,但须声明一个resultMap,来对列名和属性名进行映射
resultMap配置:
<!--
id:专门为查询结果中唯一的映射
result:映射查询结果中的普通列
-->
<resultMap type="com.study.mybatis.Customer" id="userByMap">
<id column="id" property="id"/>
<result column="cname" property="cname"/>
</resultMap>
<select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap">
SELECT * FROM t_customer WHERE id=#{id}
</select>
Customer类:
public class Customer {
private Integer id;
private String cname;
public Integer getId() {
return id;
}
public void setId(Integer cid) {
this.id = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
测试:
@Test
public void test6() throws Exception{
Map<String, Object> hash=new HashMap<String, Object>();
hash.put("id", 4);
String resource="SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessionFactory
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session=sqlSessionFactory.openSession();
//调用session的增删改查
CustomerMapper mapper = session.getMapper(CustomerMapper.class);
//传入map类型的参数
System.out.println(mapper.findUserByHashMap(hash).getCname());
//提交事物
session.commit();
session.close();
}
2.sql片段
Sql片段可以让代码有更高的可重用性
Sql片段需要先定义后使用
定义:
<sql id="sqlFindId">
SELECT * FROM t_customer WHERE =#{id}
</foreach>
调用:
<select id="findById" parameterType="int" resultType="customer">
<include refid="sqlFindId"></include>
</select>
3.动态sql
例:foreach
<!--
collection:pojo集合中的属性名称
item:遍历出的结果声明结果名称
open:遍历开始时的连接符
close:遍历结束时的连接符
separator:分隔符
-->
<sql id="sqlForeach">
SELECT * FROM t_customer WHERE id IN
<foreach collection="idList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</sql>