maven下Spring,Spring mvc整合MyBatis的配置总结和批量操作的效率测试

maven的依赖:

  <dependencies>     
   <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
  
 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
  
  
  <dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>
   
   
   <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
   
  
    
<!-- http://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>


   
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
    
  
<!-- mybatis -->  
  
        <dependency>  
            <groupId>org.mybatis</groupId>  
            <artifactId>mybatis</artifactId>  
            <version>3.2.1</version>  
        </dependency>  
        <dependency>  
           <groupId>org.mybatis</groupId>  
            <artifactId>mybatis-spring</artifactId>  
           <version>1.2.0</version>  
        </dependency>  
        <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <version>5.1.26</version>  
        </dependency>  

  
  </dependencies>

之后maven会下载对应的包。



配置一:使用mybytis-config:此文件可以配置model包下类的别名,也可以配置映射sql语句的mapper文件:

大智如图所示

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.wenyan.model"/>              <!-- 直接将model下的类名作为别名 -->

  <!--    <typeAlias type="com.wenyan.model.User" alias="_User"/> -->  <!--取别名-->
  <!--     <typeAlias type="com.wenyan.model.News" alias="_News"/>-->
</typeAliases>
    <mappers>  
        <mapper resource="com/wenyan/mapper/UserDao.xml"/>  
            <mapper resource="com/wenyan/mapper/NewsDao.xml"/>  
    </mappers>  
    
    
</configuration>



之后要将该文件引入到spring配置文件中:其中jdbcDataSource是数据源,数据源可以有多种方式的,可以直接用jdbc,也可以用阿里的druid

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
    <property name="dataSource" ref="jdbcDataSource" />  
  <!--     <property name="mapperLocations" value="classpath:com/wenyan/mapper/*.xml" />-->        <!--不通过mybatis-config文件-->
    
      <property name="configLocation" value="classpath:mybatis-config.xml"></property>  
</bean>  

 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 -->
        <property name="basePackage" value="com.wenyan.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
 <!-- 配置Spring的事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="jdbcDataSource" />
    </bean>

   <tx:annotation-driven transaction-manager="transactionManager"/> 
   
   <tx:advice id="transactionAdvice" transaction-manager="transactionManager">        <!--拦截器:分配不同种的事务-->
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="append*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />

            <tx:method name="get*" propagation="SUPPORTS" />
            <tx:method name="find*" propagation="SUPPORTS" />
            <tx:method name="load*" propagation="SUPPORTS" />
            <tx:method name="search*" propagation="SUPPORTS" />
            <tx:method name="datagrid*" propagation="SUPPORTS" />

            <tx:method name="*" propagation="SUPPORTS" />
        </tx:attributes>
    </tx:advice>

然后是各自mapper文件了:事例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.wenyan.dao.UserDao">  
<select id="getUser" parameterType="User" resultType="User">  
    SELECT * FROM employee WHERE name  
</select> 


<select id="getUsername" parameterType="User" resultType="User">  
    SELECT name FROM employee WHERE id=#{id} 
</select>  
<insert id="addUser" parameterType="User" flushCache="true">  
   INSERT INTO employee (id,name,salary) VALUES (#{id},#{name},#{salary})  
</insert>  
<update id="updateUser" parameterType="User">  
    UPDATE employee SET name=#{name} WHERE id=#{id}  
</update>  
<delete id="deleteUser" parameterType="int">  
    DELETE FROM employee WHERE id=#{id}  
</delete>  
</mapper>


配置大致如此。


mybatis实现批量操作的几种方式及其比较:

手动方式:

@Test
	public void testinsertshoudong()
	{long time=System.currentTimeMillis();
	 SqlSession sqlSession =this.ss.openSession(ExecutorType.BATCH);  //务必使用ExecutorType.BATCH,若使用不带参数将默认提交
//	SqlSession sqlSession =this.ss.openSession();
		UserDao udao =sqlSession.getMapper(UserDao.class);
		
		try{
		
		
		for(int i=0;i<10000;i++)
		{
		 User user=new User();
	    user.setName("sjdhfjk"+i);
	    user.setSalary(100);
	     udao.addUser(user);
	}
		sqlSession.commit();
		System.out.println(System.currentTimeMillis()-time);
		}
		catch (Exception e) {
		sqlSession.rollback();
			
		}
		finally {
			sqlSession.close();
		}
		
	}
	


  spring管理的声明式事务管理来实现:

server层,中声明了事务:

public void inserall()
	{
		
		
		for(int i=0;i<10000;i++)
		{
		 User user=new User();
	
	    user.setName("sjdhfjk"+i);
	    user.setSalary(100);
	     udo.addUser(user);
		}
		
	}
Test种测试:
public void inserall()
	{
		
		
		for(int i=0;i<10000;i++)
		{
		 User user=new User();
	
	    user.setName("sjdhfjk"+i);
	    user.setSalary(100);
	     udo.addUser(user);
		}
		
	}


第三种,拼接来插入:

创建一个拼接的语句:

mapper.xml文件下:
<insert id="batchInsert" parameterType="List">  
    insert into employee (name,salary) values  
    <foreach collection="list" item="user" index="index" separator="," >  
         (#{user.name}, #{user.salary})  
    </foreach>  
  </insert>  

server层中声明事务后:
public void inserbatch()
	{
		
		List<User> users=new ArrayList<User>();
		for(int i=0;i<10000;i++)
		{
			
			User user=new User();
			
		    user.setName("sjdhfjk"+i);
		    user.setSalary(100);
		    users.add(user);
		}
		udo.batchInsert(users);
	}

Test中测试:
@Test
	public void testinsertbatch()
	{
		long time=System.currentTimeMillis();
		nsv.inserbatch();
		System.out.println(System.currentTimeMillis()-time);
	}

两份数据:一份50,一份20000:

最终结果测试:

声明事务			链接字符串			手动	
50条	20000条		50条	20000条		50条	20000条
124	4787		145	1645		112	3671
19	1995		10	485		15	2057
24	2018		9	294		16	1993
23	2202		10	625		16	1888
20	1961		28	326		18	2052
18	2045		9	293		16	2313
19	1976		9	338		15	1930
19	2081		8	269		13	1725
20	1965		10	1231		15	1719
16	2429		9	343		16	1717
17	1970		8	295		13	2512
16	2055		7	270		15	1742
16	2043		6	732		15	1764
26	2351		7	284		14	2651
17	2521		8	277		14	2358
17	2741		7	298		22	1736
19	2002		6	311		16	1880
16	1994		7	945		13	1733
14	2069		7	267		12	1717
15	2037		7	286		16	1973


测试代码:

类似如此:

@Test
	public void testinsertall_10()
	{
		List<Long> times=new ArrayList<Long> ();
		for(int i=0;i<20;i++)
		{
		long time=System.currentTimeMillis();
		nsv.inserall();
		long time2=System.currentTimeMillis()-time;
		times.add(time2);
		}
		for(int i=0;i<times.size();i++)
		{
			System.out.println(times.get(i));
		}
	}


总结:连接字符串的方法是非常快的,手动和声明都差不多。







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值