天天看點

Java單體應用 - 常用架構 - 08.MyBatis - MyBatis 對象關系映射MyBatis 對象關系映射

原文位址: http://www.work100.net/training/monolithic-frameworks-mybatis-orm.html 更多教程: 光束雲 - 免費課程

MyBatis 對象關系映射

請參照如上

章節導航

進行閱讀

1.POM

修改項目

iot-cloud-dependencies

下的

pom.xml

檔案,增加單元測試相關依賴,配置如下:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>           

同時在

iot-cloud-web-admin

項目的

pom.xml

檔案中引入依賴:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
</dependency>           

2.建構資料庫結構

我們在

Spring 整合 Druid

章節已經建立了資料庫,使用了如下屬性:

屬性 說明
Database Name training-iot-cloud
Character Set utf8mb4
Collation utf8mb4_general_ci

utf8 和 utf8md4 字元集

  • utf8

一個字元集存

3

個位元組,可存儲多國語言的資料。

  • utf8mb4

utf8

字元集的擴充,一個字元集存

4

個位元組,可以存放

emoji

表情包。

導入 SQL

群共享中已經為大家準備好了練習用的 SQL,位置: SQL腳本/training-iot-cloud.zip,有需要的同學可以加群擷取:

Java單體應用 - 常用架構 - 08.MyBatis - MyBatis 對象關系映射MyBatis 對象關系映射

3.定義實體類

iot-cloud-domain

項目下建立實體類

auth_manager

表為例,實體類代碼如下:

package net.work100.training.stage2.iot.cloud.domain;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>Title: AuthManager</p>
 * <p>Description: 管理者賬戶表</p>
 * <p>Url: http://www.work100.net/training/monolithic-frameworks-mybatis.html</p>
 *
 * @author liuxiaojun
 * @date 2020-02-23 22:42
 * ------------------- History -------------------
 * <date>      <author>       <desc>
 * 2020-02-23   liuxiaojun     初始建立
 * -----------------------------------------------
 */
public class AuthManager implements Serializable {

    private Long id;
    private String userKey;
    private String userName;
    private String password;
    /**
     * 狀态:0=inactive, 1=active, 2=locked, 3=deleted
     */
    private int status;
    private boolean superuser;
    /**
     * 角色:admin, editor
     */
    private String roles;
    private Date modifyPasswordTime;
    private Date created;
    private Date updated;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserKey() {
        return userKey;
    }

    public void setUserKey(String userKey) {
        this.userKey = userKey;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public boolean isSuperuser() {
        return superuser;
    }

    public void setSuperuser(boolean superuser) {
        this.superuser = superuser;
    }

    public String getRoles() {
        return roles;
    }

    public void setRoles(String roles) {
        this.roles = roles;
    }

    public Date getModifyPasswordTime() {
        return modifyPasswordTime;
    }

    public void setModifyPasswordTime(Date modifyPasswordTime) {
        this.modifyPasswordTime = modifyPasswordTime;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }

    @Override
    public String toString() {
        return "AuthManager{" +
                "id=" + id +
                ", userKey='" + userKey + '\'' +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", status=" + status +
                ", superuser=" + superuser +
                ", roles='" + roles + '\'' +
                ", modifyPasswordTime=" + modifyPasswordTime +
                ", created=" + created +
                ", updated=" + updated +
                '}';
    }
}           

4.定義資料通路接口

iot-cloud-web-admin

項目定義一個 DAO 接口

AuthManagerDao

,代碼如下:

package net.work100.training.stage2.iot.cloud.web.admin.dao;

import net.work100.training.stage2.iot.cloud.domain.AuthManager;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * <p>Title: AuthManagerDao</p>
 * <p>Description: </p>
 * <p>Url: http://www.work100.net/training/monolithic-frameworks-mybatis.html</p>
 *
 * @author liuxiaojun
 * @date 2020-02-23 22:54
 * ------------------- History -------------------
 * <date>      <author>       <desc>
 * 2020-02-23   liuxiaojun     初始建立
 * -----------------------------------------------
 */
@Repository
public interface AuthManagerDao {

    /**
     * 查詢所有
     *
     * @return
     */
    List<AuthManager> selectAll();
}           
注意:Spring 內建 MyBatis 後,不需要手動實作 DAO 層的接口,所有的 SQL 執行語句都寫在對應的關系映射配置檔案中。

5.定義業務邏輯接口

iot-cloud-web-admin

項目定義一個 Service 接口

AuthManagerService

package net.work100.training.stage2.iot.cloud.web.admin.service;

import net.work100.training.stage2.iot.cloud.domain.AuthManager;

import java.util.List;

/**
 * <p>Title: AuthManagerService</p>
 * <p>Description: </p>
 * <p>Url: http://www.work100.net/training/monolithic-frameworks-mybatis.html</p>
 *
 * @author liuxiaojun
 * @date 2020-02-23 23:01
 * ------------------- History -------------------
 * <date>      <author>       <desc>
 * 2020-02-23   liuxiaojun     初始建立
 * -----------------------------------------------
 */
public interface AuthManagerService {
    /**
     * 查詢全部表記錄
     *
     * @return
     */
    List<AuthManager> selectAll();
}           

6.實作業務邏輯接口

實作

AuthManagerService

接口,建立實作類

AuthManagerServiceImpl

package net.work100.training.stage2.iot.cloud.web.admin.service.impl;

import net.work100.training.stage2.iot.cloud.domain.AuthManager;
import net.work100.training.stage2.iot.cloud.web.admin.dao.AuthManagerDao;
import net.work100.training.stage2.iot.cloud.web.admin.service.AuthManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>Title: AuthManagerServiceImpl</p>
 * <p>Description: </p>
 * <p>Url: http://www.work100.net/training/monolithic-frameworks-mybatis.html</p>
 *
 * @author liuxiaojun
 * @date 2020-02-23 23:06
 * ------------------- History -------------------
 * <date>      <author>       <desc>
 * 2020-02-23   liuxiaojun     初始建立
 * -----------------------------------------------
 */
@Service
public class AuthManagerServiceImpl implements AuthManagerService {

    @Autowired
    private AuthManagerDao authManagerDao;

    @Override
    public List<AuthManager> selectAll() {
        return authManagerDao.selectAll();
    }
}           

7.定義映射檔案

映射檔案,簡稱為

Mapper

,主要完成

DAO

層中

SQL

語句的映射。

映射檔案名随意,一般放在

src/resources/mapper

檔案夾中,這裡映射檔案名稱定為

AuthManagerMapper.xml

<?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.work100.training.stage2.iot.cloud.web.admin.dao.AuthManagerDao">
    <select id="selectAll" resultType="AuthManager">
        SELECT
          a.id,
          a.user_key,
          a.user_name,
          a.password,
          a.status,
          a.superuser,
          a.roles,
          a.modify_password_time,
          a.created,
          a.updated
        FROM
          auth_manager AS a
    </select>
</mapper>           

8.建立單元測試

所有工作準備就緒,我們就可以測試 MyBatis 是否能夠正常執行了。

iot-cloud-web-admin

項目下,建立

src/test/java

的單元測試源碼目錄,然後建立類包:

net.work100.training.stage2.iot.cloud.web.admin.service.test

在包下建立一個單元測試類

AuthManagerServiceTest

package net.work100.training.stage2.iot.cloud.web.admin.service.test;

import net.work100.training.stage2.iot.cloud.domain.AuthManager;
import net.work100.training.stage2.iot.cloud.web.admin.dao.AuthManagerDao;
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;

import java.util.List;

/**
 * <p>Title: AuthManagerServiceTest</p>
 * <p>Description: </p>
 * <p>Url: http://www.work100.net/training/monolithic-frameworks-mybatis.html</p>
 *
 * @author liuxiaojun
 * @date 2020-02-23 23:23
 * ------------------- History -------------------
 * <date>      <author>       <desc>
 * 2020-02-23   liuxiaojun     初始建立
 * -----------------------------------------------
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context.xml", "classpath:spring-context-druid.xml", "classpath:spring-context-mybatis.xml"})
public class AuthManagerServiceTest {
    
    @Autowired
    private AuthManagerService authManagerService;

    @Test
    public void testSelectAll() {
        List<AuthManager> authManagers = authManagerService.selectAll();
        for (AuthManager authManager : authManagers) {
            System.out.println("------------------------------------------------");
            System.out.println(authManager.toString());
        }
    }
}           

成功執行測試後,控制台輸出如下:

2020-02-24 11:23:53,691 INFO [org.springframework.test.context.support.DefaultTestContextBootstrapper] - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]
2020-02-24 11:23:53,709 INFO [org.springframework.test.context.support.DefaultTestContextBootstrapper] - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@6321e813, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@79be0360, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@22a67b4, org.springframework.test.context.support.DirtiesContextTestExecutionListener@57855c9a, org.springframework.test.context.transaction.TransactionalTestExecutionListener@3b084709, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@3224f60b, org.springframework.test.context.event.EventPublishingTestExecutionListener@63e2203c]Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2020-02-24 11:23:54,865 INFO [com.alibaba.druid.pool.DruidDataSource] - {dataSource-1} inited
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29a0cdb] was not registered for synchronization because synchronization is not active
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@34f22f9d] will not be managed by Spring
==>  Preparing: SELECT a.id, a.user_key, a.user_name, a.password, a.status, a.superuser, a.roles, a.modify_password_time, a.created, a.updated FROM auth_manager AS a 
==> Parameters: 
<==    Columns: id, user_key, user_name, password, status, superuser, roles, modify_password_time, created, updated
<==        Row: 1, 8c41b9a54b2e2a4180cc1271b4672779, xiaojun.liu, md5#M564Kc#1af71f605fc20d8784761409a68f1e8a, 1, 1, admin,editor, null, 2019-07-01 00:00:00, 2019-07-01 00:00:00
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29a0cdb]
------------------------------------------------
AuthManager{id=1, userKey='8c41b9a54b2e2a4180cc1271b4672779', userName='xiaojun.liu', password='md5#M564Kc#1af71f605fc20d8784761409a68f1e8a', status=1, superuser=true, roles='admin,editor', modifyPasswordTime=null, created=Mon Jul 01 08:00:00 CST 2019, updated=Mon Jul 01 08:00:00 CST 2019}
2020-02-24 11:23:55,255 INFO [com.alibaba.druid.pool.DruidDataSource] - {dataSource-1} closing ...
2020-02-24 11:23:55,267 INFO [com.alibaba.druid.pool.DruidDataSource] - {dataSource-1} closed           

9.執行個體源碼

執行個體源碼已經托管到如下位址:

上一篇:

Spring 整合 MyBatis

下一篇:

知識點:資料加密與密碼
如果對課程内容感興趣,可以掃碼關注我們的

公衆号

QQ群

,及時關注我們的課程更新
Java單體應用 - 常用架構 - 08.MyBatis - MyBatis 對象關系映射MyBatis 對象關系映射
Java單體應用 - 常用架構 - 08.MyBatis - MyBatis 對象關系映射MyBatis 對象關系映射