小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

整合MySQL,JDBCTemplate

 碼農(nóng)9527 2021-07-16

從今天起我們將開(kāi)始學(xué)習(xí)SpringBoot數(shù)據(jù)篇,本篇將講解整合MySQL、整合JDBCTemplate、整合Durid方面的內(nèi)容。  

整合MySQL,JDBCTemplate

整合MySQL  

在整合MySQL之前,我們首先要清楚兩個(gè)問(wèn)題:  

什么是JDBC?  

JDBC(JavaDataBaseConnectivity),用于執(zhí)行SQL語(yǔ)句的JavaApi。我們本文主要講的是SpringJDBC,它是對(duì)于JDBC的封裝,讓我們使用JDBC時(shí)更加簡(jiǎn)單方便快捷。  

什么是持久層?  

持久層(PersistenceLayer),對(duì)數(shù)據(jù)進(jìn)行持久化操作(例:將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)的操作),把數(shù)據(jù)保存起來(lái)或者把持久狀態(tài)的數(shù)據(jù)查詢出來(lái)。(有關(guān)于以上操作的代碼都是持久層代碼)  

SpringJDBC集成  

首先我們?cè)趐om.xml文件中導(dǎo)入maven依賴(lài): 

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
</dependency>12345678復(fù)制代碼類(lèi)型:[java]

之后我們?cè)赼pplication.yml中添加數(shù)據(jù)源配置:

datasource:
 driver-class-name: com.mysql.cj.jdbc.Driver
 url: jdbc:mysql://localhost:3306/Family?serverTimezone=GMT%2b8&characterEncoding=utf-8
 username: root
 password: 12345612345復(fù)制代碼類(lèi)型:[java]

在數(shù)據(jù)庫(kù)中創(chuàng)建pets表:  

/*
 Navicat Premium Data Transfer

 Source Server   : javafamily
 Source Server Type : MySQL
 Source Server Version : 50729
 Source Host  : localhost:3306
 Source Schema   : Family

 Target Server Type : MySQL
 Target Server Version : 50729
 File Encoding   : 65001
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for pets
-- ----------------------------
DROP TABLE IF EXISTS `pets`;
CREATE TABLE `pets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `varieties` varchar(32) NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='寵物';

SET FOREIGN_KEY_CHECKS = 1;123456789101112131415161718192021222324252627282930復(fù)制代碼類(lèi)型:[java]

我們?cè)趈avafamily.familydemo文件下創(chuàng)建文件夾dao并在其中創(chuàng)建PetsDAO.class:  

package com.javafamily.familydemo.dao;import com.javafamily.familydemo.model.Pets;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import javax.annotation.Resource;import java.util.List;// 表示當(dāng)前類(lèi)是持久層依賴(lài)注入的對(duì)象@Repositorypublic class PetsDAO { @Resource
 // 進(jìn)行JDBC操作的模版類(lèi)(由Spring JDBC提供)
 private JdbcTemplate jdbcTemplate; // 增加一只寵物的信息
 public void save(Pets pets) {  // jdbcTemplate.update適合于insert 、update和delete操作,不適合查詢操作。
  jdbcTemplate.update("INSERT INTO pets(name,varieties,create_time) values(?, ?, ?)",
 pets.getName(),
 pets.getVarieties(),
 pets.getCreateTime());
 } // 刪除一只寵物的信息
 public void deleteById(Long id) {
  jdbcTemplate.update("DELETE FROM pets WHERE id = ?", id);
 } // 修改一只寵物信息
 public void updateById(Pets pets) {
  jdbcTemplate.update("UPDATE pets SET name = ?,varieties = ?,create_time = ? WHERE id = ?",
 pets.getName(),
 pets.getVarieties(),
 pets.getCreateTime(),
 pets.getId());
 } // 查找寵物信息,queryForObject:用于查詢單條記錄返回結(jié)果
 public Pets searchById(Long id) {  return (Pets) jdbcTemplate.queryForObject("SELECT * FROM pets WHERE id=?", new Object[]{id}, new BeanPropertyRowMapper<>(Pets.class));
 } // 查詢寵物信息,query:用于查詢結(jié)果列表
 public List<Pets> findAll() {  return (List<Pets>) jdbcTemplate.query("SELECT * FROM pets ", new BeanPropertyRowMapper<>(Pets.class));
 }
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152復(fù)制代碼類(lèi)型:[java]

在編寫(xiě)完Dao層的代碼后,我們要思考一個(gè)問(wèn)題,為什么服務(wù)端后端要采用分層開(kāi)發(fā)?(controller:參數(shù)的接收和相應(yīng)結(jié)果的返回。service:業(yè)務(wù)處理。repository:數(shù)據(jù)持久化以及查詢相關(guān)的操作)  

在比較簡(jiǎn)單的開(kāi)發(fā)中,controller層是可以直接調(diào)用持久層(dao)的。但是這種方法不推薦使用,因?yàn)槲覀冃枰趕ervice層控制事務(wù)。所以還是使用正常的調(diào)用順序(controller->service->dao),進(jìn)行分層開(kāi)發(fā)。  

所以下面我們來(lái)編寫(xiě)service層代碼,我們對(duì)之前創(chuàng)建好的PetsService進(jìn)行改造:  

package com.javafamily.familydemo.service;import com.javafamily.familydemo.model.Pets;import java.util.List;public interface PetsService { String savePets(Pets pets); void deletePets(long id); void updatePets(Pets pets); Pets getPets(Long id); List<Pets> getAll();
}1234567891011121314151617復(fù)制代碼類(lèi)型:[java]

再修改一下之前的PetsServiceImpl:  

package com.javafamily.familydemo.service;import com.javafamily.familydemo.dao.PetsDAO;import com.javafamily.familydemo.model.Pets;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.util.List;@Servicepublic class PetsServiceImpl implements PetsService { @Resource
 private PetsDAO petsDAO; @Override
 public void savePets(Pets pets) {
  petsDAO.save(pets);
 } @Override
 public void deletePets(long id) {
  petsDAO.deleteById(id);
 } @Override
 public void updatePets(Pets pets) {
  petsDAO.updateById(pets);
 } @Override
 public Pets getPets(Long id) {  return petsDAO.searchById(id);
 } @Override
 public List<Pets> getAll() {  return petsDAO.findAll();
 }123456789101112131415161718192021222324252627282930313233343536373839復(fù)制代碼類(lèi)型:[java]

回到PetsController中進(jìn)行修改:  

package com.javafamily.familydemo.controller;import com.javafamily.familydemo.model.Customer;import com.javafamily.familydemo.model.Pets;import com.javafamily.familydemo.model.Response;import com.javafamily.familydemo.service.PetsService;import io.swagger.annotations.*;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import java.util.ArrayList;import java.util.Date;import java.util.List;@Slf4j@RestControllerpublic class PetsController { @Resource
 PetsService petsService; // 根據(jù)id,查詢一只寵物信息
 @RequestMapping(value = "/pets/{id}", method = RequestMethod.GET)
 public Response getPets(@PathVariable("id") long id) {
  Pets pets = petsService.getPets(id);
  log.info("pets" + pets);  return Response.success(pets);
 } @RequestMapping(value = "/pets", method = RequestMethod.POST)
 public Response savePets(@RequestBody Pets pets) {
  petsService.savePets(pets);
  log.info("savePets" + pets);  return Response.success();
 } // 修改一只寵物信息
 @RequestMapping(value = "/pets", method = RequestMethod.PUT)
 public Response updatePets(@RequestBody Pets pets) {
  petsService.updatePets(pets);
  log.info("updatePets" + pets);  return Response.success(pets);

 } // 根據(jù)id,刪除一只寵物信息
 @RequestMapping(value = "/pets/{id}", method = RequestMethod.DELETE)
 public Response deletePets(@PathVariable("id") Long id) {
  petsService.deletePets(id);
  log.info("deletePets" + id);  return Response.success();
 } // 查詢所有寵物信息
 @RequestMapping(value = "/pets", method = RequestMethod.GET)
 public Response getPets() {
  List<Pets> pets = petsService.getAll();
  log.info("pets" + pets);  return Response.success(pets);
 }

}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465復(fù)制代碼類(lèi)型:[java]

由于我們?cè)趧?chuàng)建數(shù)據(jù)庫(kù)后沒(méi)有在里面添加數(shù)據(jù),所以在使用postman測(cè)試時(shí)data暫時(shí)顯示為空。  整合MySQL,JDBCTemplate

這時(shí)向數(shù)據(jù)庫(kù)中添加一條我們?cè)?jīng)測(cè)試過(guò)的數(shù)據(jù):  整合MySQL,JDBCTemplate

添加完成后,我們會(huì)在數(shù)據(jù)庫(kù)中看見(jiàn)這條數(shù)據(jù),并且能在postman中查詢出來(lái):  整合MySQL,JDBCTemplate  整合MySQL,JDBCTemplate

我們將狗的品種改成erha:  整合MySQL,JDBCTemplate

整合MySQL,JDBCTemplate

最后刪掉id為1的這條數(shù)據(jù):  整合MySQL,JDBCTemplate

整合MySQL,JDBCTemplate

數(shù)據(jù)被成功刪除。  

之后我們來(lái)看@Trasactional注解:它能夠進(jìn)行事務(wù)管理,保證方法一旦有異常,所有的數(shù)據(jù)庫(kù)操作進(jìn)行回滾(比如@Trasactional注解作用在修改方法上,當(dāng)出現(xiàn)異常修改操作將不會(huì)進(jìn)行,數(shù)據(jù)庫(kù)中的數(shù)據(jù)不會(huì)發(fā)生任何改變)。  

以上我們介紹的是單一數(shù)據(jù)源的配置與實(shí)現(xiàn),隨著數(shù)據(jù)的增多,我們會(huì)逐漸使用數(shù)據(jù)分庫(kù)存儲(chǔ)的方案,那么在持久層中一個(gè)服務(wù)要操作多個(gè)數(shù)據(jù)庫(kù),那么該如何實(shí)現(xiàn)呢?下面我們來(lái)介紹多數(shù)據(jù)源的實(shí)現(xiàn)。  

整合MySQL,JDBCTemplate

首先在application.yml中添加一個(gè)數(shù)據(jù)源配置:  

spring:
  datasource:
 family:
   driver-class-name: com.mysql.cj.jdbc.Driver
   jdbc-url: jdbc:mysql://localhost:3306/Family?serverTimezone=GMT%2b8&characterEncoding=utf-8
   username: root
   password: 123456
 family2:
   driver-class-name: com.mysql.cj.jdbc.Driver
   jdbc-url: jdbc:mysql://localhost:3306/Family2?serverTimezone=GMT%2b8&characterEncoding=utf-8
   username: root
   password: 123456123456789101112復(fù)制代碼類(lèi)型:[java]

之后在config文件中創(chuàng)建DataSourceConfig.java:  

package com.javafamily.familydemo.config;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configurationpublic class DataSourceConfig { // 當(dāng)一個(gè)接口有多個(gè)時(shí)候?qū)崿F(xiàn)類(lèi)的時(shí)候,如果Spring只能選一個(gè)實(shí)現(xiàn)進(jìn)行依賴(lài)注入時(shí),就選這個(gè)數(shù)據(jù)源(默認(rèn)數(shù)據(jù)源)
 @Primary
 @Bean(name = "familyDataSource")
 @ConfigurationProperties(prefix = "spring.datasource.family")
 public DataSource familyDataSource() {  return DataSourceBuilder.create().build();
 } @Bean(name = "family2DataSource")
 @ConfigurationProperties(prefix = "spring.datasource.family2")  
 public DataSource family2DataSource() {  return DataSourceBuilder.create().build();
 }

}1234567891011121314151617181920212223242526272829復(fù)制代碼類(lèi)型:[java]

JDBCTemplate實(shí)現(xiàn)多數(shù)據(jù)源  

在完成了圖-多數(shù)據(jù)源配置的前兩個(gè)步驟,我們要開(kāi)始實(shí)現(xiàn)JDBCTemplate部分!  

首先將petsDAO.class進(jìn)行修改:  

package com.javafamily.familydemo.dao;import com.javafamily.familydemo.model.Pets;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import javax.annotation.Resource;import java.util.List;// 表示當(dāng)前類(lèi)是持久層依賴(lài)注入的對(duì)象@Repositorypublic class PetsDAO { @Resource
 // 進(jìn)行JDBC操作的模版類(lèi)(由Spring JDBC提供)
 private JdbcTemplate familyJdbcTemplate; // 增加一只寵物的信息
 public void save(Pets pets, JdbcTemplate jdbcTemplate) {  if (jdbcTemplate == familyJdbcTemplate){
   jdbcTemplate = familyJdbcTemplate;
  }  // jdbcTemplate.update適合于insert 、update和delete操作,不適合查詢操作。
  jdbcTemplate.update("INSERT INTO pets(name,varieties,create_time) values(?, ?, ?)",
 pets.getName(),
 pets.getVarieties(),
 pets.getCreateTime());
 } // 刪除一只寵物的信息
 public void deleteById(Long id,JdbcTemplate jdbcTemplate) {
  jdbcTemplate.update("DELETE FROM pets WHERE id = ?", id);
 } // 修改一只寵物信息
 public void updateById(Pets pets, JdbcTemplate jdbcTemplate) {
  jdbcTemplate.update("UPDATE pets SET name = ?,varieties = ?,create_time = ? WHERE id = ?",
 pets.getName(),
 pets.getVarieties(),
 pets.getCreateTime(),
 pets.getId());
 } // 查找寵物信息,queryForObject:用于查詢單條記錄返回結(jié)果
 public Pets searchById(Long id,JdbcTemplate jdbcTemplate) {  return (Pets) jdbcTemplate.queryForObject("SELECT * FROM pets WHERE id=?", new Object[]{id}, new BeanPropertyRowMapper<>(Pets.class));
 } // 查詢寵物信息,query:用于查詢結(jié)果列表
 public List<Pets> findAll(JdbcTemplate jdbcTemplate) {  return (List<Pets>) jdbcTemplate.query("SELECT * FROM pets ", new BeanPropertyRowMapper<>(Pets.class));
 }
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455復(fù)制代碼類(lèi)型:[java]

familyJdbcTemplate使用familyDataSource數(shù)據(jù)源操作數(shù)據(jù)庫(kù)Family。  

family2JdbcTemplate使用family2DataSource數(shù)據(jù)源操作數(shù)據(jù)庫(kù)Family2。  

再對(duì)PetsServiceImpl.java進(jìn)行完善:  

package com.javafamily.familydemo.service;import com.javafamily.familydemo.dao.PetsDAO;import com.javafamily.familydemo.model.Pets;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.util.List;@Servicepublic class PetsServiceImpl implements PetsService { @Resource
 private PetsDAO petsDAO; @Resource
 private JdbcTemplate familyJdbcTemplate; @Resource
 private JdbcTemplate family2JdbcTemplate; @Override
 public void savePets(Pets pets) {
  petsDAO.save(pets, familyJdbcTemplate);
  petsDAO.save(pets, family2JdbcTemplate);
 } @Override
 public void deletePets(long id) {
  petsDAO.deleteById(id, null);
 } @Override
 public void updatePets(Pets pets) {
  petsDAO.updateById(pets, null);
 } @Override
 public Pets getPets(Long id) {  return petsDAO.searchById(id, null);
 } @Override
 public List<Pets> getAll() {  return petsDAO.findAll(null);
 }
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647復(fù)制代碼類(lèi)型:[java]

這時(shí)我們?cè)跀?shù)據(jù)庫(kù)Family2中建立一個(gè)跟數(shù)據(jù)庫(kù)Family中的一樣的pets表,之后在postman中添加數(shù)據(jù):  整合MySQL,JDBCTemplate數(shù)據(jù)庫(kù)Family和Family2中都會(huì)出現(xiàn)這條數(shù)據(jù): 整合MySQL,JDBCTemplate

整合MySQL,JDBCTemplate

雙數(shù)據(jù)源的配置和插入動(dòng)作就完成了! 

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多