1. 程式人生 > >MyBatis學習(三)---MyBatis和Spring整合

MyBatis學習(三)---MyBatis和Spring整合

session drive beans xmla 連接 加載 test 方法 bsp

想要了解MyBatis基礎的朋友可以通過傳送門:

  MyBatis學習(一)---配置文件,Mapper接口和動態SQL  http://www.cnblogs.com/ghq120/p/8322302.html

  MyBatis學習(二)---數據表之間關聯  http://www.cnblogs.com/ghq120/p/8323918.html

  之前兩篇文章都是單獨介紹了MyBatis的用法,並沒有和任何框架進行整合。使用MyBatis完成數據庫的操作仍有一些模板化的代碼,比如關閉SqlSession、提交事務等。

  MyBatis和Spring整合只有dao組件的接口沒有實現類,避免了顯式調用SqlSession的相關操作數據庫的方法,事務的提交和SqlSession的關閉。

  實現MyBatis和Spring整合且只有接口沒有實現類的要求是:dao組件接口的主文件名和映射文件的主文件名同名,且在同包下,映射文件的命名空間必須是dao組件接口的全限定名,標誌相應的sql語句的id必須是接口的方法名。

MyBatis+Spring

此項目實現的還是用戶的增刪改查

技術分享圖片

使用Spring後,就不需要使用工具類來獲取SqlSessionFactory和SqlSession的對象。通過在Spring容器中配置bean元素來自動獲取。

Spring容器的配置文件如下applicationContext.xml

<?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"> <!-- 配置數據源,指出連接數據庫需要的驅動、url、用戶名和密碼以及連接池相關信息
--> <bean id="dbcpdataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property> <property name="username" value="scott"></property> <property name="password" value="itcast"></property> <property name="initialSize" value="20"></property> <property name="maxActive" value="10"></property> <property name="maxIdle" value="3"></property> <property name="minIdle" value="2"></property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="mybatis-config.xml"></property> <property name="dataSource" ref="dbcpdataSource"></property> </bean> <!-- 配置Dao組件接口的代理類,該bean元素只能配置一個Dao組件的代理類,如果要配置多個,該bean元素要出現多次,根據id來區分 --> <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.ghq.model.dao.UserDao"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> </beans>

由於Spring容器中已經和數據庫建立連接,則MyBatis配置文件中無需再次建立和數據庫的連接,mybatis-config.xml的配置如下

<?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>
        <package name="com.ghq.model.entity"/>
    </typeAliases>
    
  <!-- 註冊映射文件 -->
  <mappers>
    <package name="com.ghq.model.dao"/>
  </mappers>
</configuration>

dao組件中的方法為

public interface UserDao {
    //根據模糊姓名和性別查詢
    List<User> getUserBynameAndGender(Map<String,Object> m);
    //批量刪除用戶
    public boolean delBatchUser(UserVo vo);
}

dao組件的配置文件UserDao.xml

<?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.ghq.model.dao.UserDao">
    <select id="getUserBynameAndGender" parameterType="java.util.Map" resultType="user">
    select * from user_tab 
    <!-- where 標簽默認會去除第一個and,若輸入參數是null,則刪除where條件 -->
    <where>
        <if test="username != null and username != ‘‘">
            and username like ‘%${username}%‘
        </if>
        <if test="gender !=null and gender !=‘‘">
            and gender = #{gender}
        </if>
    </where>
  </select>

    <delete id="delBatchUser" parameterType="UserVo">
    delete from user_tab 
    <where>
      <if test="idlist !=null and idlist.size() > 0">
        and id in
        <foreach collection="idlist" item="id" open="(" close=")" separator=",">
          #{id}
        </foreach>
      </if>
    </where>
  </delete>

</mapper>

單元測試

使用Spring容器來創建對象,則需要先加載Spring容器,創建dao組件接口的對象,調用對象中的方法。

public class testmybatis {
    //根據條件來獲取用戶
    @Test
    public void testgetUserbynameAndGender(){
        SqlSession session = MybatisDb.getSession();
        UserDao userdao = session.getMapper(UserDao.class);
        Map<String,Object> user = new HashMap<String,Object>();
        user.put("username", "張");
        user.put("gender", "女");
        List<User> ulist = userdao.getUserBynameAndGender(user);
        if (ulist !=null && ulist.size() > 0) {
            for (User uu : ulist) {
                System.out.println(uu);
            }
        } else {
            System.out.println("沒有符合條件的用戶");
        }        
    }

    //批量刪除用戶的方法
    @Test
    public void testdelBatchUser(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)context.getBean("userDao");
        UserVo vo = new UserVo();
        List<Integer> idlist = new ArrayList<Integer>();
        idlist.add(8);
        idlist.add(6);
        vo.setIdlist(idlist);
        boolean flag = userDao.delBatchUser(vo);
        if (flag) {
            System.out.println("刪除成功");
        }else{
            System.out.println("刪除失敗");
        }
    }

MyBatis學習(三)---MyBatis和Spring整合