Mybaties 使用mapper方式實現

之前寫過一篇mybaties以xml方式實現,隨着對mybaties的理解,覺得xml方式不方便,寫了mysql還得再實現一種方法,代碼讀起來也比較費時。最近走通了以mapper的方式實現,特別像 springboot中使用mybaties,代碼結構更佳,寫此貼讓我們遠離JDBC編程,走上快樂開發路途。

先看看目錄樹,其中有些無關的代碼在帖子中不在貼出。目錄結構遵循 springboot結構,dao.mapper主要是映射數據庫的操作接口,domain存放實體類,resources放配置文件和sql操作文件

1. 數據庫信息 db.properties,類似如下

mysql.driver = com.mysql.jdbc.Driver
#mysql.url = jdbc:mysql://xxx:3306/cloud_style?characterEncoding=utf-8&useAffectedRows=true
#mysql.username = xx
#mysql.password = xxxx

2. mybaties.xml爲 mybaties的配置文件,這裏面配置 database信息和sql操作xml, 如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
        <!-- 加載數據庫屬性文件 -->
        <properties resource="db.properties"/>

        <!-- 可設置多個連接環境信息 -->
        <environments default="mysql_developer">
            <!-- 連接環境信息,取一個任意唯一的名字 -->
            <environment id="mysql_developer">
                <!-- mybatis使用jdbc事務管理方式 -->
                <transactionManager type="jdbc"/>
                <!-- mybatis使用連接池方式來獲取連接 -->
                <dataSource type="pooled">
                    <!-- 配置與數據庫鏈接信息 -->
                    <property name="driver" value="${mysql.driver}"/>
                    <property name="url" value="${mysql.url}"/>
                    <property name="username" value="${mysql.username}"/>
                    <property name="password" value="${mysql.password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--映射sql操作的文件 -->
            <mapper resource="sql.xml"/>
        </mappers>

</configuration>

3. sql.xml 這裏面寫sql語句,其中操作結果是實體類的,可以直接指定 resultMap屬性,這種映射更自由,數據庫中某表字段不需要全取時,就需要resultMap自定義映射規則。一般類型可指定 resultType即可,這兩個屬性注意使用方式。需要注意的是指定mapper的namespace空間類似如下文件,這裏麪包含了實體類映射,基本類映射,單參數,多參數,動態表名等操作,可自行學習修改。

<?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="dao.mapper.WarehouseMapper">

  <resultMap type="domain.LogMetaBean" id="logMetaMap">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="clusterId" column="clusterId"/>
    <result property="path" column="path"/>
    <result property="timeFormat" column="timeFormat"/>
    <result property="storeTime" column="storeTime"/>
    <result property="block" column="block"/>
    <result property="frequency" column="frequency"/>
    <result property="delay" column="delay"/>
    <result property="cronTime" column="cronTime"/>
    <result property="commandId" column="commandId"/>
    <result property="type" column="type"/>
    <result property="state" column="state"/>
    <result property="priority" column="priority"/>
    <result property="warehouseId" column="warehouseId"/>
    <result property="dbName" column="dbName"/>
    <result property="tableName" column="tableName"/>
    <result property="description" column="description"/>
    <result property="createTime" column="createTime"/>
    <result property="updateTime" column="updateTime"/>
  </resultMap>

  <resultMap type="domain.LogDetailBean" id="logDetailMap">
    <result property="fileNum" column="fileNum"/>
    <result property="size" column="size"/>
    <result property="jobId" column="jobId"/>
  </resultMap>

  <resultMap type="domain.DagJobsBean" id="dagJobsMap">
    <result property="diagnosis" column="diagnosis"/>
    <result property="clusterName" column="clusterName"/>
  </resultMap>

  <!--<select id="selectFromLogMeta" parameterType="int" resultType="domain.LogMetaBean"></select>-->
  <select id="selectFromLogMeta" parameterType="int" resultMap="logMetaMap">
        SELECT *  FROM dm_log_meta WHERE id=#{id};
  </select>

  <select id="selectDistinctIdFromLogMeta" resultType="java.lang.Integer">
        SELECT DISTINCT id  FROM dm_log_meta;
  </select>

  <select id="selectParents" parameterType="int" resultType="java.lang.Integer">
        SELECT DISTINCT srcLogId  FROM dm_log_dependency WHERE logId=#{logId};
  </select>

  <select id="selectChildren" parameterType="int" resultType="java.lang.Integer">
        SELECT DISTINCT logId FROM dm_log_dependency WHERE srcLogId=#{srcLogId};
  </select>

  <select id="selectLogDetailByLogId"  resultMap="logDetailMap">
        SELECT fileNum, `size`, jobId FROM dm_log_details WHERE logId=#{logId} AND `time` LIKE #{timeFuzzyMatch};
  </select>

  <select id="selectDiagnosisAndClusterFromDagJobs" parameterType="int" resultMap="dagJobsMap">
        SELECT diagnosis, clusterName FROM dag_jobs WHERE id=#{id};
  </select>

  <select id="selectCostFromJobinfo" resultType="java.lang.Float">
        SELECT cost FROM ${tableName} WHERE jobId=#{jobId};
  </select>

</mapper>

4. 寫mapper映射接口,不需要實現。實體類具體就不貼代碼了,自己根據自己需要創建。多參數需要使用Param註解,參數名字和sql.xml中一致

package dao.mapper;

import domain.DagJobsBean;
import domain.LogDetailBean;
import domain.LogMetaBean;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface WarehouseMapper {
  List<Integer> selectDistinctIdFromLogMeta();

  List<Integer> selectParents(int srcLogId);

  List<Integer> selectChildren(int logId);

  LogMetaBean selectFromLogMeta(int id);

  List<LogDetailBean> selectLogDetailByLogId(@Param("logId") int logId, @Param("timeFuzzyMatch") String timeFuzzyMatch);

  DagJobsBean selectDiagnosisAndClusterFromDagJobs(int id);

  float selectCostFromJobinfo(@Param("tableName") String tableName, @Param("jobId") String jobId);
}

5.建立 sqlsession 工廠,能夠獲取mapper對象 如下:

import dao.mapper.WarehouseMapper;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

class SessionFactory {

  public static WarehouseMapper getWarehouseMapper() throws IOException {
    String resource = "mybatis.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    return session.getMapper(WarehouseMapper.class);
  }
}

6. 在需要的地方取 mapper即可操作

import dao.mapper.WarehouseMapper;
import domain.LogMetaBean;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

public class WarehouseMain {

  private static WarehouseMapper mapper;
  

  private static void init() throws IOException {
    mapper = SessionFactory.getWarehouseMapper();
  }

  public static void main(String[] args) throws IOException {
    init();
    WarehouseCost warehouseCost = new WarehouseCost(mapper, price);
    List<Integer> warehouseIdList = mapper.selectDistinctIdFromLogMeta();
   
    for (HashMap.Entry<Integer, LogMetaBean> entry : warehouseIdList.entrySet()) {
      System.out.println(entry.getKey() + "   " + entry.getValue());
    }
  }
}


 

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