mybatis的构造
Configuration -> SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession -> xxMap -> 进行数据库的操作
mybatis的Config文件配置
<?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>
<!-- 定义别名 -->
<typeAliases>
<typeAlias alias="role" type="chapter2.po.Role" />
</typeAliases>
<!-- 定义数据库信息,默认使用development数据库构造环境 -->
<environments default="development">
<environment id="development">
<!-- 采用jdbc事务管理器 -->
<transactionManager type="JDBC">
<property name="autoCommit" value="false" />
</transactionManager>
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 定义映射器 -->
<mappers>
<mapper resource="chapter2/mapper/roleMapper.xml" />
</mappers>
</configuration>
mybatis的map配置
<?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="chapter2.mapper.RoleMapper">
<!--定义查询语句,id对应RoleMapper接口中的getRole方法,参数类型long,返回类型role,
此处为config文件中设置的别名,也就是chapter2.po.Role,#{id}对应着Role POJO中的属性值id-->
<select id="getRole" parameterType="long" resultType="role">
SELECT
id,role_name as roleName,note FROM
t_role WHERE id = #{id}
</select>
<!--插入语句,id对应RoleMapper接口中的insertRole方法,参数类型为role,
#{roleName}对应着roleName POJO中的属性值roleName,#{note}对应着note POJO中的属性值note-->
<insert id="insertRole" parameterType="role">
insert into
t_role(role_name,note) values(#{roleName},#{note});
</insert>
<!--删除语句,id对应RoleMapper接口中的deleteRole方法,参数类型为long,
#{id}对应着Role POJO中的属性值id-->
<delete id="deleteRole" parameterType="long">
DELETE FROM t_role where
id=#{id};
</delete>
</mapper>
mybatis的操作流程
SqlSessionFactoryBuilder是利用xml或者java编码获得资源来构建SqlSessionFactory。一旦构建完成,其存在的意义也就消失了,所以它的生命周期只存在方法的内部。
SessionFactory的作用是创建SqlSession,而SqlSession相当于JDBC中的Connection对象。如果多次创建同一个数据库的SqlSessionFactory,则每次创建SqlSessionFactory会打开更多的数据库连接资源,因此对于一个数据库而言应该只有一个实例,所以我们希望它是单例的。
SqlSession是一个会话,相当于Connection对象,是一个线程不安全的对象,每次创建使用完后需要及时关闭,否者会使数据库连接池的活动资源减少。
Mapper是一个接口,作用是发送Sql,返回我们需要的结果,或者执行sql语句。生命周期和SqlSession一样。
1.获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
2.根据配置文件获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
3.获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
4.获取Mapper对象
XxxMapper xxxMapper = sqlSession.getMapper(XxxMapper.class);
示例代码:
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory = null;
private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;
public SqlSessionFactoryUtil() {
}
public static SqlSessionFactory initSqlSessionFactory() {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.SEVERE, null, e);
}
synchronized (CLASS_LOCK) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
}
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
initSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
参考文献:
深入浅出Mybatis技术原理与实战 电子工业出版社 杨开振