2020-04-09---------Spring Boot——三種方式連接數(shù)據(jù)庫(kù)

使用數(shù)據(jù)庫(kù)是開(kāi)發(fā)應(yīng)用的基本基礎(chǔ)棺蛛,那么怔蚌,使用Spring Boot如何連接數(shù)據(jù)庫(kù)呢?

前提旁赊,需要知道如何建一個(gè)Spring Boot項(xiàng)目桦踊,可參照:http://www.reibang.com/p/d6e6c84cd190

作者:莫問(wèn)以

鏈接:http://www.reibang.com/p/414ef5b49a69

來(lái)源:簡(jiǎn)書(shū)

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)终畅,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處籍胯。

一竟闪、準(zhǔn)備工作:

1、建一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)杖狼,名為springboot_db炼蛤,在其下建一個(gè)表,名為t_author蝶涩,腳本如下:

CREATE DATABASE/*!32312 IF NOT EXISTS*/`springboot_db`/*!40100 DEFAULT CHARACTER SET utf8 */;USE`springboot_db`;DROP TABLE IF EXISTS`t_author`;CREATE TABLE`t_author`(`id`bigint(20)unsigned NOT NULL AUTO_INCREMENT COMMENT'用戶ID',`real_name`varchar(32)NOT NULL COMMENT'用戶名稱',`nick_name`varchar(32)NOT NULL COMMENT'用戶匿名',PRIMARY KEY(`id`))ENGINE=InnoDB AUTO_INCREMENT=1DEFAULT CHARSET=utf8;

2理朋、添加配置文件,可用使用yaml配置绿聘,即application.yml(與application.properties配置文件嗽上,沒(méi)什么太大的區(qū)別)連接池的配置如下:

spring:? datasource:? ? url: jdbc:mysql://127.0.0.1:3306/springboot_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false? ? driverClassName: com.mysql.jdbc.Driver? ? username: root? ? password: root? ? type: com.alibaba.druid.pool.DruidDataSource

3、需要建立與數(shù)據(jù)庫(kù)對(duì)應(yīng)的POJO類熄攘,代碼如下:

publicclassAuthor{privateLong id;privateString realName;privateString nickName;// SET和GET方法略}

二兽愤、方式一:與JdbcTemplate集成

通過(guò)JdbcTemplate來(lái)訪問(wèn)數(shù)據(jù)庫(kù),Spring boot提供了如下的starter來(lái)支撐:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>

再引入Junit測(cè)試Starter:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

DAO接口:

packagecom.guxf.dao;importjava.util.List;importcom.guxf.domain.Author;publicinterfaceAuthorDao{intadd(Authorauthor);intupdate(Authorauthor);intdelete(Longid);AuthorfindAuthor(Longid);List<Author>findAuthorList();}

實(shí)現(xiàn)Dao接口代碼(此處只寫(xiě)Add挪圾,其他方法略):

packagecom.guxf.impl;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;importorg.springframework.stereotype.Repository;importcom.guxf.dao.AuthorDao;importcom.guxf.domain.Author;@RepositorypublicclassAuthorDaoJdbcTemplateImplimplementsAuthorDao{@AutowiredprivateNamedParameterJdbcTemplatejdbcTemplate;@Overridepublicintadd(Authorauthor){Stringsql="insert into t_author(id,real_name,nick_name) "+"values(:id,:realName,:nickName)";Map<String,Object>param=newHashMap<>();param.put("id",author.getId());param.put("realName",author.getRealName());param.put("nickName",author.getNickName());return(int)jdbcTemplate.update(sql,param);}@Overridepublicintupdate(Authorauthor){return0;}@Overridepublicintdelete(Longid){return0;}@OverridepublicAuthorfindAuthor(Longid){returnnull;}@OverridepublicList<Author>findAuthorList(){returnnull;}}

通過(guò)JUnit來(lái)測(cè)試上面的代碼(需根據(jù)自己的實(shí)際Application名稍作修改):

packagecom.guxf.boot;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importcom.guxf.BootApplication;importcom.guxf.dao.AuthorDao;importcom.guxf.domain.Author;@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=BootApplication.class)publicclassAuthorDaoTest{@AutowiredprivateAuthorDao authorDao;@TestpublicvoidtestInsert(){Author author=newAuthor();author.setId(1L);author.setRealName("莫言");author.setNickName("瘋子");authorDao.add(author);System.out.println("插入成功烹看!");}}

插入成功:

成功.png

PS:需要注意的是,Application類所在的包必須是其他包的父包洛史,@SpringBootApplication這個(gè)注解繼承了@ComponentScan惯殊,其默認(rèn)情況下只會(huì)掃描Application類所在的包及子包,結(jié)構(gòu)圖:

目錄結(jié)構(gòu)圖.png

Application代碼示例:

packagecom.guxf;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassBootApplication{publicstaticvoidmain(String[]args){SpringApplication.run(BootApplication.class,args);}}

三也殖、方式二:與JPA集成

引入Starter:

<!-- 引入JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

對(duì)POJO類增加Entity的注解土思,并指定表名(如果不指定,默認(rèn)的表名為author)忆嗜,然后指定ID的及其生成策略己儒,這些都是JPA的知識(shí),與Spring boot無(wú)關(guān)捆毫,代碼:

packagecom.guxf.domain;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;@Entity(name="t_author")publicclassAuthor{@Id@GeneratedValueprivateLong id;privateString realName;privateString nickName;// SET和GET方法略}

需要繼承JpaRepository這個(gè)類闪湾,這里我們實(shí)現(xiàn)了兩個(gè)查詢方法,第一個(gè)是符合JPA命名規(guī)范的查詢绩卤,JPA會(huì)自動(dòng)幫我們完成查詢語(yǔ)句的生成途样,另一種方式是我們自己實(shí)現(xiàn)JPQL(JPA支持的一種類SQL的查詢):

packagecom.guxf.service;importjava.util.List;importjava.util.Optional;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.jpa.repository.Query;importorg.springframework.data.repository.query.Param;importcom.guxf.domain.Author;publicinterfaceAuthorRepository extends JpaRepository<Author,Long>{publicOptional<Author>findById(Long userId);@Query("select au from com.guxf.domain.Author au where nick_name=:nickName")publicList<Author>queryByNickName(@Param("nickName")String nickName);}

測(cè)試代碼:

package com.guxf.boot;importstaticorg.junit.Assert.*;importjava.util.List;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importcom.guxf.BootApplication;importcom.guxf.domain.Author;importcom.guxf.service.AuthorRepository;@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=BootApplication.class)publicclassAuthorDaoTestJPA{@AutowiredprivateAuthorRepositoryauthorRepository;@TestpublicvoidtestQuery(){List<Author>authorList=authorRepository.queryByNickName("瘋子");assertTrue(authorList.size()>0);System.out.println("成功!");}}

四濒憋、方式三:與MyBatis集成

引入starter:

<!-- 引入Mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency>

MyBatis一般可以通過(guò)XML或者注解的方式來(lái)指定操作數(shù)據(jù)庫(kù)的SQL何暇,首先,我們需要配置mapper的目錄凛驮。我們?cè)赼pplication.yml中進(jìn)行配置:

spring:? datasource:? ? url: jdbc:mysql://127.0.0.1:3306/springboot_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false? ? driverClassName: com.mysql.jdbc.Driver? ? username: root? ? password: root? ? type: com.alibaba.druid.pool.DruidDataSourcemybatis:? #config-locations: mybatis/mybatis-config.xml? mapper-locations: com/guxf/mapper/*.xml? type-aliases-package: com.guxf.mapper.AuthorMapper

編寫(xiě)mapper對(duì)應(yīng)的接口:

packagecom.guxf.mapper;importorg.apache.ibatis.annotations.Mapper;importcom.baomidou.mybatisplus.mapper.BaseMapper;importcom.guxf.domain.Author;@MapperpublicinterfaceAuthorMapperextendsBaseMapper<Author>{publicLonginsertAuthor(Authorauthor);publicvoidupdateAuthor(Authorauthor);publicAuthorqueryById(Longid);}

配置Mapper的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" ><mappernamespace="com.guxf.mapper.AuthorMapper"><!-- 此處需要注意的是裆站,由于我們數(shù)據(jù)庫(kù)定義的id存儲(chǔ)類型為intbig,但是我們的Entity中Id是Long --><!-- 前面的兩種方式插入沒(méi)問(wèn)題,此處報(bào)了數(shù)據(jù)庫(kù)類型異常 --><!-- 所以數(shù)據(jù)庫(kù)的ID類型改為了Varchar --><resultMapid="authorMap"type="com.guxf.domain.Author"><idcolumn="id"property="id"jdbcType="VARCHAR"/><resultcolumn="real_name"property="realName"jdbcType="VARCHAR"/><resultcolumn="nick_name"property="nickName"jdbcType="VARCHAR"/></resultMap><sqlid="base_column">id,real_name,nick_name</sql><insertid="insertAuthor"parameterType="com.guxf.domain.Author">INSERT INTO? ? ? ? t_author(<includerefid="base_column"/>)? ? ? ? VALUE? ? ? ? (#{id},#{realName},#{nickName})</insert><updateid="updateAuthor"parameterType="com.guxf.domain.Author">UPDATE t_author<set><iftest="realName != null">real_name = #{realName},</if><iftest="nickName != null">nick_name = #{nickName},</if></set>WHERE id = #{id}</update><selectid="queryById"parameterType="Long"resultMap="authorMap">SELECT id,<includerefid="base_column"></include>FROM t_author? ? ? ? WHERE id = #{id}</select></mapper>

測(cè)試類代碼:

packagecom.guxf;importstaticorg.junit.Assert.*;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importcom.guxf.BootApplication;importcom.guxf.domain.Author;importcom.guxf.mapper.AuthorMapper;@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=BootApplication.class)publicclassAuthorDaoTestMybatis{@AutowiredprivateAuthorMappermapper;@TestpublicvoidtestInsert(){Authorauthor=newAuthor();author.setId(4L);author.setRealName("唐鈺");author.setNickName("小寶");mapper.insertAuthor(author);System.out.println("成功!");}@TestpublicvoidtestMybatisQuery(){Authorauthor=mapper.queryById(1L);assertNotNull(author);System.out.println(author);}@TestpublicvoidtestUpdate(){Authorauthor=mapper.queryById(2L);author.setNickName("月兒");author.setRealName("林月如");mapper.updateAuthor(author);}}

我們看測(cè)試結(jié)果:

測(cè)試結(jié)果.png

配置掃描,需要根據(jù)自己項(xiàng)目結(jié)構(gòu)實(shí)際修改宏胯,下面貼上我的項(xiàng)目結(jié)構(gòu)圖:

結(jié)構(gòu).png

作者:莫問(wèn)以

鏈接:http://www.reibang.com/p/414ef5b49a69

來(lái)源:簡(jiǎn)書(shū)

著作權(quán)歸作者所有羽嫡。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處肩袍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杭棵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子了牛,更是在濱河造成了極大的恐慌颜屠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹰祸,死亡現(xiàn)場(chǎng)離奇詭異甫窟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蛙婴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)粗井,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人街图,你說(shuō)我怎么就攤上這事浇衬。” “怎么了餐济?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵耘擂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我絮姆,道長(zhǎng)醉冤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任篙悯,我火速辦了婚禮蚁阳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸽照。我一直安慰自己螺捐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布矮燎。 她就那樣靜靜地躺著定血,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漏峰。 梳的紋絲不亂的頭發(fā)上糠悼,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音浅乔,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛靖苇,可吹牛的內(nèi)容都是我干的席噩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贤壁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悼枢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起脾拆,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馒索,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后名船,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绰上,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年渠驼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜈块。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迷扇,死狀恐怖百揭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜓席,我是刑警寧澤器一,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厨内,受9級(jí)特大地震影響祈秕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隘庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一踢步、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丑掺,春花似錦获印、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至唆缴,卻和暖如春鳍征,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背面徽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工艳丛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匣掸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓氮双,卻偏偏與公主長(zhǎng)得像碰酝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戴差,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容