mybatis的優勢:
1.不屏蔽SQL(這點相對於Hibernate而言)可以更精準的編寫sql
2.提供強大的,靈活的映射機制
3.提供了Mapper的接口編程.
Mybatis的核心組件
SqlSessionFactoryBuilder(構造器):它可以根據配置文件或者java代碼生成SqlSessionFactory,採用的是構建者模式.
SqlSessionFactory(工廠接口):生成SqlSession,工廠模式
SqlSession:會話,可以獲取Sql執行的返回結果.也可以獲取Mapper的接口.
Sql Mapper(映射器): 由一個java接口和Xml文件構成,主要給出對應的Sql和映射規則,負責發送sql去執行,接手返回結果.
映射器和SqlSession都可以發送sql到數據庫執行.
SqlSessionFactory是一個接口,mybatis中存在兩個實現類:SqlSessionManager DefaultSqlSessionManager
SqlSessionManager 依賴DefaultSqlSessionManager,應用在多線程的環境中,唯一的作用就是產生SqlSession
myBatis基礎配置文件
<?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="com.learn.ssm.chapter3.pojo.Role"/>
</typeAliases>
<!-- 數據庫環境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/chapter3"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
<mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/>
</mappers>
</configuration>
Xml配置文件構建SqlSessionFactory
String resource = "mybatis-config.xml";
inputStream = Resource.getResourceAsStream(resource);
SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
也開使用代碼創建SqlSessionFactory,由於不常用,這裏不做介紹.
SqlSession
SqlSession = SqlSessionFactory.openSession();
映射器
由一個mapper接口和對應的xml文件組成,mybatis會爲該接口生成一個代理對象,代理對象去處理相關的邏輯.
也可以使用註解的方式實現映射器,同樣因爲不常用,這裏不做介紹.
<?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.ssm.chapter3.mapper.RoleMapper">
<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>
<update id="updateRole" parameterType="role">
update t_role set role_name = #{roleName}, note = #{note} where id= #{id}
</update>
<select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName, note from t_role where id = #{id}
</select>
<select id="findRoles" parameterType="string" resultType="role">
select id, role_name as roleName, note from t_role
where role_name like concat('%', #{roleName}, '%')
</select>
</mapper>
SqlSession發送sql
getRole是一個sqlId,使用SqlSession發送sql的時候需要匹配一個sqlID
Role role = (Role)sqlSession.selectOne("getRole",1L);
使用mapper接口發送Sql
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
對比兩種發送sql方式
使用SqlSession發送Sql需要一個SqlID去匹配Sql,比較不好懂,Mapper接口編程可以消除SqlSession帶來的功能性代碼比如:seleceOne()
使用Mapper接口編程,IDE會提示錯誤和校驗,但是sqlSession發送Sql,只有在運行中才會發現是否會產生錯誤.
生命週期
SqlSessionFactoryBuilder
因爲builder的作用只是創建SqlSessionFactory,所以只讓他存在創建階段.
SqlSessionFactory
factory可以認爲是一個數據庫連接池,不斷的在創建銷燬數據庫連接,所以其生命週期在整個Mybatis的應用中,並且是單例.
SqlSession
session相當於一個數據庫連接,在一次數據庫任務執行完成之後就應該銷燬. try catch finally 保證其正確關閉.
Mapper
mapper是一個接口,由sqlSession創建,所以其最大生命週期至多和SqlSession相同,
Mapper相當於一個業務請求,一旦完成業務請求就應該廢棄.