数据库说明
目前只有一张用户表,表中存储了用户注册、登录、修改手机号和用户名等信息,完整的SQL脚本位于mybatis-practices-practices模块的src/main/resources/schema/目录下,完整的内容如下所示,在运行程序之前需要先执行该脚本。
drop DATABASE if EXISTS mybatis;
create database if not EXISTS mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
use mybatis;
CREATE TABLE t_user
(
user_id BIGINT AUTO_INCREMENT
COMMENT '用户ID'
PRIMARY KEY,
user_name VARCHAR(64) NOT NULL
COMMENT '用户名',
mobile VARCHAR(64) NULL
COMMENT '手机号',
email VARCHAR(64) NULL
COMMENT '邮件',
password VARCHAR(64) NULL
COMMENT '密码:8-16位大小写字母+数字+特殊字符',
cardNumber VARCHAR(64) NULL
COMMENT '身份证号:15位或者18位整数',
register_ip VARCHAR(64) NULL
COMMENT '注册IP:例如192.168.1.97',
register_date DATETIME NULL
COMMENT '注册日期:例如2018-01-31',
register_resources VARCHAR(32) NULL
COMMENT '注册来源:H5,PC,Android,IOS
',
CONSTRAINT t_user_user_id_uindex
UNIQUE (user_id)
)
COMMENT '用户信息'
ENGINE = InnoDB;
mybatis-practices-pojo说明
该模块用于存放各种pojo对象,其中net.ittimeline.mybatis.practices.pojo.persist包用于存放DO(data object)对象,
net.ittimeline.mybatis.practices.pojo.dto用于存放DTO(Data Transfer Object)对象。
由于目前应用中只有一张t_user表,因此创建t_user表的DO和DTO即可。_
UserDO:对应于数据库t_user表
package net.ittimeline.mybatis.practices.pojo.persist;
import net.ittimeline.mybatis.practices.pojo.User;
/**
* User Data Object 对应数据库表 t_user
* @author tony [email protected]
* @date 2018-01-30-下午11:37
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public class UserDO extends User {
public UserDO(){}
public UserDO(String userName){
super(userName);
}
}
UserDTO:业务层传输对象
package net.ittimeline.mybatis.practices.pojo.dto;
import net.ittimeline.mybatis.practices.pojo.User;
/**封装User业务数据
* @author tony [email protected]
* @date 2018-02-24-下午1:22
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public class UserDTO extends User {
public UserDTO(){}
public UserDTO(String userName,String password){
super(userName,password);
}
}
User:封装了公共的成员变量
package net.ittimeline.mybatis.practices.pojo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.Serializable;
import java.util.Date;
/**
* @author tony [email protected]
* @date 2018-02-24-下午2:09
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public class User implements Serializable{
/**
* 用户编号
*/
private Long userId;
/**用户登录:支持用户名/手机号/邮箱登录*/
/**
* 用户名
*/
private String userName;
/**
* 手机号
*/
private String mobile;
/**
* 邮箱
*/
private String email;
/**
* 密码
*/
private String password;
/**
* 身份证照
*/
private String cardNumber;
/*****************注册信息************/
/**
* 注册IP
*/
private String registerIp;
/**
* 注册来源 PC/H5/Android/IOS
*/
private String registerResource;
/**
* 注册日期
*/
private Date registerDate;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getRegisterIp() {
return registerIp;
}
public void setRegisterIp(String registerIp) {
this.registerIp = registerIp;
}
public String getRegisterResource() {
return registerResource;
}
public void setRegisterResource(String registerResource) {
this.registerResource = registerResource;
}
public Date getRegisterDate() {
return registerDate;
}
public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
}
public User(){}
public User(String userName){
this.userName=userName;
}
public User(String userName,String password){
this(userName);
this.password=password;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("userId", userId)
.append("userName", userName)
.append("mobile", mobile)
.append("email", email)
.append("password", password)
.append("cardNumber", cardNumber)
.append("registerIp", registerIp)
.append("registerResource", registerResource)
.append("registerDate", registerDate)
.toString();
}
}
UserDOMapper接口方法声明
package net.ittimeline.mybatis.practices.spring5.integration.mapper;
import net.ittimeline.mybatis.practices.pojo.persist.UserDO;
/**
* @author tony [email protected]
* @date 2018-02-24-下午1:12
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public interface UserDOMapper {
/**
* 新增用户
* @param user
* @return
*/
public int insert(UserDO user);
/**
* 修改用户信息
* @param userDO
* @return
*/
public int update(UserDO userDO);
/**
* 根据用户信息(例如id,用户名和密码)获取单个用户
* @param userDO
* @return
*/
public UserDO find(UserDO userDO);
/**
* 统计注册用户数量
* @return
*/
public Long countTotalUser();
}
UserDOMapper.xml
主要包含了针对t_user表的增加、修改和查询操作。
<?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="net.ittimeline.mybatis.practices.spring5.integration.mapper.UserDOMapper">
<!-- 新增用户-->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into t_user(user_name, mobile, email, password, cardNumber, register_ip, register_date, register_resources)
VALUE (#{userName},#{mobile},#{email},#{password},#{cardNumber},#{registerIp},#{registerDate},#{registerResource})
</insert>
<!-- 按照条件查找单个用户-->
<select id="find" parameterType="UserDO" resultType="UserDO">
select user_id as userId ,user_name as userName, mobile, email, password, cardNumber as cardNumber, register_ip as registerIp, register_date as registerDate, register_resources as registerResources from t_user
<where>
<if test="userId != null and userId !=''">
and user_id=#{userId}
</if>
<if test="userName!=null and userName!=''">
and user_name=#{userName}
</if>
<if test="password!=null and password !=''">
and password=#{password}
</if>
<if test="mobile!=null and mobile !=''">
and mobile=#{mobile}
</if>
<if test="email!=null and mobile !=''">
and email=#{email}
</if>
</where>
</select>
<update id="update">
update t_user
<trim prefix="set" prefixOverrides=",">
<if test="password !=null and password !=''">
password=#{password},
</if>
<if test="mobile!=null and mobile !=''">
mobile=#{mobile}
</if>
</trim>
WHERE user_name=#{userName}
</update>
<select id="countTotalUser" resultType="java.lang.Long">
select count(*) from t_user
</select>
</mapper>
UserService接口方法声明
package net.ittimeline.mybatis.practices.spring5.integration.service;
import net.ittimeline.mybatis.practices.pojo.dto.UserDTO;
/**
* 用户模块业务逻辑
* 目前只包括登录、注册和修改密码,统计用户数量四个常用的功能
* @author tony [email protected]
* @date 2018-02-24-下午1:21
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public interface UserService {
/**
* 用户登录
* @param userDTO
* @return
*/
UserDTO login(UserDTO userDTO);
/**
* 用户注册
* @param userDTO
* @return
*/
boolean register(UserDTO userDTO);
/**
* 用户修改信息 例如密码手机号 用户名等等
* @param userDTO
* @return
*/
boolean updateUserInfo(UserDTO userDTO);
/**
* 检查用户是否存在 作为修改用户信息的依据
* @param userDTO
* @return
*/
boolean exists(UserDTO userDTO);
/**
* 统计注册用户的数量
* @return
*/
long countTotalUser();
}
UserServiceImpl实现类
该类实现了UserService接口的所有方法,通过调用UserMapper接口访问数据库
package net.ittimeline.mybatis.practices.spring5.integration.service;
import cn.hutool.core.bean.BeanUtil;
import net.ittimeline.mybatis.practices.pojo.dto.UserDTO;
import net.ittimeline.mybatis.practices.pojo.persist.UserDO;
import net.ittimeline.mybatis.practices.spring5.integration.mapper.UserDOMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author tony [email protected]
* @date 2018-02-24-下午1:51
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDOMapper userDOMapper;
@Override
public UserDTO login(UserDTO userDTO) {
UserDO condition =new UserDO();
condition.setUserName(userDTO.getUserName());
condition.setPassword(userDTO.getPassword());
UserDO userDO= userDOMapper.find(condition);
UserDTO result=new UserDTO();
BeanUtils.copyProperties(userDO,result);
return result;
}
@Override
public boolean register(UserDTO userDTO) {
boolean registerResultFlag =false;
UserDO userDO=new UserDO();
BeanUtils.copyProperties(userDTO,userDO);
int count= userDOMapper.insert(userDO);
if(count>0){
registerResultFlag=true;
}
return registerResultFlag;
}
@Override
public boolean updateUserInfo(UserDTO userDTO) {
boolean updateMobileFlag=false;
UserDO userDO=new UserDO();
BeanUtil.copyProperties(userDTO,userDO);
int count= userDOMapper.update(userDO);
if(count>0){
updateMobileFlag=true;
}
return updateMobileFlag;
}
@Override
public boolean exists(UserDTO userDTO) {
UserDO userDO=new UserDO(userDTO.getUserName());
UserDO findResult =userDOMapper.find(userDO);
if(findResult!=null){
return true;
}
return false;
}
@Override
public long countTotalUser() {
return userDOMapper.countTotalUser();
}
}
Service接口及其实现类的管理方案
在企业项目开发中,通常会有几十个甚至上百个Service接口及其实现,而在Controller层调用Service层的Service层接口时,通常都是采用如下所示的形式调用。
@Autowired
private UserService userService;
而这里声明一个ServiceFactory及其实现类ServiceFactoryImpl,用来管理项目当中所有的Service接口及其实现,如下所示
扫描二维码关注公众号,回复:
405087 查看本文章
ServiceFactory
package net.ittimeline.mybatis.practices.spring5.integration.service;
/**
* @author tony [email protected]
* @date 2018-02-26-下午5:37
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public interface ServiceFactory {
UserService getUserService();
}
ServiceFactoryImpl
package net.ittimeline.mybatis.practices.spring5.integration.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author tony [email protected]
* @date 2018-02-26-下午5:37
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
@Service
public class ServiceFactoryImpl implements ServiceFactory {
@Autowired
private UserService userService;
@Override
public UserService getUserService() {
return userService;
}
}
当要调用UserService时只需要通过注入serviceFactory,然后调用其getUserService()方法即可。
基于JavaConfig实现Spring5集成Junit4
package net.ittimeline.mybatis.practices.spring5.integration;
import net.ittimeline.mybatis.practices.spring5.integration.service.ServiceFactory;
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;
import org.springframework.transaction.annotation.Transactional;
import net.ittimeline.mybatis.practices.spring5.integration.configuration.ApplicationConfiguartion;
/**
* Spring5集成Junit
* @author tony [email protected]
* @date 2018-02-24-下午2:59
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
//指定测试类的运行者
@RunWith(SpringJUnit4ClassRunner.class)
//指定spring配置类
@ContextConfiguration(classes = {ApplicationConfiguartion.class})
//事务配置
@Transactional
public abstract class BaseSpring5Junit4Test {
@Autowired
protected ServiceFactory serviceFactory;
}
UserService测试案例
package net.ittimeline.mybatis.practices.spring5.integration;
import net.ittimeline.mybatis.practices.pojo.dto.UserDTO;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import java.util.Date;
/**
* @author tony [email protected]
* @date 2018-02-24-下午3:24
* @website wwww.ittimeline.net
* @see
* @since JDK8u162
*/
public class UserServiceTest extends BaseSpring5Junit4Test {
private static final Logger LOGGER= LogManager.getLogger();
@Test
public void testRegister(){
UserDTO userDTO=new UserDTO();
userDTO.setUserName("tony");
userDTO.setPassword("666666");
userDTO.setMobile("186xxxxxxxx");
userDTO.setCardNumber("42102319xxxxxxxxxx");
userDTO.setEmail("[email protected]");
userDTO.setRegisterDate(new Date());
userDTO.setRegisterIp("127.0.0.1");
userDTO.setRegisterResource("Android客户端");
boolean registerResult=serviceFactory.getUserService().register(userDTO);
if(registerResult){
LOGGER.info("注册成功,注册的来源是"+userDTO.getRegisterResource());
}
else{
LOGGER.error("注册失败");
}
}
@Test
public void testUpdatePassword(){
UserDTO userDTO=new UserDTO();
userDTO.setUserName("tony");
userDTO.setPassword("88888888");
userDTO.setMobile("188********");
boolean existsFlag =serviceFactory.getUserService().exists(userDTO);
if(existsFlag){
boolean updateResult =serviceFactory.getUserService().updateUserInfo(userDTO);
if(updateResult){
LOGGER.info("修改密码成功,新密码是"+userDTO.getPassword()+"新手机号是"+userDTO.getMobile());
}
else{
LOGGER.error("修改密码失败");
}
}
}
@Test
public void testLogin(){
UserDTO userDTO=new UserDTO("tony","88888888");
UserDTO loginResult =serviceFactory.getUserService().login(userDTO);
LOGGER.info(loginResult);
}
@Test
public void testCountTotalUser(){
Long totalUser=serviceFactory.getUserService().countTotalUser();
LOGGER.info("当前网站注册的人数是"+totalUser);
}
}