MyBatis-Spring(⼆)--SqlSessionTemplate实现增删改查SqlSessionTemplate是个线称安全的类,每运⾏⼀个SqlSessionTemplate时,它就会重新获取⼀个新的SqlSession,所以每个⽅法都有⼀个独⽴的SqlSession,这意味着它是线称安全的。
上⼀篇⽂章已经介绍过MyBatis-Spring项⽬的搭建过程,本节按照前⾯介绍的流程,通过SqlSessionTemplate实现数据库的增删改差。
第⼀步:创建l⽂件并配置数据源
这⾥使⽤DBCP数据库连接池的⽅式:
1<!-- 第⼀步:配置数据源--使⽤数据库连接池 -->
2<bean id="dataSource" class="org.apachemons.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="batis.spring.SqlSessionFactoryBean">
3<!-- 配置数据源 -->
4<property name="dataSource" ref="dataSource"/>
5<!-- 配置mybatis -->
6<property name="configLocation" value="l"/>
7</bean>
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE configuration
3  PUBLIC "-////DTD Config 3.0//EN"
4  "/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/l"/>
52</mappers>
53
54</configuration>
因为⾥⾯配置了映射器,所以下⼀步需要创建映射器。在创建映射器之前,还要配置SqlSessionTemplate,其配置如下:
1<!--配置sqlSessionTemplate:通过带参数的构造⽅法创建对象 -->
2<bean id="sqlSessionTemplate" class="batis.spring.SqlSessionTemplate">
3<!-- 以sqlSessionFactory为参数传⼊构造函数中 -->
4<constructor-arg ref="sqlSessionFactory"/>
5<!-- mybatis执⾏器,取值范围是SIMPLE/REUSE/BATCH三种类型 -->
6<constructor-arg value="BATCH"/>
7</bean>
详细配置看注释。注意⚠ :数据源、sqlSessionFactory、sqlSessionTemplate都是配置在spring配置⽂件l中。第三步:创建mapper
1  创建接⼝:ProductMapper.java
1public interface ProductMapper {
2
3int insertProduct(Product product);
4
5int deleteByPrimaryKey(String id);
6
7int updateByPrimaryKey(Product product);
8
9    List<Product> selectProducts(String name);
10
11 }
基本的增删改查语句2  创建mapper:l
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/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
1public class BaseTest {
2
3public SqlSessionTemplate template = null;
4    ClassPathXmlApplicationContext context = null;
5
6    @Before
7public void before() {
8        context = new ClassPathXmlApplicationContext("l");
9        template = Bean(SqlSessionTemplate.class);
10    }
11
12 }
2  创建测试类
1public class TestSqlSessionTemplate extends BaseTest {
2
3    @Test
4public void testInsert() {
5        Product product = (Product) Bean("product");
6        String sql = "com.hyc.dao.ProductMapper.insertProduct";
7int add = plate.insert(sql, product);
8        System.out.println(add > 0 ? "插⼊成功" : "插⼊失败");
9    }
10
11    @Test
12public void testDelete() {
13        String sql = "com.hyc.dao.ProductMapper.deleteByPrimaryKey";
14int del = plate.delete(sql, "2");
15        System.out.println(del > 0 ? "删除成功" : "删除失败");
16    }
17
18    @Test
19public void testUpdate() {
20        String sql = "com.hyc.dao.ProductMapper.updateByPrimaryKey";
21        Product product = (Product) Bean("product");
22        product.setProductName("test");
23        product.setProductPrice("4000");
24        product.setProductType("test");
25int update = plate.update(sql, product);
26        System.out.println(update > 0 ? "修改成功" : "修改失败");
27    }
28
29    @Test
30public void testSelect() {
31        String sql = "com.hyc.dao.ProductMapper.selectProducts";
32        List<Product> produts = plate.selectList(sql, "衬");
33        System.out.println(produts.size());
34    }
35 }
下⾯⼀个⼀个执⾏查看测试结果,结果我就不贴出来了,肯定是要成功的结果,下⾯说⼀个测试过程中的问题吧:就是我插⼊、删除、更新都成功了,但返回的不是成功的条数,⽽是个负数-2147482646,经过查阅资料,⽹上都说是因为处理器类型导致的,我在配置中设置的mybatis处理器类型是BATCH,也就是批量,当我把它改成SIMPLE之后就成功了。
总结:其实从上测试中来看,使⽤SqlSessionTemplate获取mapper中的sql时想需要传⼀个字符串,
这个字符串由mapper⽂件中的命名空间+⽅法ID组成,当使⽤字符串时IDE⽆法检查代码的逻辑性,⽽且也很容易出错,所以其实这种⽤法已经被更好的⽅法替代了,开发过程中也很少会使⽤这种⽅式,下⼀篇将会介绍更好的实现⽅式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。