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));
}
}
总结:连接字符串的方法是非常快的,手动和声明都差不多。