Mybatis數(shù)據(jù)源配置簡介
Mybatis可以配置成適應(yīng)多種環(huán)境,這種機制有助于將SQL映射應(yīng)用于多種數(shù)據(jù)庫之中辐啄。例如:開發(fā)采章,測試和生產(chǎn)環(huán)境需要不同的配置,或者共享相同的Schema的多個數(shù)據(jù)庫壶辜,想使用相同的sql映射悯舟。如果想連接兩個數(shù)據(jù)庫,就需要創(chuàng)建兩個SQlSessionFactory實例砸民,每個數(shù)據(jù)庫對應(yīng)一個抵怎。而如果是三個數(shù)據(jù)庫奋救,就需要三個實例,以此類推反惕。注意:可以配置多個環(huán)境尝艘,每個 SqlSessionFactory 實例只能選擇其一,即每個數(shù)據(jù)庫對應(yīng)一個SqlSessionFactory實例姿染。
【配置示例】
環(huán)境元素配置環(huán)境:
<!--默認的環(huán)境ID development : 開發(fā)模式 work : 工作模式-->
<environments default="development">
<!--每個 environment 元素定義的環(huán)境 ID-->
<environment id="development">
<!--事務(wù)管理器的配置-->
<transactionManager type="JDBC" />
<!-- 配置數(shù)據(jù)庫連接信息 -->
<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);
}
}
【配置參數(shù)介紹】
1. 事務(wù)管理器
事務(wù)管理器有兩種:type="[ JDBC | MANAGED ]"
- JDBC:這個配置就是直接使用了JDBC 的提交和回滾設(shè)置背亥,它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。
- MANAGED:種機制MyBatis自身不會去實現(xiàn)事務(wù)管理盔粹,而是讓程序的容器如(JBOSS隘梨,Weblogic)來實現(xiàn)對事務(wù)的管理。
2. 數(shù)據(jù)源
??mybatis有三種內(nèi)建的數(shù)據(jù)源類型:type=[ UNPOOLED | POOLED | JNDI ]舷嗡。
- UNPOOLED:這個數(shù)據(jù)源的實現(xiàn)只是每次請求時打開和關(guān)閉連接轴猎。
- POOLED:這種數(shù)據(jù)源的實現(xiàn)利用“池”的概念將JDBC連接對象組織起來,避免了創(chuàng)建先的連接實例時所必須的初始化和認證時間进萄。這是一種使得并發(fā)WEb應(yīng)用快速響應(yīng)請求的流行的處理方式捻脖。
- JDNI: 這個數(shù)據(jù)源的實現(xiàn)是為了能在如EJB或應(yīng)用服務(wù)器這類容器中使用,容器可以集中在外部配置數(shù)據(jù)源中鼠,然后放置一個JDNI上下文的引用可婶。
Spring+Mybatis數(shù)據(jù)源配置
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;
}
}