Mybatis整合Spring(ssm整合待續)-day04

2020-10-05 11:01:08

Mybatis整合Spring

  • 整合版本:
    • Spring 3.2
    • Mybaties 3.2.7
  • 專案結構:
    在這裡插入圖片描述

1. 建立專案

  1. 建立一個javaweb專案
    在這裡插入圖片描述
  2. 在WEB-INF下建立一個lib資料夾用來存放jar包
    在這裡插入圖片描述

2. 匯入jar包

  1. 匯入mybatis核心包與依賴包
    在這裡插入圖片描述
    在這裡插入圖片描述
  2. 匯入mysql資料庫驅動包(根據自己資料庫的版本匯入)
    在這裡插入圖片描述
  3. 匯入資料庫dbcp連線池
    在這裡插入圖片描述
  4. 匯入spring+mvc包
    在這裡插入圖片描述
    在這裡插入圖片描述
  5. 匯入Mybatis-spring整合包
    在這裡插入圖片描述
  6. 總的jar包
    在這裡插入圖片描述

3. 設定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>
        <!--定義單個別名--><!--這樣設定用到全類名的地方就可以寫成別名user-->
        <!--<typeAlias type="com.it.model.User" alias="user"></typeAlias>-->

        <!--批次設定別名-->
        <!--name:指定批次定義別名的類的包名,別名為類名(首字母大小寫都可以)-->
        <!--這樣設定就是該包下的類名的別名就為類名,大小寫都可以
        如:com.it.model包下的User類的別名就可以寫為 User 或 user -->
        <package name="com.it.model"/>
    </typeAliases>

    <!--載入對映檔案-->
    <mappers>
        <!--<mapper resource="com/it/sqlmap/User.xml"></mapper>-->
        <!--第一種:寫對映檔名-->
        <!--<mapper resource="com/it/mapper/UserMapper.xml"></mapper>-->
        <!--第二種:使用完全限定路徑【一般不用】-->
        <!--<mapper url="file:///D:\MyBatis_day01\src\com\it\mapper\UserMapper.xml"></mapper>-->
        <!--第三種:寫類名(使用mapper介面的全限定名)
        一定要有個同名對映檔案與之對應,如果沒有,在UserMapper介面中宣告註解,否則報錯-->
        <!--使用註解設定時,要刪除或改名對映檔案,否則報錯-->
        <!--注意:不使用註解時,此種方法要求mapper介面和mapper對映檔案要名稱相同,且放到同一個目錄下-->
        <!--<mapper class="com.it.mapper.UserMapper"></mapper>-->
        <!--第四種:寫包名【推薦使用】
        註冊指定包下的所有對映檔案-->
        <!--注意:此種方法要求mapper介面和mapper對映檔案要名稱相同,且放到同一個目錄下-->

        <mapper resource="com/it/sqlMap/User.xml"></mapper>

        <package name="com.it.mapper"/><!--注意這種方式(包設定)只適用於Mapper代理-->
    </mappers>
</configuration>

4. 在spring中設定資料來源

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		                    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		                    http://www.springframework.org/schema/mvc
		                    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		                    http://www.springframework.org/schema/context
		                    http://www.springframework.org/schema/context/spring-context-3.2.xsd
		                    http://www.springframework.org/schema/aop
		                    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		                    http://www.springframework.org/schema/tx
		                    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">


    <!-- 1.設定資料庫,dbcp資料庫連線池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///mybatis_day01"/>
        <property name="username" value="root"/>
		<property name="password" value="root"/>
        <!--最大連線數-->
        <property name="maxActive" value="10"/>
        <!--最大空閒數-->
        <property name="maxIdle" value="5"/>
    </bean>
</beans>

5. 在spring中設定SqlSessionFactory

在這裡插入圖片描述

	<!--2.設定對談工廠-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
    </bean>

6. 寫一個User類與它的對映檔案

  • 為以下屬性提供get/set、無參構造、符合自己使用的有參構造,toString
    在這裡插入圖片描述
  • User.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">
<!--
	namespace:名稱空間,它的作用就是對SQL進行分類化管理,可以理解為SQL隔離
	注意:使用mapper代理開發時,namespace有特殊且重要的作用
 -->
<mapper namespace="user">
    <!--
        id:statement的id,要求在名稱空間內唯一
        parameterType:引數的java型別
        resultType:查詢出的單條結果集對應的java型別
        #{}:表示一個預留位置 ?
        #{id}:表示該預留位置待接收引數的名稱為id。注意:如果引數為簡單型別時,#{}裡面的引數名稱可以是任意定義
     -->
    <select id="findUserById" parameterType="int" resultType="com.it.model.User">
		SELECT * FROM USER WHERE id = #{id}
	</select>

</mapper>

7. 使用傳統方式編寫個UserDao與實現類

在這裡插入圖片描述

  • 與hibernate的使用類似,這裡繼承SqlSessionDaoSupport,通過它可以獲取getSqlSession()方法來獲取SqlSession物件,來運算元據庫
    在這裡插入圖片描述
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    @Override
    public User findUserById(int id) {
        return this.getSqlSession().selectOne("user.findUserById",id);
    }
}

8. 在spring中設定dao實現的bean

在這裡插入圖片描述

	<!--設定dao的幾種方式-->
    <!--第一種-->
    <!--3.傳統設定dao【現在一般不用】-->
    <bean class="com.it.dao.impl.UserDaoImpl" id="userDao">
        <property name="sqlSessionFactory" ref="sessionFactory"></property>
    </bean>

9. 傳統dao的測試

	@Test
    public void test1(){
        //1.載入spring組態檔
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2.獲取dao的bean
        UserDao userDao = (UserDao) context.getBean("userDao");

        //3.呼叫dao方法
        User user = userDao.findUserById(1);
        System.out.println(user);
    }

在這裡插入圖片描述

10. 換成Mapper介面整合dao

  1. 建立UserMapper介面(直接複製UserDao介面改名即可)
    在這裡插入圖片描述
  2. 建立UserMapper.xml對映檔案(直接複製User.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">
<!--
	namespace:名稱空間,它的作用就是對SQL進行分類化管理,可以理解為SQL隔離
	注意:使用mapper代理開發時,namespace有特殊且重要的作用
 -->
<mapper namespace="com.it.mapper.UserMapper">

    <select id="findUserById" parameterType="int" resultType="com.it.model.User">
		SELECT * FROM USER WHERE id = #{id}
	</select>

</mapper>

11. 在mybatis核心組態檔中載入對映檔案

  • 上面在設定別名的時候已經給過程式碼
    在這裡插入圖片描述
	<!--載入對映檔案-->
    <mappers>
        <!--<mapper resource="com/it/sqlmap/User.xml"></mapper>-->
        <!--第一種:寫對映檔名-->
        <!--<mapper resource="com/it/mapper/UserMapper.xml"></mapper>-->
        <!--第二種:使用完全限定路徑【一般不用】-->
        <!--<mapper url="file:///D:\MyBatis_day01\src\com\it\mapper\UserMapper.xml"></mapper>-->
        <!--第三種:寫類名(使用mapper介面的全限定名)
        一定要有個同名對映檔案與之對應,如果沒有,在UserMapper介面中宣告註解,否則報錯-->
        <!--使用註解設定時,要刪除或改名對映檔案,否則報錯-->
        <!--注意:不使用註解時,此種方法要求mapper介面和mapper對映檔案要名稱相同,且放到同一個目錄下-->
        <!--<mapper class="com.it.mapper.UserMapper"></mapper>-->
        <!--第四種:寫包名【推薦使用】
        註冊指定包下的所有對映檔案-->
        <!--注意:此種方法要求mapper介面和mapper對映檔案要名稱相同,且放到同一個目錄下-->

        <mapper resource="com/it/sqlMap/User.xml"></mapper>

        <package name="com.it.mapper"/><!--注意這種方式(包設定)只適用於Mapper代理-->
    </mappers>

12. 在Spring中設定MapperFactoryBean

  • 使用工廠Bean生成userMapper物件
    在這裡插入圖片描述
	<!--第二種-->
    <!--4.由spring建立一個userMapper物件,使用工廠來建立物件-->
    <bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="userMapper">
        <property name="sqlSessionFactory" ref="sessionFactory"></property>
        <property name="mapperInterface" value="com.it.mapper.UserMapper"></property>
    </bean>

13. 使用bean工廠來建立物件的測試

	@Test
    public void test2(){
        //1.載入spring組態檔
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2.獲取dao的bean
        UserMapper userMapper = (UserMapper) context.getBean("userMapper");

        //3.呼叫dao方法
        User user = userMapper.findUserById(1);
        System.out.println(user);
    }

在這裡插入圖片描述

14. 使用MapperScannerConfigurer批次掃描建立代理物件

  • 上面12的設定程式碼麻煩,每一個mapper就要建立一個工廠bean
    在這裡插入圖片描述
	<!--第三種-->
    <!--批次建立mapper的bean物件
    內部會掃描指定包下的mapper,為每一個介面建立代理物件,名字就是類名,首字母會自動改成小寫
    使用的時候直接取即可
        注意:
			1.jdk1.8 用這種方式,bean不能建立成功 ,改成jdk1.7的即可
			2.或者spring我換成spring3.2.9或以上就OK了
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.it.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"></property>
    </bean>

15. 使用MapperScannerConfigurer批次掃描建立代理物件測試

-測試與上一個測試相同,直接取userMapper即可(批次掃描會自動建立代理物件)
在這裡插入圖片描述