一。创建一个maven项目
pom.xml文件信息:均为最核心的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhaowenhao</groupId>
<artifactId>crud</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<!--数据库连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</project>
二。添加web模块
配置好Tomcat服务器
三。经典的项目目录结构以及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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--spring的配置文件,主要配置和业务逻辑有关的-->
<context:component-scan base-package="com.zhaowenhao">
<!-- 这里和springmvc配置文件的区别:springmvc主要是扫描controller,而spring主要是扫描除控制器之外的组件-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--=============数据源的配置 ===================-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="driverClass" value="${driverClass}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!--===============配置mybatis====================-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="comboPooledDataSource"/>
<property name="mapperLocations" value="classpath:mapper/*"/>
</bean>
<!--配置扫描器将mybatis接口的实现加入到IOC容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有的dao接口的实现,加入到IOC容器中-->
<property name="basePackage" value="com.zhaowenhao.dao"/>
</bean>
<!--=================事务控制的配置=====================-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--控制数据源-->
<property name="dataSource" ref="comboPooledDataSource"/>
</bean>
<aop:config>
<aop:pointcut id="txPoint" expression="execution(* com.zhaowenhao.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="*"/>
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
</beans>
springmvc配置文件
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--设置springmvc扫描的包-->
<context:component-scan base-package="com.zhaowenhao" use-default-filters="false">
<!-- 只扫描控制器-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 将mvc不能处理的访问静态资源请求交给默认的servlet-->
<mvc:default-servlet-handler/>
<!-- 支持使用了像@RquestMapping、ExceptionHandler等等的注解的controller 方法去处理请求 以及 jsr303校验-->
<mvc:annotation-driven/>
</beans>
mybatis配置文件
<?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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.zhaowenhao.bean"/>
</typeAliases>
</configuration>
四。创建数据库以及bean类,DAO接口,mapper的编写
如图,数据库中有两张表。
员工信息表:id, 姓名, 性别, 邮箱, 公寓的id(外键)
公寓信息表:id, 公寓的名字
数据库建好之后,我们就需要编写bean类了以及与之对应的增删查改的dao接口,但是mybatis极大简化了我们的工作。
利用数据库信息,通过mybatis的逆向工程,mybatis会根据我们设计好的数据表,自动生成pojo、mapper以及mapper.xml。真的是很方便了。
这里就不做演示了。想要了解请点击:我要学习mybatis逆向工程。
这里将mybatis的mbg.xml配置文件贴出来:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!--去掉生成的mapper.xml中的注释-->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--配置数据库连接-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ssm_crud?serverTimezone=UTC"
userId="root"
password="199907">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--指定Javabean生成的位置-->
<javaModelGenerator targetPackage="com.zhaowenhao.bean" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--指定sql映射文件生成的位置-->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--指定dao接口的生成的位置,mapper接口-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.zhaowenhao.dao" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table schema="ssm_crud" tableName="tbl_emp" domainObjectName="Employee"></table>
<table schema="ssm_crud" tableName="tnl_dept" domainObjectName="Department"></table>
</context>
</generatorConfiguration>
下面是通过mybatis逆向生成的 pojo, mapper.xml, mapper.java(黄色框框圈出来的):
五。测试DAO接口与数据库的连通性
首先创建测试类 叫做MapperTest.java
package com.zhaowenhao.test;
import com.zhaowenhao.bean.Employee;
import com.zhaowenhao.dao.DepartmentMapper;
import com.zhaowenhao.dao.EmployeeMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Description:
* User: zwh
* Date: 2019-06-04
* Time: 17:36
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class MapperTest {
@Autowired
DepartmentMapper departmentMapper;
@Autowired
EmployeeMapper employeeMapper;
@Autowired
SqlSession sqlSession;
/**
* 测试
*/
@Test
public void testCRUD() {
// 增加两条记录
// System.out.println(departmentMapper.insertSelective(new Department("藤木")));
// System.out.println(departmentMapper.insertSelective(new Department("翔太")));
// System.out.println(employeeMapper.insertSelective(new Employee("菜奈","女","975061263@qq.com",2)));
// System.out.println(employeeMapper.insertSelective(new Employee("尾野","男","975061263@qq.com",3)));
// 删除一条记录
// System.out.println(departmentMapper.deleteByPrimaryKey(1));
// 查找
// System.out.println(departmentMapper.selectByExample(new DepartmentExample()));
// System.out.println(employeeMapper.selectByPrimaryKeyWithDept(1));
/**
* 测试批量处理,首先需要一个默认开启批量处理功能的sqlsession.
* 为了方便起见,我们可以再springIOC容器中配置一个这样的sqlsession
*/
//-----------------未开启批量处理sqlsession--------------------------
// long time = System.currentTimeMillis();
// for (int i = 0; i < 1000; i++) {
// employeeMapper.insertSelective(new Employee("用户" + i, "男", "975061263@qq.com", 2));
// }
// System.out.println("未开启批量处理sqlsession的情况耗时:"+(System.currentTimeMillis()-time));
//-----------------开启批量处理sqlsession之后--------------------------
// long time2 = System.currentTimeMillis();
// EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
// for (int i = 0; i < 1000; i++) {
// employeeMapper.insertSelective(new Employee("用户" + i, "男", "975061263@qq.com", 2));
// }
// System.out.println("开启了批量处理sqlsession的情况耗时:"+(System.currentTimeMillis()-time2));
}
}
这里要注意的地方:
1.
@RunWith(SpringJUnit4ClassRunner.class) 就是一个运行器,这里就是在junit4中运行。 @ContextConfiguration 定义类级元数据,用于确定如何加载和配置ApplicationContext集成测试。(也就是该类在测试环境下该需要用到哪些配置)。
2.除了简单的增删查改操作,此处我们做了一个测试:批量处理测试,插入1000条数据。
未开启批量处理的测试时间为:
开启批量处理的测试时间为:
通过比较:当数据量比较大时,差距还是很大的。未开启用时:6秒,开启后:4秒。
3.为了实现第二步的批量处理,这里通过@autowired从IOC容器中拿到一个我们实现配置好的实现了开启批量处理模式的Sqlsession。(SqlSessionTemplate实现了Sqlsession接口,所以会自动注入)