1. 程式人生 > >mybatis基礎(下)

mybatis基礎(下)

oid bst cdata port 執行 clas nts trac ssd

  • mybatis和spring整合
    • 需要spring通過單例方式管理SqlSessionFactory
    • spring和mybatis整合生成代理對象,使用SqlSessionFactory創建SqlSession
    • 持久層的mapper都需要由spring進行管理
    • 需要導入的jar包
      • 技術分享圖片

        技術分享圖片

    • 需要建立的文件
      • 技術分享圖片
    • 需要建立的包
      • 技術分享圖片
    • 在applicationContext.xml配置sqlSessionFactory
      • 創建applicationContext.xml
        • 技術分享圖片
      • 配置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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加載配置文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 數據源,使用dbcp --> <!-- driverClassName: url: username: password: maxActive: maxIdle:
          --> <bean id="dataSource" class="org.apache.commons.dbcp2.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}"/> <!--<property name="maxActive" value="10"/>--> <property name="maxIdle" value="5"/> </bean> <!-- 配置SqlSessionFactory --> <!-- class
          :設置為mybatis-spring.jar中的類 id:唯一表示標識 --> <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加載mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml"/> <!-- 加載數據源 --> <property name="dataSource" ref="dataSource"/> </bean> </beans>
    •  整合代碼及其bug
      • 若報找不到org.springframework.dao.support.DaoSupport的類文件
        • 導入spring-tx-4.3.5.RELEASE.jar
      • 若報java.lang.ClassNotFoundException: org.apache.commons.pool2.PooledObjectFactory

        • 導入commons-pool2-2.6.1.jar
      • 若報java.lang.NoClassDefFoundError: org/springframework/aop/support/AopUtils

        • 導入spring-aop-4.3.5.RELEASE.jar
      • 若報nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
        • 導入spring-jdbc-4.3.5.RELEASE.jar
        • 原生dao
          /**
           * dao接口實現類需要註入SqlSessionFactory,通過spring進行註入
           * 這裏通過spring聲明配置方式,配置dao的bean
           */
          public interface UserDao {
          
          
              public abstract List<User> selectAllUser();
          
          }
          
          /**
           * UserDao的實現類
           */
          public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
          
          
              @Override
              public List<User> selectAllUser() {
                  //繼承SqlSessionDaoSupport,通過this.getSqlSession()得到sqlSession
                  SqlSession connection = this.getSqlSession();
                  List<User> users = connection.selectList("user.selectAllUser");
          
                  //方法結束就自動關閉,所以不需要close();
                  //connection.close();
                  return users;
              }
          }
          
          
          <!-- 在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"
                         xmlns:context="http://www.springframework.org/schema/context"
                     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
          
                  <!-- 加載配置文件 -->
                      <context:property-placeholder location="classpath:db.properties"/>
                  <!-- 數據源,使用dbcp -->
                  <!--
                      driverClassName:
                      url:
                      username:
                      password:
                      maxActive:
                      maxIdle:
                  -->
                  <bean id="dataSource" class="org.apache.commons.dbcp2.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}"/>
                      <!--<property name="maxActive" value="10"/>-->
                      <property name="maxIdle" value="5"/>
                  </bean>
                  <!-- 配置SqlSessionFactory -->
                  <!--
                  class:設置為mybatis-spring.jar中的類
                  id:唯一表示標識
                  -->
                  <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                      <!-- 加載mybatis的配置文件 -->
                      <property name="configLocation" value="mybatis/SqlMapConfig.xml"/>
                      <!-- 加載數據源 -->
                      <property name="dataSource" ref="dataSource"/>
          
                  </bean>
          
          
                  <!-- 原始dao接口 -->
                  <bean id="userDao" class="cn.muriel.ssm.dao.impl.UserDaoImpl">
                      <property name="sqlSessionFactory" ref="SqlSessionFactory"/>
                  </bean>
          
              </beans>
          
          
          
          
          
          <!-- 在userMapper.xml配置 -->
          
          
            <?xml version="1.0" encoding="UTF-8" ?>
            <!-- 此時您可能想知道SqlSession或Mapper類究竟執行了什麽。
                MyBatis提供的全套功能可以通過使用多年來MyBatis流行的基於XML的映射語言來實現。
                如果您以前使用過MyBatis,那麽您將很熟悉這個概念,但是對XML映射文檔進行了大量改進,以後會很清楚。 -->
            <!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="cn.muriel.ssm.dao.UserDao">
          
          
                  <select id="selectAllUser" resultType="cn.muriel.mybatis.po.User">
          
                          select * from user
          
                </select>
            </mapper>
          
          
          
          
          
          <!-- 測試 -->
              public class TestUtil {
          
                  private static ApplicationContext applicationContext;
          
                  //在setUp這個方法得到spring容器
                  public static void main(String[] args) {
          
                      applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
          
                      UserDao userDao = (UserDao) applicationContext.getBean("userDao");
                  
                      JSONArray sendJson = JSONArray.fromObject(userDao.selectAllUser());
                      System.out.println(sendJson + "");
                  
          
              }
          }
          
                      
               
                  

        • 代理mapper
          /**
           * dao接口實現類需要註入SqlSessionFactory,通過spring進行註入
           * 這裏通過spring聲明配置方式,配置dao的bean
           */
          public interface UserMapper {
          
          
              public abstract List<User> selectAllUser();
          
          }
          
          /**
           * UserDao的實現類
           */
          public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
          
          
              @Override
              public List<User> selectAllUser() {
                  //繼承SqlSessionDaoSupport,通過this.getSqlSession()得到sqlSession
                  SqlSession connection = this.getSqlSession();
                  List<User> users = connection.selectList("user.selectAllUser");
          
                  //方法結束就自動關閉,所以不需要close();
                  //connection.close();
                  return users;
              }
          }
          
          
          <!-- 在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"
                         xmlns:context="http://www.springframework.org/schema/context"
                     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
          
                  <!-- 加載配置文件 -->
                      <context:property-placeholder location="classpath:db.properties"/>
                  <!-- 數據源,使用dbcp -->
                  <!--
                      driverClassName:
                      url:
                      username:
                      password:
                      maxActive:
                      maxIdle:
                  -->
                  <bean id="dataSource" class="org.apache.commons.dbcp2.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}"/>
                      <!--<property name="maxActive" value="10"/>-->
                      <property name="maxIdle" value="5"/>
                  </bean>
                  <!-- 配置SqlSessionFactory -->
                  <!--
                  class:設置為mybatis-spring.jar中的類
                  id:唯一表示標識
                  -->
                  <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                      <!-- 加載mybatis的配置文件 -->
                      <property name="configLocation" value="mybatis/SqlMapConfig.xml"/>
                      <!-- 加載數據源 -->
                      <property name="dataSource" ref="dataSource"/>
          
                  </bean>
          
          
             
              
                 <!-- mapper配置 -->
                  <!--
                      class為mybatis-spring.jar下的類
                      MapperFactoryBean:根據mapper接口生成代理對象
                  -->
                   <!-- UserMapper.java和userMapper.xml在同一個包下 -->
                  <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
                      <property name="mapperInterface" value="cn.muriel.ssm.mapper.UserMapper"/>
              <!-- 若ref改為value,則報ConversionNotSupportedException -->
                      <property name="sqlSessionFactory" rel="SqlSessionFactory"/>
                  </bean>
          
              </beans>
          
          
          
          
          
          <!-- 在userMapper.xml配置 -->
          
          
            <?xml version="1.0" encoding="UTF-8" ?>
            <!-- 此時您可能想知道SqlSession或Mapper類究竟執行了什麽。
                MyBatis提供的全套功能可以通過使用多年來MyBatis流行的基於XML的映射語言來實現。
                如果您以前使用過MyBatis,那麽您將很熟悉這個概念,但是對XML映射文檔進行了大量改進,以後會很清楚。 -->
            <!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="cn.muriel.ssm.mapper.UserMapper">
          
          
                  <select id="selectAllUser" resultType="cn.muriel.mybatis.po.User">
          
                          select * from user
          
                </select>
            </mapper>
          
          
          
          
          
          <!-- 測試 -->
              public class TestUtil {
          
                  private static ApplicationContext applicationContext;
          
                  //在setUp這個方法得到spring容器
                  public static void main(String[] args) {
          
                      applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
          
                      UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
                  
                      JSONArray sendJson = JSONArray.fromObject(userMapper.selectAllUser());
                      System.out.println(sendJson + "");
                  
          
              }
          }
          
                      
               
                  

        • mapper的掃描配置
          /**
           * dao接口實現類需要註入SqlSessionFactory,通過spring進行註入
           * 這裏通過spring聲明配置方式,配置dao的bean
           */
          public interface UserMapper {
          
          
              public abstract List<User> selectAllUser();
          
          }
          
          /**
           * UserDao的實現類
           */
          public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
          
          
              @Override
              public List<User> selectAllUser() {
                  //繼承SqlSessionDaoSupport,通過this.getSqlSession()得到sqlSession
                  SqlSession connection = this.getSqlSession();
                  List<User> users = connection.selectList("user.selectAllUser");
          
                  //方法結束就自動關閉,所以不需要close();
                  //connection.close();
                  return users;
              }
          }
          
          
          <!-- 在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"
                         xmlns:context="http://www.springframework.org/schema/context"
                     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
          
                  <!-- 加載配置文件 -->
                      <context:property-placeholder location="classpath:db.properties"/>
                  <!-- 數據源,使用dbcp -->
                  <!--
                      driverClassName:
                      url:
                      username:
                      password:
                      maxActive:
                      maxIdle:
                  -->
                  <bean id="dataSource" class="org.apache.commons.dbcp2.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}"/>
                      <!--<property name="maxActive" value="10"/>-->
                      <property name="maxIdle" value="5"/>
                  </bean>
                  <!-- 配置SqlSessionFactory -->
                  <!--
                  class:設置為mybatis-spring.jar中的類
                  id:唯一表示標識
                  -->
                  <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                      <!-- 加載mybatis的配置文件 -->
                      <property name="configLocation" value="mybatis/SqlMapConfig.xml"/>
                      <!-- 加載數據源 -->
                      <property name="dataSource" ref="dataSource"/>
          
                  </bean>
          
          
             
              
                  <!-- mapper批量掃描,從mapper包中掃描出mapper接口,自動創    建代理對象並且在spring容器中註冊 -->
                      <!-- 自動掃描出來的mapper的bean的id為mapper類名(首字母小寫) -->
                      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                         <!--
                           指定掃描的包名
                           指定mapper接口的包名,mybatis自動掃描包下邊所以mapper接口進行加載
                           遵循一些規範:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄中
                           如果掃描多個包,每個包中間使用逗號分隔
                         -->
                         <property name="basePackage" value="cn.muriel.ssm.mapper"/>
                         <!-- 數據源 -->
                          <property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"/>
                      </bean>
          
              </beans>
          
          
          
          
          <!-- 在userMapper.xml配置 -->
          
          
            <?xml version="1.0" encoding="UTF-8" ?>
            <!-- 此時您可能想知道SqlSession或Mapper類究竟執行了什麽。
                MyBatis提供的全套功能可以通過使用多年來MyBatis流行的基於XML的映射語言來實現。
                如果您以前使用過MyBatis,那麽您將很熟悉這個概念,但是對XML映射文檔進行了大量改進,以後會很清楚。 -->
            <!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="cn.muriel.ssm.mapper.UserMapper">
          
          
                  <select id="selectAllUser" resultType="cn.muriel.mybatis.po.User">
          
                          select * from user
          
                </select>
            </mapper>
          
          
          
          
          
          <!-- 測試 -->
              public class TestUtil {
          
                  private static ApplicationContext applicationContext;
          
                  //在setUp這個方法得到spring容器
                  public static void main(String[] args) {
          
                      applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
          
                      UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
                  
                      JSONArray sendJson = JSONArray.fromObject(userMapper.selectAllUser());
                      System.out.println(sendJson + "");
                  
          
              }
          }
          
                      
                                   

mybatis基礎(下)