Mybatis入門

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相當於一個業務請求,一旦完成業務請求就應該廢棄.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章