微服務(wù) SpringBoot 2.0(七):使用JdbcTemplates訪問Mysql

一切沒有與數(shù)據(jù)庫交互的網(wǎng)站都是假網(wǎng)站 —— Java面試必修

引言

在web開發(fā)服務(wù)中率触,開發(fā)人員要做的事情就是將數(shù)據(jù)庫中的數(shù)據(jù)返回至前端頁面,在第五章我們已經(jīng)整合了頁面汇竭,今天我們再結(jié)合數(shù)據(jù)庫做一個(gè)完整的增刪改查功能葱蝗,馬上要進(jìn)入數(shù)據(jù)交互了,緊不緊張

在接下來的文章中细燎,我在末尾處會(huì)公布源碼两曼,源碼將托管在碼云上

JdbcTemplate

工具

SpringBoot版本:2.0.4
開發(fā)工具:IDEA 2018
Maven:3.3 9
DB:mysql
JDK:1.8

依賴

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

添加上面代碼后一定要刷新依賴噢

數(shù)據(jù)源配置

在src/main/resources/application.yml中配置數(shù)據(jù)源信息。

spring.datasource:
  url: jdbc:mysql://192.168.2.211:3306/springboot?useUnicode=true&characterEncoding=utf-8
  username: root
  password: 123456
  driver-class-name: com.mysql.jdbc.Driver

spring-boot-starter-jdbc 默認(rèn)使用tomcat-jdbc數(shù)據(jù)源玻驻,如果你想使用其他的數(shù)據(jù)源悼凑,比如這里使用了阿里巴巴的數(shù)據(jù)池管理,你應(yīng)該額外添加以下依賴:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.5</version>
</dependency>

初始化mysql

-- create table `website_jdbc`
CREATE TABLE `website_jdbc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `website_jdbc` VALUES (1,'Java面試必修', 'www.itmsbx.com');
INSERT INTO `website_jdbc` VALUES (2,'對象無憂', 'www.51object.com');
INSERT INTO `website_jdbc` VALUES (3,'上海恒驪信息科技', 'www.henliy.com');
INSERT INTO `website_jdbc` VALUES (4 , '淘寶網(wǎng)', 'www.taobao.com');

編寫B(tài)ean,Service璧瞬,Dao

bean
public class WebSiteBean {

    //省略 getter 和 setter
    private Long id;
    private String name;
    private String url;

}
service
public interface WebSiteService {

    int add(WebSiteBean webSiteBean);

    int update(WebSiteBean webSiteBean);

    int deleteByIds(String ids);

    List<WebSiteBean> queryWebSiteList(Map<String,Object> params);
}

@Service
public class WebSiteServiceImpl implements WebSiteService {

    @Autowired
    private WebSiteDao webSiteDao;

    @Override
    public int add(WebSiteBean webSiteBean) {
        return webSiteDao.add(webSiteBean);
    }

    @Override
    public int update(WebSiteBean webSiteBean) {
        return webSiteDao.update(webSiteBean);
    }

    @Override
    public int deleteByIds(String ids) {
        return webSiteDao.deleteByIds(ids);
    }

    @Override
    public List<WebSiteBean> queryWebSiteList(Map<String, Object> params) {
        return webSiteDao.queryWebSiteList(params);
    }
}
dao
public interface WebSiteDao {

    int add(WebSiteBean webSiteBean);

    int update(WebSiteBean webSiteBean);

    int deleteByIds(String ids);

    List<WebSiteBean> queryWebSiteList(Map<String,Object> params);
}


@Repository
public class WebSiteDaoImpl implements WebSiteDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int add(WebSiteBean webSiteBean) {
        return jdbcTemplate.update("insert into website_jdbc(name,url) values(?, ?)"
                ,webSiteBean.getName(),webSiteBean.getUrl());
    }

    @Override
    public int update(WebSiteBean webSiteBean) {
        return jdbcTemplate.update("update website_jdbc set name=?,url where id = ?",
                new Object[]{webSiteBean.getName(),webSiteBean.getUrl(),webSiteBean.getId()});
    }

    @Override
    public int deleteByIds(String ids) {
        return jdbcTemplate.update("delete from website_jdbc  where id in(" + ids + ")");
    }

    @Override
    public List<WebSiteBean> queryWebSiteList(Map<String, Object> params) {
        StringBuffer sql =new StringBuffer();
        sql.append("select * from website_jdbc where 1=1");
        if(params.containsKey("name")){
            sql.append(" and name like '%").append(String.valueOf(params.get("name"))).append("%'");
        }
        if(params.containsKey("url")){
            sql.append(" and url like '%").append((String)params.get("url")).append("%'");
        }
        List<WebSiteBean> list = jdbcTemplate.query(sql.toString() , new BeanPropertyRowMapper(WebSiteBean.class));
        return list;
    }
}

Dao實(shí)現(xiàn)類,這里注入我們需要的JdbcTemplate户辫,然后通過JdbcTemplate提供的接口進(jìn)行增刪查該的操作,這里我就寫幾個(gè)簡單的嗤锉,更多可以自行查看JdbcTemplate提供的api

編寫Controller

@Controller
@RequestMapping("/jdbc")
public class WebSiteController {

    @Autowired
    private WebSiteService websiteService;

    @RequestMapping("query")
    public ModelAndView query(){
        Map<String,Object> params = new HashMap<>();
        params.put("name","Java面試必修");
        List<WebSiteBean> webSiteBeans = websiteService.queryWebSiteList(params);
        ModelAndView mav = new ModelAndView("/list");
        mav.addObject("webSiteBeans",webSiteBeans);
        mav.addObject("hint","想學(xué)習(xí)更多面試技巧和知識(shí)渔欢,請關(guān)注公眾號:Java面試必修(itmsbx)");
        return mav;
    }
}

更改Application

@SpringBootApplication
public class DemoJdbcApplication {

    @Autowired
    private Environment env;

    //destroy-method="close"的作用是當(dāng)數(shù)據(jù)庫連接不使用的時(shí)候,就把該連接重新放到數(shù)據(jù)池中,方便下次使用調(diào)用.
    @Bean(destroyMethod =  "close")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));//用戶名
        dataSource.setPassword(env.getProperty("spring.datasource.password"));//密碼
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setInitialSize(2);//初始化時(shí)建立物理連接的個(gè)數(shù)
        dataSource.setMaxActive(20);//最大連接池?cái)?shù)量
        dataSource.setMinIdle(0);//最小連接池?cái)?shù)量
        dataSource.setMaxWait(60000);//獲取連接時(shí)最大等待時(shí)間,單位毫秒档冬。
        dataSource.setValidationQuery("SELECT 1");//用來檢測連接是否有效的sql
        dataSource.setTestOnBorrow(false);//申請連接時(shí)執(zhí)行validationQuery檢測連接是否有效
        dataSource.setTestWhileIdle(true);//建議配置為true膘茎,不影響性能桃纯,并且保證安全性。
        dataSource.setPoolPreparedStatements(false);//是否緩存preparedStatement披坏,也就是PSCache
        return dataSource;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoJdbcApplication.class, args);
    }
}

到這里啟動(dòng)服務(wù)器态坦,瀏覽器輸入http://localhost:8080/jdbc/query 看看效果吧

總結(jié)

本章講解了使用JdbcTemplates訪問Mysql數(shù)據(jù)庫,實(shí)現(xiàn)了數(shù)據(jù)交互棒拂,看上去是不是還是很簡單呢伞梯?不過光是JdbcTemplates還是不夠的,畢竟咱們還是要深入企業(yè)主流框架帚屉,下一章我將帶大家整合Mybatis框架谜诫,后面的源代碼將整合一個(gè)開源的網(wǎng)站來進(jìn)行講解,學(xué)完這些框架之后攻旦,你也能收獲一個(gè)自己動(dòng)手的網(wǎng)站喻旷,一舉多得是不是很有動(dòng)力

源碼地址:

https://gitee.com/rjj1/SpringBootNote/tree/master/demo-jdbc


作者有話說:喜歡的話就請移步Java面試必修網(wǎng),請自備水牢屋,更多干且预、干、干貨等著你

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烙无,一起剝皮案震驚了整個(gè)濱河市锋谐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌截酷,老刑警劉巖涮拗,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異迂苛,居然都是意外死亡三热,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門三幻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來康铭,“玉大人,你說我怎么就攤上這事赌髓〈犹伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵锁蠕,是天一觀的道長夷野。 經(jīng)常有香客問我,道長荣倾,這世上最難降的妖魔是什么悯搔? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮舌仍,結(jié)果婚禮上妒貌,老公的妹妹穿的比我還像新娘通危。我一直安慰自己,他們只是感情好灌曙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布菊碟。 她就那樣靜靜地躺著,像睡著了一般在刺。 火紅的嫁衣襯著肌膚如雪逆害。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天蚣驼,我揣著相機(jī)與錄音魄幕,去河邊找鬼。 笑死颖杏,一個(gè)胖子當(dāng)著我的面吹牛纯陨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播留储,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼队丝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欲鹏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤臭墨,失蹤者是張志新(化名)和其女友劉穎赔嚎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧弛,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尤误,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了结缚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损晤。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖红竭,靈堂內(nèi)的尸體忽然破棺而出尤勋,到底是詐尸還是另有隱情,我是刑警寧澤茵宪,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布最冰,位于F島的核電站,受9級特大地震影響稀火,放射性物質(zhì)發(fā)生泄漏暖哨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一凰狞、第九天 我趴在偏房一處隱蔽的房頂上張望篇裁。 院中可真熱鬧沛慢,春花似錦、人聲如沸达布。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽往枣。三九已至伐庭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分冈,已是汗流浹背圾另。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雕沉,地道東北人集乔。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像坡椒,于是被迫代替她去往敵國和親扰路。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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