1. 程式人生 > >MyBatis-Spring(二)--SqlSessionTemplate實現增刪改查

MyBatis-Spring(二)--SqlSessionTemplate實現增刪改查

允許 ref ack part basic pre 就是 path pda

SqlSessionTemplate是個線稱安全的類,每運行一個SqlSessionTemplate時,它就會重新獲取一個新的SqlSession,所以每個方法都有一個獨立的SqlSession,這意味著它是線稱安全的。

上一篇文章已經介紹過MyBatis-Spring項目的搭建過程,本節按照前面介紹的流程,通過SqlSessionTemplate實現數據庫的增刪改差。

第一步:創建spring-mybatis.xml文件並配置數據源

這裏使用DBCP數據庫連接池的方式:

 1 <!-- 第一步:配置數據源--使用數據庫連接池 -->
 2     <bean 
id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 3 <property name="driverClassName" value="org.postgresql.Driver" /> 4 <property name="url" value="jdbc:postgresql://localhost:5433/postgres" /> 5 <property name="username" value="postgres" />
6 <property name="password" value="postgres" /> 7 <!-- 最大數據庫連接數 --> 8 <property name="maxActive" value="100" /> 9 <!-- 最大空閑數,即等待連接數 --> 10 <property name="maxIdle" value="5" /> 11 <!-- 最大等待連接時間 --> 12 <
property name="maxWait" value="10000" /> 13 </bean>

第二步:配置SqlSessionFactory

1 <!--第二步:配置SqlSessionFactory -->
2     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
3         <!-- 配置數據源 -->
4         <property name="dataSource" ref="dataSource" />
5         <!-- 配置mybatis -->
6         <property name="configLocation" value="mybatis-config2.xml" />
7 </bean>
mybatis-config2.xml的配置如下:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <!-- mybatis的基本配置文件:主要配置基本的上下文參數和運行環境 -->
 6 <configuration>
 7     <!--設置 -->
 8     <settings>
 9         <!--緩存配置的全局開關:如果這裏設置成false,那麽即便在映射器中配置開啟也無濟於事 -->
10         <setting name="cacheEnabled" value="true" />
11         <!--延時加載的全局開關 -->
12         <setting name="lazyLoadingEnabled" value="false" />
13         <!-- 是否允許單一語句返回多結果集 -->
14         <setting name="multipleResultSetsEnabled" value="false" />
15         <!-- 使用列標簽代替列名,需要兼容驅動 -->
16         <setting name="useColumnLabel" value="true" />
17         <!-- 允許JDBC自動生成主鍵,需要驅動兼容。如果設置為true,則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍能正常工作 -->
18         <setting name="useGeneratedKeys" value="false" />
19         <!-- 指定MyBatis該如何自動映射列到字段或屬性:NONE表示取消自動映射;PARTIAL表示只會自動映射,沒有定義嵌套結果集和映射結果集;FULL會自動映射任意復雜的結果集,無論是否嵌套 -->
20         <setting name="autoMappingBehavior" value="PARTIAL" />
21         <!-- 配置默認的執行器:SIMPLE是普通的執行器;REUSE會重用預處理語句;BATCH會重用語句並執行批量更新 -->
22         <setting name="defaultExecutorType" value="SIMPLE" />
23         <!--設置超時時間:它決定驅動等待數據庫響應的秒數,任何正整數 -->
24         <!-- <setting name="defaultStatementTimeout" value="25"/> -->
25         <!--設置數據庫驅動程序默認返回的條數限制,此參數可以重新設置,任何正整數 -->
26         <!-- <setting name="defaultFetchSize" value="100" /> -->
27         <!-- 允許在嵌套語句中使用分頁(RowBounds) -->
28         <setting name="safeRowBoundsEnabled" value="false" />
29         <!-- 是否開啟自動駝峰命名規則,即從a_example到aExample的映射 -->
30         <setting name="mapUnderscoreToCamelCase" value="true" />
31         <!-- 本地緩存機制,防止循環引用和加速重復嵌套循環 -->
32         <setting name="localCacheScope" value="SESSION" />
33         <!-- 當沒有為參數提供特定JDBC類型時,為空值指定JDBC類型。某些驅動需要指定列的JDBC類型,多數情況直接用一般類型即可,如NULL/VARCHAR/OTHER -->
34         <setting name="jdbcTypeForNull" value="OTHER" />
35         <!-- 指定觸發延遲加載的方法,如equals/clone/hashCode/toString -->
36         <setting name="lazyLoadTriggerMethods" value="equals" />
37     </settings>
38     <!--類型命名 -->
39     <!--別名:pojo對象的別名 -->
40     <typeAliases>
41         <!-- 對包進行掃描,可以批量進行別名設置,設置規則是:獲取類名稱,將其第一個字母變為小寫 -->
42         <package name="com.hyc.pojo" />
43         <package name="com.hyc.objectfactory" />
44         <package name="com.hyc.bean" />
45         <package name="com.hyc.dao" />
46     </typeAliases>
47     <!--插件 -->
48     <!-- <plugins /> -->
49     <!-- 映射器 -->
50     <mappers>
51         <mapper resource="com/hyc/mapper/ProductMapper.xml" />
52     </mappers>
53 
54 </configuration>

因為裏面配置了映射器,所以下一步需要創建映射器。在創建映射器之前,還要配置SqlSessionTemplate,其配置如下:

1 <!--配置sqlSessionTemplate:通過帶參數的構造方法創建對象 -->
2     <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
3         <!-- 以sqlSessionFactory為參數傳入構造函數中 -->
4         <constructor-arg ref="sqlSessionFactory" />
5         <!-- mybatis執行器,取值範圍是SIMPLE/REUSE/BATCH三種類型 -->
6         <constructor-arg value="BATCH" />
7 </bean>

詳細配置看註釋。註意??:數據源、sqlSessionFactory、sqlSessionTemplate都是配置在spring配置文件spring-mybatis.xml中。

第三步:創建mapper

1??創建接口:ProductMapper.java

 1 public interface ProductMapper {
 2 
 3     int insertProduct(Product product);
 4 
 5     int deleteByPrimaryKey(String id);
 6 
 7     int updateByPrimaryKey(Product product);
 8 
 9     List<Product> selectProducts(String name);
10 
11 }

2??創建mapper:ProductMapper.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.hyc.dao.ProductMapper">
 4     <resultMap id="BaseResultMap" type="com.hyc.pojo.Product">
 5         <id column="id" jdbcType="VARCHAR" property="id" />
 6         <result column="product_name" jdbcType="VARCHAR" property="productName" />
 7         <result column="product_price" jdbcType="VARCHAR" property="productPrice" />
 8         <result column="product_type" jdbcType="VARCHAR" property="productType" />
 9     </resultMap>
10     <sql id="Base_Column_List">
11         id, product_name, product_price, product_type
12     </sql>
13 
14     <!-- 查詢所有產品 -->
15     <select id="selectProducts" resultMap="BaseResultMap" parameterType="String">
16         select * from product where product_name like concat(‘%‘,#{name},‘%‘)
17     </select>
18 
19     <!-- 插入產品 -->
20     <insert id="insertProduct" parameterType="com.hyc.pojo.Product">
21         insert into product
22         (id,
23         product_name, product_price,
24         product_type)
25         values
26         (#{id,jdbcType=VARCHAR}, #{productName,jdbcType=VARCHAR},
27         #{productPrice,jdbcType=VARCHAR},
28         #{productType,jdbcType=VARCHAR})
29     </insert>
30 
31     <!-- 根據ID刪除產品 -->
32     <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
33         delete from
34         product
35         where id = #{id,jdbcType=VARCHAR}
36     </delete>
37 
38     <!--修改產品 -->
39     <update id="updateByPrimaryKey" parameterType="com.hyc.pojo.Product">
40         update product
41         set
42         product_name = #{productName,jdbcType=VARCHAR},
43         product_price =
44         #{productPrice,jdbcType=VARCHAR},
45         product_type =
46         #{productType,jdbcType=VARCHAR}
47         where id = #{id,jdbcType=VARCHAR}
48     </update>
49 </mapper>

在mapper中實現數據庫的增刪改差操作

第四步:創建單元測試:

1??先創建一個基類初始化SqlSessionTemplate

 1 public class BaseTest {
 2 
 3     public SqlSessionTemplate template = null;
 4     ClassPathXmlApplicationContext context = null;
 5 
 6     @Before
 7     public void before() {
 8         context = new ClassPathXmlApplicationContext("classpath:spring-mybatis.xml");
 9         template = context.getBean(SqlSessionTemplate.class);
10     }
11 
12 }

2??創建測試類

 1 public class TestSqlSessionTemplate extends BaseTest {
 2 
 3     @Test
 4     public void testInsert() {
 5         Product product = (Product) super.context.getBean("product");
 6         String sql = "com.hyc.dao.ProductMapper.insertProduct";
 7         int add = super.template.insert(sql, product);
 8         System.out.println(add > 0 ? "插入成功" : "插入失敗");
 9     }
10 
11     @Test
12     public void testDelete() {
13         String sql = "com.hyc.dao.ProductMapper.deleteByPrimaryKey";
14         int del = super.template.delete(sql, "2");
15         System.out.println(del > 0 ? "刪除成功" : "刪除失敗");
16     }
17 
18     @Test
19     public void testUpdate() {
20         String sql = "com.hyc.dao.ProductMapper.updateByPrimaryKey";
21         Product product = (Product) super.context.getBean("product");
22         product.setProductName("test");
23         product.setProductPrice("4000");
24         product.setProductType("test");
25         int update = super.template.update(sql, product);
26         System.out.println(update > 0 ? "修改成功" : "修改失敗");
27     }
28 
29     @Test
30     public void testSelect() {
31         String sql = "com.hyc.dao.ProductMapper.selectProducts";
32         List<Product> produts = super.template.selectList(sql, "襯");
33         System.out.println(produts.size());
34     }
35 }

下面一個一個執行查看測試結果,結果我就不貼出來了,肯定是要成功的結果,下面說一個測試過程中的問題吧:就是我插入、刪除、更新都成功了,但返回的不是成功的條數,而是個負數-2147482646,經過查閱資料,網上都說是因為處理器類型導致的,我在配置中設置的mybatis處理器類型是BATCH,也就是批量,當我把它改成SIMPLE之後就成功了。

總結:其實從上測試中來看,使用SqlSessionTemplate獲取mapper中的sql時想需要傳一個字符串,這個字符串由mapper文件中的命名空間+方法ID組成,當使用字符串時IDE無法檢查代碼的邏輯性,而且也很容易出錯,所以其實這種用法已經被更好的方法替代了,開發過程中也很少會使用這種方式,下一篇將會介紹更好的實現方式。

MyBatis-Spring(二)--SqlSessionTemplate實現增刪改查