Mybatis提供的Mapper方式給人第一印象是很迷惑:提供了一個介面類卻找不到實作類別。實際上該介面主要是提供了方法名和參數列表,Mapper的相關代理類把這些資訊提取出來之後,這個介面也就沒什麼用了,因而也就不需要什麼實現,它最後仍然是使用SqlSession進行操 作。從SqlSession的方法來看,我們可以直接提供方法名和參數資訊就可以省略掉這個Mapper,特別是在使用DAO(也有介面)時,DAO的接 口基本與Mapper一樣,有點多餘的感覺。(註:SqlSession提供的方法只支援傳入一個方法名和一個參數,而Mapper提供的介面則可以給多個參數,參數的使用後面再介紹)
下面是直接使用SqlSession的例子:
(1) 承載資料的User bean:com/mybatis/demo4/User.java
package com.mybatis.demo4;public class User { /** 使用者ID */ private intid; /** 使用者名稱稱 */ privateString name; /** 使用者密碼 */ privateString password; public intgetId() { returnid; } public voidsetId(int id) { this.id= id; } publicString getName() { return name; } public voidsetName(String name) { this.name= name; } publicString getPassword() { returnpassword; } public voidsetPassword(String password) { this.password= password; }}
(2) 資料來源properties檔案:com/mybatis/demo4/mysql.properties
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/bookstoreusername=rootpassword=123456
(3) Spring的設定檔:com/mybatis/demo4/applicationContext.xml
(此時把Mapper的配置資訊去掉,取而代之的是SqlSession的配置)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations" value="classpath:com/mybatis/demo4/mysql.properties"/></bean><!-- 資料來源 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></bean><!-- 建立SqlSessionFactory,需指定資料來源,property名稱必須為dataSource --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:com/mybatis/demo4/mybatis_config.xml"/></bean><!-- 使用SqlSession的形式,不需要再使用Mapper --><!--建立資料對應器Mapper,屬性mapperInterface的value必須為介面類--><!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com.mybatis.demo4.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean> --><!-- 使用SqlSession形式 --><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg ref="sqlSessionFactory" /></bean><!-- 資料訪問DAO,在DAO中使用sqlSession來查資料,在DAO中自訂屬性名對應的setter方法 --><bean id="userDao" class="com.mybatis.demo4.UserDaoImpl"><property name="sqlSession" ref="sqlSession"/></bean></beans>
(4) Mybatis設定檔:com/mybatis/demo4/mybatis_config.xml(與Spring整合後,該設定檔很多屬性不能用了,比如setting、environment等,主要是使用typeAliases和mappers)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases><typeAlias alias="User" type="com.mybatis.demo4.User" /></typeAliases><mappers><mapper resource="com/mybatis/demo4/UserMappers.xml" /></mappers></configuration>
(5) Mapper設定檔:com/mybatis/demo3/UserMappers.xml
(提供SQL的詳細配置,其中select/insert/update/delete語句的id都必須與Mapper的方法名稱相同)
<?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的類路徑;直接使用SqlSession時可配可不配 --><mapper namespace="com.mybatis.demo4.UserMapper"><resultMap id="userMap" type="User"><id property="id" column="id" /><result property="name" column="name" /><result property="password" column="password" /></resultMap><select id="findByName" parameterType="String" resultMap="userMap">select * from users where name=#{name}</select></mapper>
(6) DAO介面:com/mybatis/demo4/UserDao.java
package com.mybatis.demo4;public interface UserDao {public User getUserByName(String name);}
(7) DAO實作類別:com/mybatis/demo2/UserDaoImpl.java
package com.mybatis.demo4;import org.mybatis.spring.SqlSessionTemplate;public class UserDaoImpl implements UserDao {/** * 自訂SqlSession變數和相關的getter/setter,在applicationContext.xml中可靈活配置DAO的屬性名稱 */public SqlSessionTemplate sqlSession;@Overridepublic User getUserByName(String name) {return getSqlSession().selectOne("com.mybatis.demo4.UserMapper.findByName", name);}public SqlSessionTemplate getSqlSession() {return sqlSession;}public void setSqlSession(SqlSessionTemplate sqlSession) {this.sqlSession = sqlSession;}}
(8) 測試類別:com/mybatis/demo2/UserManagerPrgm.java
package com.mybatis.demo4;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserManagerPrgm {public static void main(String[] args) {String configLocation = "com/mybatis/demo4/applicationContext.xml";ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);UserDao dao = (UserDao)context.getBean("userDao");User user = dao.getUserByName("Joe");System.out.println(user);}}