Mybatis配置數據源

Mybatis數據源配置簡介

Mybatis可以配置成適應多種環(huán)境,這種機制有助于將SQL映射應用于多種數據庫之中。例如:開發(fā),測試和生產環(huán)境需要不同的配置,或者共享相同的Schema的多個數據庫,想使用相同的sql映射。如果想連接兩個數據庫,就需要創(chuàng)建兩個SQlSessionFactory實例,每個數據庫對應一個。而如果是三個數據庫,就需要三個實例,以此類推。注意:可以配置多個環(huán)境,每個 SqlSessionFactory 實例只能選擇其一,即每個數據庫對應一個SqlSessionFactory實例

【配置示例】

環(huán)境元素配置環(huán)境:

<!--默認的環(huán)境ID   development : 開發(fā)模式  work : 工作模式-->
<environments default="development">
         <!--每個 environment 元素定義的環(huán)境 ID-->  
         <environment id="development">  
             <!--事務管理器的配置-->
             <transactionManager type="JDBC" />  
             <!-- 配置數據庫連接信息 -->  
             <dataSource type="POOLED">  
                 <!-- value屬性值引用db.properties配置文件中配置的值 -->  
                 <property name="driver" value="${driver}" />  
                 <property name="url" value="${url}" />  
                 <property name="username" value="${name}" />  
                 <property name="password" value="${password}" />  
             </dataSource>  
        </environment>  
 </environments>  

MyBatisTest類中測試配置信息:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisTest {

    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream =
                Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = 
                new SqlSessionFactoryBuilder().build(inputStream);
        System.out.println("sqlSessionFactory:"+sqlSessionFactory);
    }
}

【配置參數介紹】

1. 事務管理器

事務管理器有兩種:type="[ JDBC | MANAGED ]"

  • JDBC:這個配置就是直接使用了JDBC 的提交和回滾設置,它依賴于從數據源得到的連接來管理事務范圍。
  • MANAGED:種機制MyBatis自身不會去實現事務管理,而是讓程序的容器如(JBOSS,Weblogic)來實現對事務的管理。

2. 數據源
??mybatis有三種內建的數據源類型:type=[ UNPOOLED | POOLED | JNDI ]。

  • UNPOOLED:這個數據源的實現只是每次請求時打開和關閉連接。
  • POOLED:這種數據源的實現利用“池”的概念將JDBC連接對象組織起來,避免了創(chuàng)建先的連接實例時所必須的初始化和認證時間。這是一種使得并發(fā)WEb應用快速響應請求的流行的處理方式。
  • JDNI: 這個數據源的實現是為了能在如EJB或應用服務器這類容器中使用,容器可以集中在外部配置數據源,然后放置一個JDNI上下文的引用。

Spring+Mybatis數據源配置

application.xml配置:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
     <property name="driverClassName" value="${jdbc.driver}" />
     <property name="url" value="${jdbc.url}" />
     <property name="username" value="${jdbc.username}" />
     <property name="password" value="${jdbc.password}" />
</bean>

<!-- 基于sqlSessionTemplate的mybatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>

<!-- sqlSessionTemplate配置 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

EmpMapper:

<?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="mapper.EmpMapper">

    <resultMap type="com.EmpExercise.model.Employee" id="EmpMap" autoMapping="true">
        <id property="empno" column="empno" />
        <result property="ename" column="ename" />
        <result property="job" column="job" />
        <result property="hireDate" column="hireDate" />
        <result property="salary" column="salary" />
        <result property="deptno" column="deptno" />
        <association property="department" column="deptno"  select="mapper.DeptMapper.getDeptByNo"/>
    </resultMap>

    <!--使用empno找用戶  -->
    <select id="findUserByEmpno" parameterType="int" resultMap="EmpMap">
        select *
        from emp left join dept on emp.deptno=dept.deptno
        where emp.empno=#{empno};
    </select>

</mapper>  

EmpDao:

@Repository
public class EmployeeDao {

    @Resource
    public SqlSession sqlSession;

    public Integer addEmp(Map<String,Object> map){
        return sqlSession.insert("mapper.EmpMapper.addEmp", map);
    }

    public Employee findUserByEmpno(Integer empNo){
        Employee e = sqlSession.selectOne("mapper.EmpMapper.findUserByEmpno",empNo);
        return e;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容