本篇文章主要为项目总结的一部分,其中主要为Mybatis的基础增删改查,包括单元测试。详细地记录了操作过程和代码,以作备忘。使用的是spring4+mybatis3+mysql,前后端分离,数据交互采用json,使用Maven管理,IDE为IDEA。
一、搭建SSM框架
1、创建项目:
创建Maven项目后设置Artifacts、Facets及run servers,配置完成后设置一般的项目结构bean/controller/service/dao/mapping等等,如下图:
2、添加Maven,主要为Spring4+Mybaits+mysql驱动+c3p0+jackson
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring核心包-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--数据连接相关-->
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--json相关-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-jaxb-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider -->
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!--工具包-->
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.7.0</version>
</dependency>
<!--JWT-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
3、配置文件
web.xml需要配置1)启动spring容器,2)编码过滤器,3)springmvc的前端控制器(DispacherServlet)
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!--启动spring的容器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mybatis.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--springmvc的前端控制器,请求重定向到相应的控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-mybaits.xml需要配置1)自动扫描数据库属性文件,2)配置数据源,3)spring和mybatis整合(指定数据源+mapper文件位置),4)配置扫描器,将mybaits接口实现加入到ioc容器中
<?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:Context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--自动扫描数据库属性文件-->
<context:property-placeholder location="classpath:prop/db.properties"></context:property-placeholder>
<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
<!--spring和mybaits整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--指定数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--指定mybaits.mapper文件的位置-->
<property name="mapperLocations" value="classpath*:mapping/*.xml"></property>
</bean>
<!--配置扫描器,将mybaits接口的实现加入到ioc容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.hld.dispatch.dao"></property>
<!--使用多个DataSource-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!--事务管理-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
spring-mvc.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: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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--启用注解扫描-->
<context:component-scan base-package="com.hld.dispatch"></context:component-scan>
<!--开启注解-->
<mvc:annotation-driven/>
<!--避免执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</beans>
二、编写程序
1、拆分模块编写程序
这个思路就是根据controller>service>dao>mapper来编写,controller写处理请求的操作,里面调用service实现具体功能,service里再调用dao与数据库交互,根据mybatis的特性写mapper映射。以下是具体实现:
1)查询(与条件查询、分页查询结合)
条件查询采用了mybatis的动态sql,分页查询是采用mysql的limit实现;
2)更新(新增和编辑)
这里controller层是合在一起的,在service根据前端传递的userId进行识别,如果userId是-1(数据库没有的),则进行插入操作;如果userId存在,就根据userId进行数据更新。
3)删除(批量删除)
这里采用了in的方式,可以进行批量或单个删除。
好啦,话不多少,上代码:
controller层
@Controller
@RequestMapping(value = "/userManagement")
public class UserManagementController {
@Autowired
private UserManagementService userManagementService;
/*
获取人员列表(信息和总数)
*/
@RequestMapping(value = "getUsers",method = RequestMethod.GET)
@ResponseBody
public BaseResponse getUserList(Integer pageSize,Integer startPage,Integer unitQid,String userName){
BaseResponse baseResponse =new BaseResponse();
try{
Map<String, Object> users = userManagementService.getUserList(pageSize,startPage,unitQid,userName);
baseResponse.setCode(BaseResponse.RESPONSE_SUCCESS_CODE);
baseResponse.setMsg("获取人员列表成功");
baseResponse.setData(users);
}catch (Exception e){
baseResponse.setCode(BaseResponse.RESPONSE_ERROR_CODE);
baseResponse.setMsg("获取人员列表失败");
}finally {
return baseResponse;
}
}
/*
更新人员信息
*/
@RequestMapping(value = "UpdateUserInfo",method = RequestMethod.POST)
@ResponseBody
public BaseResponse updateUserInfo(@RequestBody BaseUser params){
BaseResponse baseResponse =new BaseResponse();
try{
int count = userManagementService.updateUserInfo(params);
baseResponse.setCode(BaseResponse.RESPONSE_SUCCESS_CODE);
baseResponse.setMsg("更新人员信息成功");
baseResponse.setData(count);
}catch (Exception e){
baseResponse.setCode(BaseResponse.RESPONSE_ERROR_CODE);
baseResponse.setMsg("更新人员信息失败");
}finally {
return baseResponse;
}
}
/*
删除人员信息
*/
@RequestMapping(value = "DeleteUserInfo",method = RequestMethod.POST)
@ResponseBody
public BaseResponse deleteUserInfo(@RequestBody List<String> list){
BaseResponse baseResponse =new BaseResponse();
try{
String userIds = "";
for(String userId:list){
userIds += userId+",";
}
userIds = userIds.substring(0,userIds.length()-1);
int count=userManagementService.deleteUserInfo(userIds);
baseResponse.setCode(BaseResponse.RESPONSE_SUCCESS_CODE);
baseResponse.setMsg("删除人员信息成功");
baseResponse.setData(count);
}catch (Exception e){
baseResponse.setCode(BaseResponse.RESPONSE_ERROR_CODE);
baseResponse.setMsg("删除人员信息失败");
}finally {
return baseResponse;
}
}
}
service层(接口)
package com.hld.dispatch.service;
import com.hld.dispatch.bean.BaseUser;
import java.util.Map;
public interface UserManagementService {
//获取人员列表(信息和总数)
Map<String, Object> getUserList(Integer pageSize, Integer startPage, Integer unitQid, String userName);
//更新人员信息
int updateUserInfo(BaseUser baseUser);
//删除人员信息
int deleteUserInfo(String userIds);
}
service层(实现)
package com.hld.dispatch.service.Impl;
import com.hld.dispatch.bean.BaseUser;
import com.hld.dispatch.dao.UserManagementDao;
import com.hld.dispatch.service.UserManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class UserManagementServiceImpl implements UserManagementService {
@Autowired
private UserManagementDao userManagementDao;
@Autowired
private BaseDataServiceImpl baseDataServiceImpl;
/*
获取人员列表(信息和总数)
*/
public Map<String, Object> getUserList(Integer pageSize, Integer startPage, Integer unitQid, String userName){
Integer start = (startPage - 1) * pageSize;
String unitIds="";
if(unitQid!=null){
unitIds=baseDataServiceImpl.getChildUnit(unitQid);
}
List<Map<String, Object>> infoList =userManagementDao.getUserList(pageSize,start,unitIds,userName);
int count = userManagementDao.getUserCount(pageSize,start,unitIds,userName);
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("infoList",infoList);
resultMap.put("count",count);
return resultMap;
}
/*
更新或新增人员列表信息
*/
public int updateUserInfo(BaseUser baseUser){
int count = 0;
int userId = baseUser.getId();
if(userId == -1){
count=userManagementDao.newUserInfo(baseUser);//没有Id的话就插入
}else{
count=userManagementDao.updateUserInfo(baseUser);//有传递Id的话就更新
}
return count;
}
/*
删除人员列表信息
*/
public int deleteUserInfo(String userIds){
int count = 0;
count=userManagementDao.deleteUserInfo(userIds);
return count;
}
}
Dao层
package com.hld.dispatch.dao;
import com.hld.dispatch.bean.BaseUser;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface UserManagementDao {
//获取人员信列表信息
List<Map<String, Object>> getUserList(@Param("pageSize") Integer pageSize,
@Param("start") Integer start,
@Param("unitIds") String unitIds,
@Param("userName") String userName);
//获取人员列表总数
int getUserCount(@Param("pageSize") Integer pageSize,
@Param("start") Integer start,
@Param("unitIds") String unitIds,
@Param("userName") String userName);
//新增人员信息
int newUserInfo(BaseUser baseUser);
//更改人员信息
int updateUserInfo(BaseUser baseUser);
//删除人员信息
int deleteUserInfo(@Param("userIds")String userIds);
}
mapper(映射Dao)
<?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.hld.dispatch.dao.UserManagementDao">
<!--按条件获取用户列表信息-->
<select id="getUserList" resultType="java.util.HashMap">
select
u.user_id,
u.userName,
u.user_role,
u.user_role_id,
ifnull(u.mobilePhone,'') mobilePhone,
ifnull(u.officePhone,'') officePhone,
u.super_unit_name,
u.super_unit_id,
u.unitName,
u.unit_id
from
unit_user u
where 1=1
<if test="userName != null and userName != '' ">
and u.userName like '%${userName}%'
</if>
<if test="unitIds != null and unitIds != '' ">
and u.unit_id in (${unitIds})
</if>
order by u.user_id
limit #{start},#{pageSize}
</select>
<!--按条件获取用户列表总数-->
<select id="getUserCount" resultType="int">
select
count(1)
from
unit_user u
where 1=1
<if test="userName != null and userName != '' ">
and u.userName like '%${userName}%'
</if>
<if test="unitIds != null and unitIds != '' ">
and u.unit_id in (${unitIds})
</if>
</select>
<!--新增用户信息-->
<insert id="newUserInfo" parameterType="com.hld.dispatch.bean.BaseUser" useGeneratedKeys="true" keyProperty="id">
insert into
base_user(userName,
post,
mobilePhone,
officePhone,
unitId)
values(#{userName},
#{post},
#{mobilePhone},
#{officePhone},
#{unitId})
</insert>
<!--修改用户信息-->
<update id="updateUserInfo" parameterType="com.hld.dispatch.bean.BaseUser">
update
base_user
<trim prefix="set" suffixOverrides=",">
<if test="userName != null">
userName = #{userName,jdbcType=VARCHAR},
</if>
<if test="post != null">
post = #{post,jdbcType=VARCHAR},
</if>
<if test="officePhone != null">
officePhone = #{officePhone,jdbcType=VARCHAR},
</if>
<if test="mobilePhone != null">
mobilePhone = #{mobilePhone,jdbcType=VARCHAR},
</if>
<if test="unitId != null">
unitId = #{unitId,jdbcType=VARCHAR},
</if>
</trim>
WHERE id=#{id}
</update>
<!--删除用户-->
<delete id="deleteUserInfo">
delete from base_user where id in (${userIds})
</delete>
</mapper>
2、单元测试
1)测试数据操作(mysql执行是否成功)
这个功能采用了spring的test,需要使用RunWith(SpringJunit4ClassRunner.class),可以先写一个父测试,然后其他test继承这个父测试,就不用每个都写配置了
BaseTest
package com.hld.dispatch.test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/spring-mybatis.xml"})
public class BaseTest {
}
UserTest
package com.hld.dispatch.test;
import com.hld.dispatch.bean.BaseUser;
import com.hld.dispatch.dao.LoginDao;
import com.hld.dispatch.dao.UserManagementDao;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.Map;
public class UserTest extends BaseTest {
@Autowired
private UserManagementDao userManagementDao;
@Test
public void query1(){
List<Map<String, Object>> users = userManagementDao.getUserList(5,1,"8,9,10,11","");
for(Map<String, Object> user:users){
System.out.println(user);
}
}
@Test
public void query2(){
int count = userManagementDao.getUserCount(5,1,"8,9,10,11","");
System.out.println(count);
}
@Test
public void query3(){
BaseUser baseuser1=new BaseUser();
baseuser1.setUserName("李大佬");
baseuser1.setPost(2);
baseuser1.setMobilePhone("135167123456");
baseuser1.setOfficePhone("6623578");
baseuser1.setUnitId(10);
int count = userManagementDao.newUserInfo(baseuser1);
System.out.println(count);
}
@Test
public void query4(){
BaseUser baseuser2=new BaseUser();
baseuser2.setUserName("张小佬");
baseuser2.setPost(2);
baseuser2.setMobilePhone("135167123456");
baseuser2.setOfficePhone("6623578");
baseuser2.setUnitId(10);
baseuser2.setId(20910);
int count = userManagementDao.updateUserInfo(baseuser2);
System.out.println(count);
}
@Test
public void query5(){
int count = userManagementDao.deleteUserInfo("20910");
System.out.println(count);
}
}
2)通过postman测试请求
地址是根据后端的接口中RequestMapping写的,例如类上写@RequestMapping(value = "/userManagement"),方法上写@RequestMapping(value = "getUsers",method = RequestMethod.GET)那么实际的请求地址就是http://serverip//userManagement/getUsers。另外根据后端设置的传递请求的格式,如果是@RequestBody,说明用json格式传递数据,看测试样例如下图:
1·查询请求测试(接口是getUserList(Integer pageSize,Integer startPage,Integer unitQid,String userName))
2·更新请求测试(接口是public BaseResponse updateUserInfo(@RequestBody BaseUser params))
3·删除请求测试(接口是deleteUserInfo(@RequestBody List<String> list))