Springboot整合jdbcTemplate過程解析
一 說明
實際工作中其實很少會用到jdbcTemplate去操作資料庫,因為其使用方式不是很靈活,sql的拼接能力不強;實際上jdbcTemplate是屬於spring自帶的資料層模板,在spring中可以說是比較失敗的一個案例,原因是當代流行mybatis當做持久層訪問資料庫,其優越的sql拼接能力、動態sql、半自動化對映、和易於sql優化的特性,深受廣大網際網路公司的喜愛,並且mybatis的市場佔有率不斷的上升,hibernate的市場不斷縮水,可以說hibernate已經這種強對映關係的持久層模型已經走到網際網路時代的盡頭了。
本文寫jdbcTemplate只是當作大家的一個入門學習,可以說以後你很難用到這門技術,所以不會深入研究,有興趣的朋友可以專欄我其他關於springboot的整合系列。本次演示使用jdk1.8,mysql5.6,springboot2.1。
二資料庫建表和實體
user表,裡面有三個屬性 使用者id、 使用者名稱和電話號碼。
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '使用者id',`name` varchar(255) DEFAULT NULL COMMENT '使用者名稱',`telephone` varchar(255) DEFAULT NULL COMMENT '使用者電話',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
user表對應的實體:
/** * @Author lsc * @Description <p>pojo </p> * @Date 2019/11/2 10:16 */ public class User { // id private Long id; // 姓名 private String name; // 電話 private String telephone; // 省略 set get }
三 dao層
對於使用jdbcTemplate,我們的dao層需要介面定義crud操作方法,其實現類則進行具體的sql操作,很多開發人員沒有這種解耦的思想,往往就直接在servic層操作sql,可以說沒有完整的一個知識體系,往往會造成後期維護困難,專案無法進行下去;
3.1 dao介面
/** * @Author lsc * @Description <p> user dao 介面 </p> * @Date 2019/11/2 10:19 */ public interface UserDao { // 新增 int addUser(User user); // 改 int updateUser(User user); // 刪 int deleteUser(Long id); // 通過id查詢 User findUserbyId(Long id); }
3.2 dao層實現類
dao層的實現類才是具體操作sql的地方。
/** * @Author lsc * @Description <p> user 持久層 </p> * @Date 2019/11/2 10:22 */ @Repository public class UserDaoImpl implements UserDao { // 注入jdbc模板 @Autowired private JdbcTemplate jdbcTemplate; @Override public int addUser(User user) { // sql String sql = "insert into user (name,telephone) values (?,?)"; // jdbc insert return jdbcTemplate.update(sql,user.getName(),user.getTelephone()); } @Override public int updateUser(User user) { // sql String sql = "update user set name = ?,telephone = ? where id = ?"; // jdbc updae return jdbcTemplate.update(sql,user.getTelephone(),user.getId()); } @Override public int deleteUser(Long id) { // sql String sql = "delete from user where id = ?"; // delete return jdbcTemplate.update(sql,id); } @Override public User findUserbyId(Long id) { // sql String sql = "select * from user where id = ?"; // params Object[] params = new Object[]{id}; // rowMapper BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper(User.class); // jdbc query List<User> query = jdbcTemplate.query(sql,params,rowMapper); // return user return query.get(0); } }
四 service層
4.1 service層介面
service層介面定義業務的方法,提供給控制層呼叫。
public interface UserService { // 新增 int addUser(User user); // 改 int updateUser(User user); // 刪 int deleteUser(Long id); // 通過id查詢 User findUserbyId(Long id); }
4.2 service層實現類
service層的實現類才是具體寫業務邏輯程式碼的地方。
/** * @Author lsc * @Description <p> user service </p> * @Date 2019/11/2 10:37 */ @Service public class UserServiceImpl implements UserService { @Autowired UserDao userDao; @Override public int addUser(User user) { return userDao.addUser(user); } @Override public int updateUser(User user) { return userDao.updateUser(user); } @Override public int deleteUser(Long id) { return userDao.deleteUser(id); } @Override public User findUserbyId(Long id) { return userDao.findUserbyId(id) ; } }
五 controller
這是一個簡單的restful層的api,實現crud功能。
/** * @Author lsc * @Description <p>user 控制層 </p> * @Date 2019/11/2 10:43 */ @RestController public class UserController { @Autowired UserService userService; // 查詢user @GetMapping("user/{id}") public User getUser(@PathVariable Long id){ return userService.findUserbyId(id); } // 新增user @PostMapping("user") public int addUser(@RequestBody User user){ return userService.addUser(user); } //修改 user @PutMapping("user/{id}") public int updateUser(@PathVariable Long id,@RequestBody User user){ user.setId(id); return userService.updateUser(user); } // 刪除user @DeleteMapping("user/{id}") public int deleteUser(@PathVariable Long id){ return userService.deleteUser(id); } }
六 配置檔案
配置檔案不使用properties的原因是yml檔案的語法格式更加簡練明瞭,在配置檔案中的註解已經很詳細,所以不會贅述。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver #資料庫驅動
url: jdbc:mysql://192.168.0.105:3306/springboot?useUnicode=true&characterEncoding=utf-8 #資料庫地址
username: root #資料庫賬號
password: 123456 # 資料密碼
type: com.alibaba.druid.pool.DruidDataSource # 連線池型別
druid:
#初始化連線池的連線數量
initial-size: 5
# 最小
min-idle: 5
# 最大
max-active: 20
#配置獲取連線等待超時的時間
max-wait: 6000
#配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
time-between-eviction-runs-millis: 6000
# 配置一個連線在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 3000
七 pom.xml
很抱歉我把xml放在最後面了
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> </parent> <dependencies> <!-- jdbc 啟動器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- mysql 啟動器 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 連線池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.15</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- --> </dependencies>
八 測試工具說明
大家可以通過postman等開發工具進行restful風格介面測試,作為後端開發者,就別去寫頁面了。
九 測試連結池說明
如果大家想知道怎麼測試連線池是否連線成功可以實現ApplicationContextAware介面進行測試,具體的程式碼如下:
/** * @Author lsc * @Description <p> 實現spring bean 生命週期介面</p> * @Date 2019/11/2 10:08 */ @Component public class DatabaseVision implements ApplicationContextAware { ApplicationContext applicationContext = null; // spring ioc 初始化 bean 的時候呼叫 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // 獲得applicationContext this.applicationContext = applicationContext; // 獲得dataSource DataSource dataSource = applicationContext.getBean(DataSource.class); // 啟動 springboot application print com.alibaba.druid.pool.DruidDataSource System.out.println(dataSource.getClass().getName()); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。