MyBatis
Hibernate 缺点
- 全表映射,更新少量信息是发送所有字段,性能不佳。
- 无法根据不同条件组装不同SQL语句,也就是说不支持SQL优化。
- 对多表关联和复杂的SQL支持不好,需要自己写SQL,然后将结果组装为POJO。
- 不能有效的支持存储过程。
- 虽然有HQL,但是性能较差。
MyBatis
半自动映射:需要手动配置POJO、SQL和映射关系。
映射文件主要部分
- SQL
可以配置动态SQL。 - 映射规则
- POJO
Mybatis基本构成(核心组件)
- SqlSessionFactoryBuilder(构造器):根据配置信息或者代码生成SqlSessionFactory。
生成SqlSessionFactory后,作用就完结了。 - SqlSessionFactory(工厂接口):通过工厂可以生成SqlSession。
创建SqlSession,采用单例模式,一个数据库只有一个SqlSessionFactory,每创建一个SqlSession会话就会调用SqlSessionFacrtory,存在于MyBatis应用的整个生命周期中。 - SqlSession(会话):可以发送SQL去执行并返回结果,也可以获得Mapper的接口。
SqlSession是一个会话,相当于一个JDBC中的Connection对象。生命周期是请求数据库处理事务的过程。 - SQL Mapper:由一个Java接口和XML文件(或者注解)构成,需要给出对应的SQL语句和映射规则。负责发送SQL去执行,并返回结果。
Mapper是一个接口,没有任何实现类,作用就是发送SQL,然后返回结果,是一个存在于SqlSession事务方法之内的一个方法级别的东西,SqlSession销毁时,也将其销毁。
SqlSessionFactory
SqlSessionFactory是一个工厂接口,Mybatis提供了两个实现类,DefaultSqlSessionFactory和SqlSessionManager,后者目前没有使用。
构造器SqlSessionFactory需要一个Configuration(org.apache.ibatis.session.Configuration)对象作为参数,该对象存在于MyBatis整个生命周期中,可以反复读取和使用。
可以使用代码方式或者XML配置文件来创建SqlSessionFactory对象,推荐后者。
使用XML创建SqlSessionFactory
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<typeAliases>
<typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="autoCommit" value="false"/>
</transactionManager>
<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>
<mappers>
<mapper resource="com\learn\chapter2\mapper\roleMapper.xml"/>
</mappers>
</configuration>
创建SqlSession
SqlSession是一个接口,实现类有DefaultSqlSession和SqlManager。
SqlSession sqlSession = null;
try{
//打开SqlSession会话
sqlSession = sqlSessionFactory.openSession();
//......
sqlSession.commit();
}catch(Exception e){
System.err.println(e.getMessage());
sqlSession.rollback();
}finally{
//类似JDBC中的Connection对象,使用完毕后要close
if(sqlSession!=null){
sqlSession.close();
}
}
映射器
由Java接口和XML文件(或注解)组成。推荐使用XML配置文件,映射器是MyBatis的核心,也是最复杂的。
//接口类
package com.learn.chapter2.mapper;
import com.learn.chapter2.po.Role;
public interface RoleMapper {
public Role getRole(Long id);
public int deleteRole(Long id);
public int insertRole(Role role);
}
//XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.chapter2.mapper.RoleMapper">
<select id="getRole" parameterType="long" resultType="role">
select id,role_name as roleName, note from t_role where id =#{id}
</select>
<insert id="insertRole" parameterType="role">
insert into t_role(role_name,note) values(#{roleName},#{note})
</insert>
<delete id="deleteRole" parameterType="long">
delete from t_role where id =#{id}
</delete>
</mapper>
我们需要在mybatis-config.xml中配置上述配置文件,MyBatis会根据配置文件生成映射器。
用SqlSession获取Mapper
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
System.out.println(role.getRoleName());