Mybatis前身是iBatis,本质是一种半自动的ORM框架,除了POJO和映射关系之外,还需要编写SQL语句。
1.mybatis样例
(1)配置文件mybatis-config.xml
<configuration>
<properties resource="db.properties" />
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<!--配置environment环境 -->
<environments default="development">
<!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc_driver}" />
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件,mapper的配置文件 -->
<!-- <mappers>
直接映射到相应的mapper文件
<mapper resource="sqlmapper/TUserMapper.xml" />
</mappers> -->
<mappers>
<mapper class="com.aaa.mybatis.mapper.TUserMapper" />
</mappers>
</configuration>
(2)TUserMapper接口
public interface TUserMapper {
TUser selectByPrimaryKey(Integer id);
}
(3)TUserMapper.xml文件
<mapper namespace="com.aaa.mybatis.mapper.TUserMapper">
<select id="selectByPrimaryKey" resultType="com.aaa.mybatis.entity.TUser" parameterType="java.lang.Integer">
select
id,
user_name ,
real_name ,
sex,
mobile,
email,
note,
position_id positionId
from t_user
where id = #{id,jdbcType=INTEGER}
</select>
</mapper>
(4)实体类TUser
和普通实体类没有区别
(5)执行查询
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 1.读取mybatis配置文件创SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
// 4.执行查询语句并返回结果
TUser user = mapper.selectByPrimaryKey(1);
2.mybatis核心类
上述我们执行查询的时候,用到了类,这里介绍下。
- SqlSessionFactoryBuilder:读取配置信息创建SqlSessionFactory,方法级别生命周期
- SqlSessionFactory:创建Sqlsession,工厂单例模式,存在于程序的整个生命周期
- SqlSession:代表一次数据库连接,线程不安全,方法级
- SQL Mapper:由Java接口和XML文件组成,包含了要执行的SQL语句和结果集映射规则。方法级别生命周期
3.mybatis配置
(1) properties
引用外部properties
(2) settings
设置全局配置
- cacheEnabled:所有映射器中配置的缓存的全局开关
- lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态
- aggressiveLazyLoading:当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载
- multipleResultSetsEnabled:是否允许单一语句返回多结果集
- useColumnLabel:使用列标签代替列名
- useGeneratedKeys:允许JDBC支持自动生成主键
- autoMappingBehavior:指定MyBatis如何自动映射列到字段或属性。 NONE表示取消自动映射;PARTIAL(默认)只会自动映射没有定义嵌套结果集映射的结果集。 FULL会自动映射任意复杂的结果集
- defaultExecutorType:配置默认的执行器。SIMPLE就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH执行器将重用语句并执行批量更新。
- defaultStatementTimeout:超时时间
- safeRowBoundsEnabled:允许在嵌套语句中使用分页
- mapUnderscoreToCamelCase:是否开启自动驼峰命名规则映射
- localCacheScope:本地缓存机制防止循环引用和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据。
- lazyLoadTriggerMethods:指定哪个对象的方法触发一次延迟加载
- callSettersOnNulls:指定当结果集中值为null的时候是否调用映射对象的set方法
- logPrefix:指定 MyBatis 增加到日志名称的前缀
- logImpl:指定 MyBatis 所用日志的具体实现
- proxyFactory:指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。
(3)typeAliases
Java类型别名,映射时方便使用。分为系统定义别名和自定义别名。
(4)typeHandlers
用于jdbcType与javaType之间的转换
(5)ObjectFactory
每次创建结果对象的新实例时,它都会使用对象工厂(ObjectFactory)去构建
(6)plugins
插件
(7)environments
用于配置多个数据源,每个数据源分为数据库源和事务的配置。
- environment:配置数据源,属性id是它的唯一标识
- transactionManager:配置数据库事务,type属性有三种,(采用jdbc的方式管理事务),managed(采用容器的方式管理事务,JNDI数据源中使用),自定义
- dataSource :配置数据源连接,type属性是有四种,UNPOOLED (非连接池方式连接),POOLED(使用连接池连接),JNDI (使用JNDI数据源),自定义数据源
(8)mappers
配置引入映射器的方法。可以使用相对于类路径的资源引用、或完全限定资源定位符或类名和包名等等
4.mapper配置
(1)select
- id:和Mapper的命名空间namespace组合起来是唯一的
- parameterType:传入参数的类型,基本数据类型(int , String , long , date),
复杂数据类型(类 、Map) - resultType:SQL语句返回类型,如果是类,用类的的完全限定名或别名。如果是集合,用集合包含的类型,不能用集合本身。和resultMap不能同时使用
- resultMap:外部resultMap的命名引用。和resultType不能同时使用
- flushCache:在调用SQL后是否清空之前查询的本地缓存和二级缓存
- useCache:启动二级缓存开关
- timeout:超时时间
- fetchSize:获取记录的总条数设定
(2)resultMap
- id:当前命名空间中的一个唯一标识,用于标识一个resultMap
- type:类的完全限定名, 或者别名.
- autoMapping:如果设置这个属性,MyBatis将会为这个ResultMap开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior
- constructor:实例化类时,用到构造方法。idArg - ID (标记出作为 ID 的结果)arg (构造方法参数)
- result : 注入到字段普通结果
- association :一个复杂类型的关联,可以指定为一个resultMap元素
- collection :一个复杂类型的集合,可以指定为一个resultMap元素
- discriminator :使用结果值来决定使用哪个resultMap
- statementType:STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED
(3)insert、update、delete
这里只说明和select不同的。
- useGeneratedKeys:仅对 insert 和 update 有用,自动生成主键
- keyProperty:仅对 insert 和 update 有用。唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
- keyColumn:仅对 insert 和 update 有用,通过生成的键值设置表中的列名,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
(4)selectKey
- keyProperty:selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
- keyColumn:匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
- resultType:结果的类型
- order:这可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会首先选择主键,设置keyProperty 然后执行插入语句。如果设置为AFTER,那么先执行插入语句,然后是selectKey元素
(5)SQL
sql语句的参数可以写#{},将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,能够很大程度防止sql注入。${}:传入的数据直接显示生成在sql中,无法防止sql注入
- if:单条件分支判断
- choose、when、otherwise:多条件分支判断,相当于case when
- foreach:循环语句
- Trim、where、set:辅助判断