生活随笔
收集整理的這篇文章主要介紹了
Spring-jdbc:JdbcTemplate使用简介
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
為了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定義了一個(gè)抽象層, 以此建立一個(gè)JDBC存取框架.
作為 SpringJDBC 框架的核心, JDBC 模板的設(shè)計(jì)目的是為不同類型的JDBC操作提供模板方法. 每個(gè)模板方法都能控制整個(gè)過(guò)程,并允許覆蓋過(guò)程中的特定任務(wù).通過(guò)這種方式,可以在盡可能保留靈活性的情況下,將數(shù)據(jù)庫(kù)存取的工作量降到最低.
JdbcTemplate主要提供以下五類方法:
execute方法:可以用于執(zhí)行任何SQL語(yǔ)句,一般用于執(zhí)行DDL語(yǔ)句;
update方法及batchUpdate方法:update方法用于執(zhí)行新增、修改、刪除等語(yǔ)句;batchUpdate方法用于執(zhí)行批處理相關(guān)語(yǔ)句;
query方法及queryForXXX方法:用于執(zhí)行查詢相關(guān)語(yǔ)句;
call方法:用于執(zhí)行存儲(chǔ)過(guò)程、函數(shù)相關(guān)語(yǔ)句。
使用示例:
在數(shù)據(jù)庫(kù)中先準(zhǔn)備兩張表:
和
在java工程中創(chuàng)建兩個(gè)對(duì)應(yīng)類:
?
[java]?view plain?copy
public?class?Department?{??????int?id;??????String?deptName;??????@Override??????public?String?toString()?{??????????return?"Department?[id="?+?id?+?",?deptName="?+?deptName?+?"]";??????}????????}??
[java]?view plain?copy
public?class?Employee?{??????int?id;??????String?lastName;??????String?email;??????Department?department;??????@Override??????public?String?toString()?{??????????return?"Employee?[id="?+?id?+?",?lastName="?+?lastName?+?",?email="??????????????????+?email?+?",?department="?+?department?+?"]";??????}??????public?int?getId()?{??????????return?id;??????}??????public?void?setId(int?id)?{??????????this.id?=?id;??????}??????public?String?getLastName()?{??????????return?lastName;??????}??????public?void?setLastName(String?lastName)?{??????????this.lastName?=?lastName;??????}??????public?String?getEmail()?{??????????return?email;??????}??????public?void?setEmail(String?email)?{??????????this.email?=?email;??????}??????public?Department?getDepartment()?{??????????return?department;??????}??????public?void?setDepartment(Department?department)?{??????????this.department?=?department;??????}??????????????}??
?
引入Spring框架相關(guān)的jar包以及c3p0和mysql連接jar包。為了對(duì)方法進(jìn)行測(cè)試,這里還需要引入JUnit4.這里以導(dǎo)入外部屬性文件的方式來(lái)配置數(shù)據(jù)源:
?
?
jdbc.properties文件內(nèi)容如下:
?
[plain]?view plain?copy
user=root??password=123??driverClass=com.mysql.jdbc.Driver??jdbcUrl=jdbc:mysql:///spring????initPoolSize=5??maxPoolSize=10??
在xml文件中,導(dǎo)入這個(gè)屬性文件以及配置c3p0數(shù)據(jù)源:
?
?
[html]?view plain?copy
<!--?導(dǎo)入資源文件?-->??<context:property-placeholder?location="classpath:jdbc.properties"/>????<!--?配置?c3p0?數(shù)據(jù)源?-->??<bean?id="dataSource"??????class="com.mchange.v2.c3p0.ComboPooledDataSource">??????<property?name="user"?value="${user}"></property>?????????<property?name="password"?value="${password}"></property>?????????<property?name="jdbcUrl"?value="${jdbcUrl}"></property>???????<property?name="driverClass"?value="${driverClass}"></property>?????????????<property?name="initialPoolSize"?value="${initPoolSize}"></property>??????????<property?name="maxPoolSize"?value="${maxPoolSize}"></property>???</bean>??
配置好dataSource后就可以用這個(gè)數(shù)據(jù)源來(lái)配置JdbcTemplate了,在xml文件中添加:
?
?
[html]?view plain?copy
<!--?配置?spring?的?JdbcTemplate?-->??<bean?id="jdbcTemplate"??????class="org.springframework.jdbc.core.JdbcTemplate">??????<property?name="dataSource"?ref="dataSource"></property>??</bean>??
接下來(lái)創(chuàng)建一個(gè)測(cè)試類對(duì)JdbcTemplate的方法進(jìn)行測(cè)試:
?
?
[java]?view plain?copy
import?java.util.ArrayList;??import?java.util.List;????import?org.junit.Test;??import?org.springframework.context.ApplicationContext;??import?org.springframework.context.support.ClassPathXmlApplicationContext;??import?org.springframework.jdbc.core.BeanPropertyRowMapper;??import?org.springframework.jdbc.core.JdbcTemplate;??import?org.springframework.jdbc.core.RowMapper;????public?class?JDBCTest?{????????????private?ApplicationContext?ctx=?null;??????private?JdbcTemplate?jdbcTemplate?=?null;??//??private?EmployeeDao?employee;????????{??????????ctx?=?new?ClassPathXmlApplicationContext("ApplicationContext.xml");??????????jdbcTemplate?=?(JdbcTemplate)?ctx.getBean("jdbcTemplate");??????}????????/**??????*?執(zhí)行?INSERT,UPDATE,DELETE??????*/??????@Test??????public?void?testUpdate()?{??????????String?sql?=?"UPDATE?employees?SET?last_name?=???WHERE?id?=??";??????????jdbcTemplate.update(sql,?"Jack",?5);??????}??????/**??????*?測(cè)試批量更新操作??????*?最后一個(gè)參數(shù)是?Object[]?的?List?類型:因?yàn)樾薷囊粭l記錄需要一個(gè)?Object?數(shù)組,修改多條記錄就需要一個(gè)?List?來(lái)存放多個(gè)數(shù)組。??????*/??????@Test??????public?void?testBatchUpdate()?{??????????String?sql?=?"INSERT?INTO?employees(last_name,?email,?dept_id)?VALUES(?,?,?)";????????????????????List<Object[]>?batchArgs?=?new?ArrayList<>();????????????????????batchArgs.add(new?Object[]{"AA",?"aa@atguigu.com",?1});??????????batchArgs.add(new?Object[]{"BB",?"bb@atguigu.com",?2});??????????batchArgs.add(new?Object[]{"CC",?"cc@atguigu.com",?3});??????????batchArgs.add(new?Object[]{"DD",?"dd@atguigu.com",?3});??????????batchArgs.add(new?Object[]{"EE",?"ee@atguigu.com",?2});????????????????????jdbcTemplate.batchUpdate(sql,?batchArgs);??????}????????????/**??????*?從數(shù)據(jù)庫(kù)中獲取一條記錄,實(shí)際得到對(duì)應(yīng)的一個(gè)對(duì)象??????*?注意:不是調(diào)用?queryForObject(String?sql,?Class<Employee>?requiredType,?Object...?args)?方法!??????*?而需要調(diào)用?queryForObject(String?sql,?RowMapper<Employee>?rowMapper,?Object...?args)??????*?1、其中的?RowMapper?指定如何去映射結(jié)果集的行,常用的實(shí)現(xiàn)類為?BeanPropertyRowMapper??????*?2、使用?SQL中的列的別名完成列名和類的屬性名的映射,例如?last_name?lastName??????*?3、不支持級(jí)聯(lián)屬性。?JdbcTemplate?只能作為一個(gè)?JDBC?的小工具,?而不是?ORM?框架??????*/??????@Test??????public?void?testQueryForObject()?{??????????String?sql?=?"SELECT?id,?last_name?lastName,email,dept_id?as?\"department.id\"?FROM?employees?WHERE?ID?=??";??????????RowMapper<Employee>?rowMapper?=?new?BeanPropertyRowMapper<>(Employee.class);??????????//在將數(shù)據(jù)裝入對(duì)象時(shí)需要調(diào)用set方法。??????????Employee?employee?=?jdbcTemplate.queryForObject(sql,?rowMapper,?1);????????????????????System.out.println(employee);??????}????????????/**??????*?一次查詢多個(gè)對(duì)象??????*?注意:調(diào)用的不是?queryForList?方法??????*/??????@Test??????public?void?testQueryForList()?{??????????String?sql?=?"SELECT?id,?last_name?lastName,?email?FROM?employees?WHERE?id?>??";??????????RowMapper<Employee>?rowMapper?=?new?BeanPropertyRowMapper<>(Employee.class);??????????List<Employee>?employees?=?jdbcTemplate.query(sql,?rowMapper,5);????????????????????System.out.println(employees);??????}??????/**??????*?獲取單個(gè)列的值或做統(tǒng)計(jì)查詢??????*?使用?queryForObject(String?sql,?Class<Long>?requiredType)???????*/??????@Test??????public?void?testQueryForObject2()?{??????????String?sql?=?"SELECT?count(id)?FROM?employees";??????????long?count?=?jdbcTemplate.queryForObject(sql,?Long.class);????????????????????System.out.println(count);??????}?????}??
在實(shí)際的使用中,一般會(huì)創(chuàng)建一個(gè)dao類來(lái)封裝對(duì)某個(gè)對(duì)象的所有增刪改查操作.
?
比如,創(chuàng)建一個(gè)EmployeeDao類如下:
?
[java]?view plain?copy
import?org.springframework.beans.factory.annotation.Autowired;??import?org.springframework.jdbc.core.BeanPropertyRowMapper;??import?org.springframework.jdbc.core.JdbcTemplate;??import?org.springframework.jdbc.core.RowMapper;??import?org.springframework.stereotype.Repository;????@Repository??public?class?EmployeeDao?{??????@Autowired??????private?JdbcTemplate?jdbcTemplate;????????????public?Employee?get(Integer?id)?{??????????String?sql?=?"SELECT?id,?last_name?lastName,?email?FROM?employees?WHERE?id?=??";??????????RowMapper<Employee>?rowMapper?=?new?BeanPropertyRowMapper<>(Employee.class);??????????Employee?employee?=?jdbcTemplate.queryForObject(sql,?rowMapper,?id);????????????????????return?employee;??????}??}??
在這個(gè)Dao類中實(shí)現(xiàn)了通過(guò)id來(lái)獲取記錄并封裝成對(duì)象返回的方法。如果有需要還可以實(shí)現(xiàn)其他操作如插入、刪除、更新等。
?
由于這里使用了注解來(lái)配置bean以及bean的自動(dòng)裝配,所以還需要在xml文件中添加(要先導(dǎo)入context命名空間):
?
[html]?view plain?copy
<context:component-scan?base-package="com.atguigu.spring.jdbc"></context:component-scan>??
測(cè)試一下EmployeeDao:
?
?
[java]?view plain?copy
@Test??public?void?testEmployeeDao()?{??????EmployeeDao?employeeDao?=?(EmployeeDao)?ctx.getBean("employeeDao");??????Employee?employee?=?employeeDao.get(1);??????System.out.println(employee);??}??
打印輸出如下:
?
總結(jié):JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫(kù)的操作更加方便、友好,效率也不錯(cuò)。但是功能還是不夠強(qiáng)大(比如不支持級(jí)聯(lián)屬性),在實(shí)際應(yīng)用中還需要和hibernate、mybaties等框架混合使用。
?
總結(jié)
以上是生活随笔為你收集整理的Spring-jdbc:JdbcTemplate使用简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。