使用數(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)注明出處肩袍。