DB數據源之SpringBoot+MyBatis踏坑過程(二)手工配置數據源與載入Mapper.xml掃描

来源:https://www.cnblogs.com/liuyuhangCastle/archive/2018/09/06/9601835.html
-Advertisement-
Play Games

DB數據源之SpringBoot+MyBatis踏坑過程(二)手工配置數據源與載入Mapper.xml掃描 原創文章,版權所有,未經允許進位轉載 吐槽之後應該有所改了,該方式可以作為一種過渡方式來使用。 1.環境說明 初次使用springboot,時間有限,需要迅速搭建好架構,沒有時間研究 使用sp ...


DB數據源之SpringBoot+MyBatis踏坑過程(二)手工配置數據源與載入Mapper.xml掃描

原創文章,版權所有,未經允許進位轉載 

 

 

吐槽之後應該有所改了,該方式可以作為一種過渡方式來使用。

1.環境說明

  • 初次使用springboot,時間有限,需要迅速搭建好架構,沒有時間研究
  • 使用springboot過程中數據源無法獲取;
  • 使用springboot過程中註解莫名其妙失效;
  • 用springboot過程中因為版本不懂,不掃描application.properties;
  • 使用springboot過程中因為版本不懂,不掃描mybatis的mapper.xml包;
  • springboot或spring註解使用十分不習慣或者還沒有來得及深入學習的情況;

 

  假設有以上問題,又時間緊迫,建議使用本文手工配置方式!!

  springboot,parent 2.0.2.和1.5.3.都已經測試過,

  在java8和java7環境下測試過。前者配java8,後者配java7,

  使用MyEclipse 2017 C1 64x,MyEclipse 2016之前的版本無法使用java8

  pom.xml核心如下:

 

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
<!-- 添加MySQL依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 添加JDBC依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mybaits基礎依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.0</version>
        </dependency>
        <!-- mybatis插件依賴 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- mapper依賴 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>3.3.7</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

 

2.配置思路

 

  2.1.手工獲取application.properties文件中的屬性;

  2.2.創建數據源DataSource;

  2.3.註入數據源屬性;

  2.4.創建SqlSessionFactory;

  2.5.SqlSessionFactory配置DataSource;

  2.6.SqlSessionFactory配置掃描MyBatis-config.xml文件;

  2.7.SqlSessionFactory配置掃描Mapper.xml所在包;

  2.8.獲取session查詢資料庫進行測試;

 

3.所需類與結構

  3.0.application.properties文件與相應內容作為數據源;

  3.1.SysConfig類,用於獲取application.properties中的property;

  3.2.DataConfig類,用於獲取SqlSessionFactory;

  3.3.ExampleController類,用於測試;

  3.4.AppRun類,springboot的啟動入口,將DataConfig初始化;

  3.5.mapper.xml內容

 

4.代碼 

 

  4.0.application.properties部分內容段落:

  

1 master.url=jdbc:mysql://47.105.121.158:3306/master?characterEncoding=utf8
2 master.username=root
3 master.password=root
4 master.driver=com.mysql.jdbc.Driver
5 #master.driver-class-name=com.mysql.jdbc.Driver  一般是使用這個命名模式

  

  4.1.SysConfig類,代碼如下:

 

 1 package com.FM.config;
 2 
 3 import java.io.IOException;
 4 import java.util.Properties;
 5 
 6 import org.springframework.context.annotation.Configuration;
 7 import org.springframework.core.io.ClassPathResource;
 8 import org.springframework.core.io.Resource;
 9 import org.springframework.core.io.support.PropertiesLoaderUtils;
10 
11 /**
12  * 用於讀取properties的類,基礎配置文件名為application.properties,置於resources根目錄下
13  * @author Liuyuhang
14  */
15 public class SysConfig {
16 
17     private Properties properties;
18 
19     /**
20      * 修改無參構造,預設該類實例化的時候,載入配置文件中的內容,不做單例,因為配置文件可能更改
21      */
22     public SysConfig() {
23         try {
24             Resource resource = new ClassPathResource("/application.properties");
25             properties = PropertiesLoaderUtils.loadProperties(resource);
26         } catch (IOException e) {
27             e.printStackTrace();
28         }
29     }
30 
31     /**
32      * 獲取屬性,傳入參數key
33      */
34     public String getProperty(String key) {
35         return properties.getProperty(key);
36     }
37 }

 

  4.2.DataSourceConfig類,代碼如下:

 

 1 package com.FM.config;
 2 
 3 import java.util.HashMap;
 4 
 5 import javax.sql.DataSource;
 6 
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.mybatis.spring.SqlSessionFactoryBean;
 9 import org.springframework.boot.jdbc.DataSourceBuilder;
10 import org.springframework.core.io.DefaultResourceLoader;
11 import org.springframework.core.io.Resource;
12 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
13 /**
14  * DataConfig,獲取數據源,配置給SqlSessionFactory,並以此獲取session
15  * 
16  * @author liuyuhang
17  */
18 public class DataConfig {
19     /**
20      * 緩存factory的map,作為單例SessionFactory存儲
21      */
22     public static HashMap<String, SqlSessionFactory> factoryMap = new HashMap<String, SqlSessionFactory>();
23 
24     /**
25      * 構造器對緩存中的factory只實例化一次
26      * 不保證該單例能順利執行,若看出問題,自行更改
27      * @throws Exception
28      */
29     public DataConfig() {
30         System.out.println("out init sessionFactory:" + factoryMap);
31         if (factoryMap.isEmpty()) {
32             synchronized (factoryMap) {
33                 if (factoryMap.isEmpty()) {
34                     try {
35                         SqlSessionFactory sessionFactory = getSessionFactory();
36                         factoryMap.put("master", sessionFactory);
37                         System.out.println("in init sessionFactory:" + factoryMap);
38                     } catch (Exception e) {
39                         System.out.println("該錯誤比較嚴重,出現在數據源無參構造函數中!!");
40                         e.printStackTrace();
41                     }
42 
43                 }
44             }
45 
46         }
47 
48     }
49 
50     /**
51      * 手動獲取sessionFactory用例
52      * @param dataSourcePerfix
53      * @return
54      * @throws Exception
55      */
56     public SqlSessionFactory getSessionFactory() throws Exception {
57         SysConfig sc = new SysConfig();
58         String masterUrl = sc.getProperty("master.url");
59         String masterDriver = sc.getProperty("master.driver");
60         String masterUsername = sc.getProperty("master.username");
61         String masterPassword = sc.getProperty("master.password");
62         // 創建數據源
63         DataSourceBuilder create = DataSourceBuilder.create();
64         create.url(masterUrl);
65         create.driverClassName(masterDriver);
66         create.username(masterUsername);
67         create.password(masterPassword);
68         DataSource source = create.build();
69         // 創建sessionFactory
70         SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
71         factoryBean.setDataSource(source);// 載入數據源
72         // 掃描mapper.xml
73         Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/FM/mapper/*.xml");
74         factoryBean.setMapperLocations(resources);
75         // 讀取config
76         factoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-config.xml"));
77         SqlSessionFactory sessionFactory = factoryBean.getObject();
78         return sessionFactory;
79     }
80 
81 }

 

  4.3.ExampleController類,代碼如下:

 

 1  package com.FM.controller;
 2  
 3  import java.util.HashMap;
 4  import java.util.List;
 5  import java.util.Map;
 6  
 7  import javax.servlet.http.HttpServletRequest;
 8   
 9  import org.apache.ibatis.session.SqlSession;
10  import org.apache.ibatis.session.SqlSessionFactory;
11  import org.springframework.web.bind.annotation.RequestMapping;
12  import org.springframework.web.bind.annotation.RestController;
13  
14  import com.FM.config.DataConfig;
15  
16 /**
17  * Controler用於測試
18  * @author liuyuhang
19  */
20  @RestController //等同於responseBody + controller雙重註解
21  public class ExampleController {
22  
23      /**
24       * 手動創建session查詢資料庫用例,該方法可以創建多個sessionFactory,用多線程
25       * @param request
26       * @return
27       * @throws Exception
28       */
29      @RequestMapping("/helloMybatis")
30      public List helloMybatis(HttpServletRequest request) throws Exception {
31          //數據源配置無參構造器
32          DataConfig dc = new DataConfig();
33          SqlSessionFactory sessionFactory = dc.getSessionFactory();//獲取sessionfactory
34          SqlSession session = sessionFactory.openSession();//獲取session
35          List<Object> selectList = session.selectList("com.FM.mapper.MySqlMapper.getUser");
36          return selectList;//自動轉換為json
37      }
38 }

 

  4.4.AppRun類,代碼如下:

 

 1 package com.FM;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.SpringBootConfiguration;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 7 import org.springframework.boot.web.servlet.ServletComponentScan;
 8 
 9 import com.FM.config.DataConfig;
10 
11 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) // 禁用預設的單數據源配置
12 @SpringBootConfiguration // springboot基礎配置註解
13 @ServletComponentScan // springboot servlet filter
14 // @EnableConfigurationProperties//該註解於springboot1.5以上廢棄
15 public class AppRun {
16 
17     public static void main(String[] args) throws Exception {
18         SpringApplication.run(AppRun.class, args);
19         DataConfig dc = new DataConfig();//初始化配置
20         
21     }
22 }

 

  4.5.mapper.xml內容

 

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 3 <mapper namespace="com.FM.mapper.MySqlMapper">
 4 <!-- 隨便寫作為測試而已 -->
 5     <resultMap id="getUserMap" type="java.util.Map">
 6         <result column="id" property="id" jdbcType="INTEGER" javaType="int" />
 7         <result column="username" property="username" jdbcType="VARCHAR" javaType="String" /><
 8         <result column="password" property="password" jdbcType="VARCHAR" javaType="String" />
 9     </resultMap>
10     <select id="getUser" parameterType="java.util.Map" resultMap="getUserMap">
11         select * from user
12     </select>
13 </mapper>

 

 

5.測試

  啟動後控制台顯示如下:

  瀏覽器輸入    http://localhost:8080/helloMybatis

  控制台結果如下圖:

 

  頁面結果如下圖:

 

 

 

6.總結

  spring註解一直是我餓心結,當我想將我的代碼改成以註解方式來進行裝配註入的時候,總是不行的,

  於是乎我學會了很多奇葩的手段,可能不主流。

 

  吐槽歸吐槽,學習歸學習,工作歸工作,一碼是一碼!!!

  

  對於以上配置過程的springBoot的註解版,明日再更

 

休息!

以上!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 import java.util.Arrays; 2 3 public class ArrayOperator { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 ArrLis... ...
  • 我們都知道HashTable是線程安全的類,因為使用了Synchronized來鎖整張Hash表來實現線程安全,讓線程獨占; ConcurrentHashMap的鎖分離技術就是用多個鎖來控制對Hash表的不同部分進行修改,因為我可能只需要對一小塊部分進行操作,而如果鎖整張表開銷太大了,其內部實現就是 ...
  • 目錄 分隔符 字元類和類型 重覆 子表達式 子表達式計數 定位到字元串的開始或末尾 分支 匹配特殊字元 特殊字元含義 分隔符 正則表達式必須包含在一對分隔符中。可以選擇任何非字母,數字,"\" 或空格的字元作為分隔符。字元串的開始和結束必須有匹配的分隔符。 最常用的分隔符是"/"。 如匹配"shop ...
  • typeHandler作用: 1.傳參時將javaType類型轉換成jdbcType 2.結果集中ResultSet中取值時,jdbcType轉換為javaType; 系統自定義的typeHandler: mybatis系統內部定義了一系列的typeHandler;基本涵蓋了我們正常使用的類型轉換; ...
  • laravel的啟動需要通過路由、中間件、控制器、模型、視圖最後出現在瀏覽器。而路由、中間件、模型,這些功能都有自己的類,比如Route::any()、DB::table()、$this->middleware()等等,這些功能都是由一個叫IOC(服務容器)的對象來調配的。 它就像框架里的一個管家, ...
  • 昨天對springboot中的mybatis逆向工程與分頁應用進行了整理,今天對ssm項目中的逆向工程與分頁進行整理。 項目運行環境:eclipse+jdk1.8+maven+tomcat 搭建ssm項目 首先新建maven project,項目Archetype選擇:maven archetype ...
  • 對於職位管理,我們可以理解它為角色許可權的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的許可權以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好許可權的切換工作。 為了方便職位管理,我們可以將頁面設計成下麵這個樣子 左邊顯示部分列表,點擊其中一 ...
  • [異常描述] 方法1: 新建一個包,將預設包中的類文件拖入新建包中,刷新,預設包會消失 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...