基于JavaConfig实现Spring5集成MyBatis3(下)

数据库说明

目前只有一张用户表,表中存储了用户注册、登录、修改手机号和用户名等信息,完整的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);
    }
}

项目地址:https://github.com/ittimeline/mybatis-practices

猜你喜欢

转载自blog.csdn.net/ittechnologyhome/article/details/79385681