搭建Spring + MyBatis框架,實現數據層用戶管理

環境信息

macOS 10.15.3
java version “1.8.0_241”
IntelliJ IDEA 2019.3.4 (Ultimate Edition)
Gradle 5.2.1

新建一個Gradle項目

選擇Java(1.8) Web

在這裏插入圖片描述
在這裏插入圖片描述

給項目添加依賴

在這裏插入圖片描述

參考代碼:

plugins {
    id ‘java’
    id ‘war’
    id ‘org.gretty’ version ‘2.2.0’
}

group ‘org.example’
version ‘1.0-SNAPSHOT’

sourceCompatibility = 1.8

repositories {
//    mavenCentral() //註釋掉官方鏡像,用下面的aliyun鏡像
    maven{ url'http://maven.aliyun.com/nexus/content/groups/public/' }
    maven{ url'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}

dependencies {
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.2.4.RELEASE'
    compile group: 'org.springframework', name: 'spring-context', version: '5.2.4.RELEASE'
    compile group: 'org.springframework', name: 'spring-tx', version: '5.2.4.RELEASE'
    compile group: 'org.springframework', name: 'spring-jdbc', version: '5.2.4.RELEASE'
    compile group: 'org.mybatis', name: 'mybatis', version: '3.5.4'
    compile group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.4'
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.36'
    compile group: 'commons-dbcp', name: 'commons-dbcp', version: '1.4'
    compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.10'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.10'
    compile group: 'org.codehaus.jackson', name: 'jackson-core-asl', version: '1.8.8'
    compile group: 'org.codehaus.jackson', name: 'jackson-mapper-asl', version: '1.8.8'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.5'
    compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.5'
    compile group: 'ch.qos.logback', name: 'logback-core', version: '1.1.2'
    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.2'
    compile group: 'org.slf4j', name: 'log4j-over-slf4j', version: '1.7.13'
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile group: 'org.springframework', name: 'spring-test', version: '5.2.4.RELEASE'
}

新建Spring配置文件spring-mybatis.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:p=“http://www.springframework.org/schema/p"
       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-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!-- 自動掃描 -->
    <context:component-scan base-package="com.mp" />

    <!-- 引入配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 初始化連接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 連接池最大數量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 連接池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 連接池最小空閒 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 獲取連接最大等待時間 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:mapping/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring會自動查找其下的類 >
    <bean class=“org.mybatis.spring.mapper.MapperScannerConfigurer”>
        <property name="basePackage" value="com.mp.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

</beans>

新建JDBC配置文件jdbc.properties

在這裏插入圖片描述
在這裏插入圖片描述

參考代碼:

driver=com.mysql.jdbc.Driver 
url=jdbc:mysql://localhost:3306/IOT?useUnicode=true&&characterEncoding=UTF-8 
username=root 
password=314159 
#定義初始連接數 
initialSize=0 
#定義最大連接數 
maxActive=20 
#定義最大空閒 
maxIdle=20 
#定義最小空閒 
minIdle=1 
#定義最長等待時間 
maxWait=60000

數據庫建表語句:

drop table if exists user;
/*==============================================================*/
/* Table: user                                                  */
/*==============================================================*/
CREATE TABLE `user` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用戶ID作爲主鍵',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用戶名',
  `user_pwd` varchar(100) DEFAULT NULL COMMENT '用戶密碼',
  `user_phone` varchar(255) DEFAULT NULL COMMENT '用戶手機號',
  `user_addr` varchar(200) DEFAULT NULL COMMENT '用戶地址',
  `user_gender` int(1) DEFAULT NULL COMMENT '用戶性別,1表示男性,2表示女性',
  `user_birth` date DEFAULT NULL COMMENT '用戶出生日期',
  `user_email` varchar(100) DEFAULT NULL COMMENT '用戶郵箱',
  `user_status` int(1) DEFAULT NULL COMMENT '用戶賬號狀態,1表示在線,2表示離線,3表示賬號異常',
  `user_reg_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '用戶註冊時間',
  `user_login_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT'用戶最後一次登錄時間',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶及其相關信息'

Navicat 運行建表語句:

在這裏插入圖片描述

新建模型文件包並生成用戶實體類UserDO.java

在這裏插入圖片描述在這裏插入圖片描述

參考代碼:

package com.mp.model;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;

public class UserDO {

    private Long userID;

    private String userName;

    private String userPhone;

    private String userPwd;

    private String userAddr;

    private int userGender;

    private Date userBirth;

    private String userEmail;

    private int userStatus;

    @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
    private Date userRegTime;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date userLoginTime;

    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 getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }

    public String getUserPhone() {
        return userPhone;
    }

    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }

    public String getUserAddr() {
        return userAddr;
    }

    public void setUserAddr(String userAddr) {
        this.userAddr = userAddr;
    }

    public int getUserGender() {
        return userGender;
    }

    public void setUserGender(int userGender) {
        this.userGender = userGender;
    }

    public Date getUserBirth() {
        return userBirth;
    }

    public void setUserBirth(Date userBirth) {
        this.userBirth = userBirth;
    }

    public String getUserEmail() {
        return userEmail;
    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }

    public int getUserStatus() {
        return userStatus;
    }

    public void setUserStatus(int userStatus) {
        this.userStatus = userStatus;
    }

    public Date getUserRegTime() {
        return userRegTime;
    }

    public void setUserRegTime(Date userRegTime) {
        this.userRegTime = userRegTime;
    }

    public Date getUserLoginTime() {
        return userLoginTime;
    }

    public void setUserLoginTime(Date userLoginTime) {
        this.userLoginTime = userLoginTime;
    }
}

新建接口文件包並生成用戶接口類UserDAO.java

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

參考代碼:

package com.mp.dao;

import com.mp.model.UserDO;

public interface UserDAO {
    //之後可以添加數據庫操作
}

配置映射文件userDOMapper.xml

在resource文件夾下新建mapping映射文件夾

在這裏插入圖片描述
在這裏插入圖片描述

在mapping文件夾中生成映射文件userDOMapper.xml

在這裏插入圖片描述
在這裏插入圖片描述

參考代碼:

<?xml version=“1.0” encoding=“UTF-8”?>
<!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “mybatis-3-mapper.dtd”>
<mapper namespace="com.mp.dao.UserDAO" >

</mapper>

新建測試類UserDAOTest.java,用於測試我們寫的UserDAO有無bug

在test文件夾中新建com.mp.dao包

在這裏插入圖片描述在這裏插入圖片描述

新建UserDAOTest.java測試類

在這裏插入圖片描述
在這裏插入圖片描述

參考代碼

package com.mp.dao;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mp.model.UserDO;
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;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-mybatis.xml")
public class UserDAOTest {
    @Autowired
    private UserDAO userDAO;
    public static ObjectMapper objectMapper = new ObjectMapper();

    //可以插入測試代碼
    
}

數據庫CRUD操作在數據層上的實現

  • 增加(Create)
  • 讀取查詢(Retrieve)
  • 更新(Update)
  • 刪除(Delete)

增加(Create)

在UserDAO.java中添加

int insert(DeviceDO record);

在userDOMapper.xml中添加

<insert id=“insert” parameterType=“com.mp.model.UserDO” >
    insert into user (user_name, user_pwd, user_reg_time, user_login_time)
    values (#{userName,jdbcType=VARCHAR}, #{userPwd,jdbcType=VARCHAR},
    #{userRegTime,jdbcType=TIMESTAMP}, #{userLoginTime,jdbcType=TIMESTAMP})
</insert>

在UserDAOTset.java中添加

@Test
public void insert() {
    UserDO userDO = new UserDO();
    userDO.setUserName(“小李”);
    userDO.setUserPwd(123456);
    userDAO.insert(userDO);
}

運行測試腳本

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xLEa1lUO-1586141438509)(%E6%90%AD%E5%BB%BASpring%20+%20MyBatis%E6%A1%86%E6%9E%B6/2ECB2D81-CC4C-4135-AC75-A5DA78BBD0F3.png)]

插入成功

在這裏插入圖片描述

讀取查詢(Retrieve)

在UserDAO.java中添加

UserDO selectByPrimaryKey(Long id);

在userDOMapper.xml中添加

<resultMap id=“BaseResultMap” type=“com.mp.model.UserDO”>
    <id column=“id” property=“id” jdbcType=“BIGINT”/>
    <result column=“user_id” property=“userID” jdbcType=“BIGINT”/>
    <result column="user_name" property="userName" jdbcType="VARCHAR"/>
    <result column="user_pwd" property="userPwd" jdbcType="VARCHAR"/>
    <result column="user_addr" property="userAddr" jdbcType="VARCHAR"/>
    <result column="user_gender" property="userGender" jdbcType="VARCHAR"/>
    <result column="user_birth" property="userBirth" jdbcType="VARCHAR"/>
    <result column="user_email" property="userEmail" jdbcType="VARCHAR"/>
    <result column="user_status" property="userStatus" jdbcType="BIGINT"/>
    <result column="user_reg_time" property="userRegTime" jdbcType="TIMESTAMP"/>
    <result column="user_login_time" property="userLoginTime" jdbcType="TIMESTAMP"/>
</resultMap>


<sql id="Base_Column_List">
    user_id, user_name, user_reg_time, user_login_time
</sql>

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long">
    select
    <include refid="Base_Column_List"/>
    from user
    where user_id = #{user_id,jdbcType=BIGINT}
</select>

在UserDAOTset.java中添加

@Test
public void insert() {
    UserDO userDO = new UserDO();
    userDO.setUserName(“小李”);
    userDO.setUserPwd(123456);
    userDAO.insert(userDO);
}

運行測試腳本

在這裏插入圖片描述

查詢成功

在這裏插入圖片描述

更新(Update)

在UserDAO.java中添加

int updateByPrimaryKey(UserDO userDO);

在userDOMapper.xml中添加

<update id=“updateByPrimaryKey” parameterType=“com.mp.model.UserDO” >
    update user
    set user_name = #{userName,jdbcType=VARCHAR},
    user_phone = #{userPhone,jdbcType=VARCHAR}
    where user_id = #{userID,jdbcType=BIGINT}
</update>

在UserDAOTset.java中添加

@Test
public void updateByPrimaryKey(){
    UserDO userDO = userDAO.selectByPrimaryKey(1L); // 2L = (Long)2
    userDO.setUserName(“小王”);
    userDO.setUserPhone(17374131111);
    userDAO.updateByPrimaryKey(userDO);
}

運行測試腳本

在這裏插入圖片描述

更新成功

  • 原數據
    在這裏插入圖片描述

  • 新數據
    在這裏插入圖片描述

刪除(Delete)

在UserDAO.java中添加

int deleteByPrimaryKey(Long id);

在userDOMapper.xml中添加

<delete id=“deleteByPrimaryKey” parameterType=“java.lang.Long” >
    delete from user
    where user_id = #{userID,jdbcType=BIGINT}
</delete>

在UserDAOTset.java中添加

@Test
public void deleteByPrimaryKey(){
    userDAO.deleteByPrimaryKey(1L);
}

運行測試腳本

在這裏插入圖片描述

刪除成功

  • 記錄已經刪除在這裏插入圖片描述

分頁查詢

在UserDAO.java中添加

List<UserDO> pagingQuery(Long page);

在userDOMapper.xml中添加

<select id=“pagingQuery” resultMap=“BaseResultMap” parameterType=“java.lang.Long” >
    select
    <include refid=“Base_Column_List” />
    from user order by user_reg_time asc limit 5 offset #{page,jdbcType=BIGINT}
</select>

在UserDAOTset.java中添加

@Test
public void pagingQuery() throws JsonProcessingException {
    List<UserDO> list = userDAO.pagingQuery(0L);
	  //此處用了writerWithDefaultPrettyPrinter()是輸出結果更好看
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(list));
}

運行測試腳本

在這裏插入圖片描述

分頁查詢成功

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章