电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring JdbcTemplate整合使用方法及原理詳解

瀏覽:76日期:2023-08-20 17:06:52

基本配置

JdbcTemplate基本用法實際上很簡單,開發者在創建一個SpringBoot項目時,除了選擇基本的Web依賴,再記得選上Jdbc依賴,以及數據庫驅動依賴即可,如下:

Spring JdbcTemplate整合使用方法及原理詳解

項目創建成功之后,記得添加Druid數據庫連接池依賴(注意這里可以添加專門為Spring Boot打造的druid-spring-boot-starter,而不是我們一般在SSM中添加的Druid),所有添加的依賴如下:

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> <scope>runtime</scope></dependency>

項目創建完后,接下來只需要在application.properties中提供數據的基本配置即可,如下:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.username=rootspring.datasource.password=123spring.datasource.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8

如此之后,所有的配置就算完成了,接下來就可以直接使用JdbcTemplate了?咋這么方便呢?其實這就是SpringBoot的自動化配置帶來的好處,我們先說用法,一會來說原理。

基本用法

首先我們來創建一個User Bean,如下:

public class User { private Long id; private String username; private String address; //省略getter/setter}

然后來創建一個UserService類,在UserService類中注入JdbcTemplate,如下:

@Servicepublic class UserService { @Autowired JdbcTemplate jdbcTemplate;}

好了,如此之后,準備工作就算完成了。

JdbcTemplate中,除了查詢有幾個API之外,增刪改統一都使用update來操作,自己來傳入SQL即可。例如添加數據,方法如下:

public int addUser(User user) { return jdbcTemplate.update('insert into user (username,address) values (?,?);', user.getUsername(), user.getAddress());}

update方法的返回值就是SQL執行受影響的行數。

這里只需要傳入SQL即可,如果你的需求比較復雜,例如在數據插入的過程中希望實現主鍵回填,那么可以使用PreparedStatementCreator,如下:

public int addUser2(User user) { KeyHolder keyHolder = new GeneratedKeyHolder(); int update = jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement ps = connection.prepareStatement('insert into user (username,address) values (?,?);', Statement.RETURN_GENERATED_KEYS); ps.setString(1, user.getUsername()); ps.setString(2, user.getAddress()); return ps; } }, keyHolder); user.setId(keyHolder.getKey().longValue()); System.out.println(user); return update;}

實際上這里就相當于完全使用了JDBC中的解決方案了,首先在構建PreparedStatement時傳入Statement.RETURN_GENERATED_KEYS,然后傳入KeyHolder,最終從KeyHolder中獲取剛剛插入數據的id保存到user對象的id屬性中去。

你能想到的JDBC的用法,在這里都能實現,Spring提供的JdbcTemplate雖然不如MyBatis,但是比起Jdbc還是要方便很多的。

刪除也是使用update API,傳入你的SQL即可:

public int deleteUserById(Long id) { return jdbcTemplate.update('delete from user where id=?', id);}

當然你也可以使用PreparedStatementCreator。

public int updateUserById(User user) { return jdbcTemplate.update('update user set username=?,address=? where id=?', user.getUsername(), user.getAddress(),user.getId());}

當然你也可以使用PreparedStatementCreator。

查詢的話,稍微有點變化,這里主要向大伙介紹query方法,例如查詢所有用戶:

public List<User> getAllUsers() { return jdbcTemplate.query('select * from user', new RowMapper<User>() { @Override public User mapRow(ResultSet resultSet, int i) throws SQLException { String username = resultSet.getString('username'); String address = resultSet.getString('address'); long id = resultSet.getLong('id'); User user = new User(); user.setAddress(address); user.setUsername(username); user.setId(id); return user; } });}

查詢的時候需要提供一個RowMapper,就是需要自己手動映射,將數據庫中的字段和對象的屬性一一對應起來,這樣。。。。嗯看起來有點麻煩,實際上,如果數據庫中的字段和對象屬性的名字一模一樣的話,有另外一個簡單的方案,如下:

public List<User> getAllUsers2() { return jdbcTemplate.query('select * from user', new BeanPropertyRowMapper<>(User.class));}

至于查詢時候傳參也是使用占位符,這個和前文的一致,這里不再贅述。

其他

除了這些基本用法之外,JdbcTemplate也支持其他用法,例如調用存儲過程等,這些都比較容易,而且和Jdbc本身都比較相似,這里也就不做介紹了,有興趣可以留言討論。

原理分析

那么在SpringBoot中,配置完數據庫基本信息之后,就有了一個JdbcTemplate了,這個東西是從哪里來的呢?源碼在

org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration類中,該類源碼如下:

@Configuration@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })@ConditionalOnSingleCandidate(DataSource.class)@AutoConfigureAfter(DataSourceAutoConfiguration.class)@EnableConfigurationProperties(JdbcProperties.class)public class JdbcTemplateAutoConfiguration {@Configuration static class JdbcTemplateConfiguration {private final DataSource dataSource;private final JdbcProperties properties;JdbcTemplateConfiguration(DataSource dataSource, JdbcProperties properties) { this.dataSource = dataSource; this.properties = properties; }@Bean @Primary @ConditionalOnMissingBean(JdbcOperations.class) public JdbcTemplate jdbcTemplate() { JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource); JdbcProperties.Template template = this.properties.getTemplate(); jdbcTemplate.setFetchSize(template.getFetchSize()); jdbcTemplate.setMaxRows(template.getMaxRows()); if (template.getQueryTimeout() != null) {jdbcTemplate .setQueryTimeout((int) template.getQueryTimeout().getSeconds()); } return jdbcTemplate; }}@Configuration @Import(JdbcTemplateConfiguration.class) static class NamedParameterJdbcTemplateConfiguration {@Bean @Primary @ConditionalOnSingleCandidate(JdbcTemplate.class) @ConditionalOnMissingBean(NamedParameterJdbcOperations.class) public NamedParameterJdbcTemplate namedParameterJdbcTemplate(JdbcTemplate jdbcTemplate) { return new NamedParameterJdbcTemplate(jdbcTemplate); }}}

從這個類中,大致可以看出,當當前類路徑下存在DataSource和JdbcTemplate時,該類就會被自動配置,jdbcTemplate方法則表示,如果開發者沒有自己提供一個JdbcOperations的實例的話,系統就自動配置一個JdbcTemplate Bean(JdbcTemplate是JdbcOperations接口的一個實現)。好了,不知道大伙有沒有收獲呢?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 必胜高考网_全国高考备考和志愿填报信息平台 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 校园气象站_超声波气象站_农业气象站_雨量监测站_风途科技 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 昆明化妆培训-纹绣美甲-美容美牙培训-昆明博澜培训学校 | 许昌奥仕达自动化设备有限公司 | 浙江富广阀门有限公司 | 避光流动池-带盖荧光比色皿-生化流动比色皿-宜兴市晶科光学仪器 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 南京交通事故律师-专打交通事故的南京律师 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 外贸资讯网 - 洞悉全球贸易,把握市场先机 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 悬浮拼装地板_篮球场木地板翻新_运动木地板价格-上海越禾运动地板厂家 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 苏州西朗门业-欧盟CE|莱茵UL双认证的快速卷帘门品牌厂家 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 | 诗词大全-古诗名句 - 古诗词赏析|