Spring之JDBCTemplate

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

一、Spring對不同的持久化支持:

Spring為各種支持的持久化技術,都提供了簡單操作的模板和回調

ORM持久化技術模板類
JDBCorg.springframework.jdbc.core.JdbcTemplate
Hibernate5.0org.springframework.orm.hibernate5.HibernateTemplate
IBatis(MyBatis)org.springframework.orm.ibatis.SqlMapClientTemplate
JPAorg.springfrmaework.orm.jpa.JpaTemplate

其實Spring的JDBCTemplate有點像DBUtils,但是有時候還沒有DBUitls好用。這里來學習一下使用Spring的JDBCTemplate來玩一下CRUD。

二、使用JdbcTemplate需要的jar包

在這里使用Spring的JDBCTemplate的時候先要把輪子拿過來:

image

除此之外,在Java中操作數據庫怎么能不要對應的驅動包呢:

image

三、JdbcTemplate使用的基本步驟

然后再看看Spring的JDBCTemplate的使用大體步驟,這里有一個小例子:

復制代碼
  1 package com.spring.test;2 3 import org.junit.Test;4 import org.springframework.jdbc.core.JdbcTemplate;5 import org.springframework.jdbc.datasource.DriverManagerDataSource;6 7 public class TestJDBCTemplate {8 9     @Test10     public void test1() {11 12         // JDBC模板依賴于連接池來獲得數據的連接,所以必須先要構造連接池13         DriverManagerDataSource dataSource = new DriverManagerDataSource();14         dataSource.setDriverClassName("com.mysql.jdbc.Driver");15         dataSource.setUrl("jdbc:mysql://localhost:3306/spring");16         dataSource.setUsername("root");17         dataSource.setPassword("123456");18 19         // 創建JDBC模板20         JdbcTemplate jdbcTemplate = new JdbcTemplate();21         // 這里也可以使用構造方法22         jdbcTemplate.setDataSource(dataSource);23 24         // sql語句25         String sql = "select count(*)  from user";26         Long num = (long) jdbcTemplate.queryForObject(sql, Long.class);27 28         System.out.println(num);29 30     }31 32 }
復制代碼

四、進一步的考慮

其實這個例子本身沒有什么的,只是演示了一下,其實在學Spring之后,感覺應該形成一種習慣,在new對象的時候我要想到IOC,在使用Set方法的時候,我要想到DI,再去要方便面(哦,不,是切面),我們應該想到用AOP的。這里可以在Spring中配置如下的引用鏈:

1. 我要有DataSource,DataSource的屬性可以通過注入數據庫的一些配置屬性添加

2. 我要有JdbcTemplate,而Template依賴與DataSource,我要以ref的方式為我的JdbcTemplate注入引用

3. 有了JdbcTemplate之后,我要有Dao,此時我應該在Dao添加一個JdbcTemplate的成員,然后以ref的方式將JdbcTemplate引入到Dao中

4. 我在Action或者是Servlet中都會調用的是Serivce,所以,我在Serivce中要添加一個Dao作為成員,然后由ref在注入Dao到Service中

DataSource --> JdbcTemplate --> Dao --> Service --> Action/Servlet

"-->"表示將左邊的對象注入到右邊的對象當中

配置文件如下:

復制代碼
  1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="http://www.springframework.org/schema/beans"3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4     xmlns:context="http://www.springframework.org/schema/context"5     xmlns:aop="http://www.springframework.org/schema/aop"6     xmlns:tx="http://www.springframework.org/schema/tx"7     xsi:schemaLocation="http://www.springframework.org/schema/beans8     http://www.springframework.org/schema/beans/spring-beans.xsd9     http://www.springframework.org/schema/context10     http://www.springframework.org/schema/context/spring-context.xsd11     http://www.springframework.org/schema/aop12     http://www.springframework.org/schema/aop/spring-aop.xsd13     http://www.springframework.org/schema/tx14     http://www.springframework.org/schema/tx/spring-tx.xsd">15 16     <!-- IOC和DI的注解掃描 -->17     <context:component-scan base-package="com.spring" ></context:component-scan>18 19     <!-- 打開AOP的注解 -->20     <!-- 這里用的是中間的橫線而不是下劃線 -->21     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>22 23     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >24         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_03"></property>25         <property name="driverClass" value="com.mysql.jdbc.Driver"></property>26         <property name="user" value="root"></property>27         <property name="password" value="123456"></property>28     </bean>29 30     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">31         <property name="dataSource" ref="dataSource"></property>32     </bean>33 34     <bean id="userDao" class="com.spring.dao.UserDao">35         <property name="jdbcTemplate" ref="jdbcTemplate"></property>36     </bean>37 38     <bean id="userService" class="com.spring.service.UserService">39         <property name="userDao" ref="userDao"></property>40     </bean>41 42 </beans>
復制代碼

其中dataSource和jdbcTemplate都是直接配置的,不用寫啥。

然后是UserDao.java

復制代碼
  1 package com.spring.dao;2 3 import org.springframework.jdbc.core.JdbcTemplate;4 5 import com.spring.domain.User;6 7 public class UserDao {8 9     private JdbcTemplate jdbcTemplate;10 11     public JdbcTemplate getJdbcTemplate() {12         return jdbcTemplate;13     }14 15     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {16         this.jdbcTemplate = jdbcTemplate;17     }18 19     public void addUser(User user) {20 21         String sql = "insert into user (username, password) values (?, ?)";22 23         jdbcTemplate.update(sql, user.getUsername(), user.getPassword());24 25     }26 27 }
復制代碼

UserSerice.java

復制代碼
  1 package com.spring.service;2 3 import com.spring.dao.UserDao;4 import com.spring.domain.User;5 6 public class UserService {7 8     // 加入userDao作為成員變變量9     private UserDao userDao;10 11     // 注意這里要增加get和set方法12     public UserDao getUserDao() {13         return userDao;14     }15 16     public void setUserDao(UserDao userDao) {17         this.userDao = userDao;18     }19 20     public void addUser(User user) {21         userDao.addUser(user);22     }23 }
復制代碼

上面的文件都是用的配置文件來獲得對象的,而沒有使用注解。

測試類:

復制代碼
  1 package com.spring.test;2 3 import org.junit.Test;4 import org.springframework.context.ApplicationContext;5 import org.springframework.context.support.ClassPathXmlApplicationContext;6 import com.spring.domain.User;7 import com.spring.service.UserService;8 9 public class TestJDBCTemplate {10 11     @Test12     public void test2() {13 14         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");15         UserService userService = (UserService) ctx.getBean("userService");16 17         User user = new User();18         user.setPassword("111");19         user.setUsername("小王");20 21         userService.addUser(user);22 23     }24 25 }
復制代碼

哦,對了其中配置的數據源是C3P0的數據源,還要導入C3P0的包:

image

五、JdbcTemplate的CRUD方法

1. 插入數據

復制代碼
  1 public void addUser(User user) {2 3     String sql = "insert into user (username, password) values (?, ?)";4 5     jdbcTemplate.update(sql, user.getUsername(), user.getPassword());6 7 }
復制代碼

如上,插入代碼用的是update方法,其實增刪改用的都是update方法,而查詢則是和query相關的方法。

2. 刪除操作

  1 public void deleteUser( ) {2     String sql = "delete from user where username= ?";3     jdbcTemplate.update(sql, "小王");4 }

3. 修改操作

  1 public void updateUser(User user) {2     String sql = "update user set username=? where username= ?";3     jdbcTemplate.update(sql,  user.getUsername() + "_new", user.getUsername());4 }

4. 查詢操作

上面三個都比較簡單,查詢倒是有些復雜。在使用比較基礎的持久化工具的時候,比如DBUtils都會針對查詢結果給我們提供一些封裝的接口和類,但是JdbcTemplate只給我們提供了接口,并沒有可用的類,所以我們需要自己寫實現類來進行封裝。這里會學習使用JdbcTemplate進行三種查詢操作:

4.a. 查詢表的記錄數

image

復制代碼
  1 @Test2 public void test5() {3     ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");4     JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");5     String sql = "select count(*) from user";6     Long row = jdbcTemplate.queryForObject(sql, Long.class);7     System.out.println("查詢出來的記錄數為:" + row);8 }
復制代碼

4.b. 查詢返回對象

image

復制代碼
  1 @Test2 public void test6() {3     // 獲得jdbcTemplate對象4     ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");5     JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");6     String sql = "select username, password from user where username = ?";7     // 設定參數8     Object[] object = {"mary_new"};9     // 進行查詢10     User user = jdbcTemplate.queryForObject(sql, object,  new UserMapper());11     System.out.println(user);12 }
復制代碼

除此之外要實現結構RowMapper來新建一個映射類:

復制代碼
  1 package com.spring.test;2 3 import java.sql.ResultSet;4 import java.sql.SQLException;5 6 import org.springframework.jdbc.core.RowMapper;7 8 import com.spring.domain.User;9 10 public class UserMapper implements RowMapper<User>{11 12     @Override13     public User mapRow(ResultSet resultSet, int rows) throws SQLException {14         User user = new User();15         user.setUsername(resultSet.getString(1));16         user.setPassword(resultSet.getString(2));17 18         return user;19     }20 21 }
復制代碼

要注意這個UserMapper.java應該要和具體的Sql語句對應。

4.c. 查詢并返回List集合

image

復制代碼
  1 @Test2 public void test7() {3     // 獲得jdbcTemplate對象4     ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");5     JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");6 7     // sql語句8     String sql = "select * from user";9     List<User> users = jdbcTemplate.query(sql, new UserMapper());10 11     for(User u: users) {12         System.out.println(u);13     }14 }
復制代碼

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450020.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450020.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450020.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從螞蟻金服實踐入手,帶你深入了解 Service Mesh

本文整理自螞蟻金服高級技術專家敖小劍在 QCon 上海 2018 上的演講。我是來自螞蟻金服中間件團隊的敖小劍&#xff0c;目前是螞蟻金服 Service Mesh 項目的 PD。我同時也是 Servicemesher 中國技術社區的創始人&#xff0c;是 Service Mesh 技術在國內最早的布道師。我今天給大…

Android應用開發—FragmentManager如何管理fragments

本文主要摘錄自Android中使用FragmentManager管理fragments 和 淺談FragmentManager與fragment之一二事 先講下自己對fragment的理解&#xff1a; 對于fragment&#xff0c;有太多官方文檔和博文來介紹&#xff0c;此處不做轉述&#xff1a;我感覺android提供fragment這種組件…

數組指針 和 指針數組

最近發現公司有些人說怎樣區分 數組指針 和 指針數組 &#xff1f; 其實 很簡單&#xff1b; 數組指針&#xff0c; 先是&#xff08;定語 &#xff09; &#xff08;主體&#xff09;&#xff0c; &#xff08;定語 數組&#xff09; &#xff08;主體 指針&#xff09…

在云服務器上注意GeoServer和ShadowDataMap的跨域設置

在云服務器上注意GeoServer和ShadowDataMap的跨域設置 1、對于支持cors的網絡資源 可以在ShadowDataMap的devserverconfig.json里設置相應的跨域資源 提示&#xff1a;geoserver發布的地圖服務雖然同在一個服務器上&#xff0c;但是端口不一樣&#xff0c;同樣需要設置跨域 如&…

Guava ImmutableCollection簡介

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ImmutableCollection代碼定義 GwtCompatible(emulatedtrue) public abstract class ImmutableCollection<E> extends AbstractCo…

Todo List

fragment里面如何處理back按鍵事件。 fragment里面無法Override onBackPressed接口&#xff0c;如何優雅的處理back press事件&#xff1f;activity如何獲取當前活躍的fragment對象。異步網絡請求如何改造成rxjava&#xff0c;rxjava有設置運行線程的能力&#xff0c;異步請求…

常見的幾種負載均衡算法

1、輪詢將所有請求&#xff0c;依次分發到每臺服務器上&#xff0c;適合服務器硬件相同的場景。優點&#xff1a;服務器請求數目相同&#xff1b; 缺點&#xff1a;服務器壓力不一樣&#xff0c;不適合服務器配置不同的情況&#xff1b; 2、隨機請求隨機分配到各臺服務器上。優…

基于 Token 的身份驗證方法

基于 Token 的身份驗證方法 使用基于 Token 的身份驗證方法&#xff0c;在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的&#xff1a;客戶端使用用戶名跟密碼請求登錄 服務端收到請求&#xff0c;去驗證用戶名與密碼 驗證成功后&#xff0c;服務端會簽發一個 Token&…

Android應用開發-圖片加載庫Glide

Glide Picasso和Glide之間的區別&#xff1a; Picasso 僅僅緩存了全尺寸的圖像&#xff1b;然而 Glide 緩存了原始圖像&#xff0c;全分辨率圖像和另外小版本的圖像。

excel 表格導入 - java 實現

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; imp…

C語言 API

MySQL的C語言API接口 1、首先當然是連接數據庫&#xff0c;函數原型如下&#xff1a; MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned…

線程組之間的JMeter傳遞變量

下面&#xff0c;我們將看看如何在線程組之間共享和傳遞變量。在開發高級JMeter腳本時&#xff0c;很可能您將擁有多個線程組。每個線程組將執行不同的請求。一個很好的例子是我們需要使用Bearer Tokens對用戶進行身份驗證。一個線程組執行身份驗證并保存令牌。另一個線程組需要…

python第九天(9-33)

一&#xff1a;進程 進程概念 進程就是一個程序運行在一個數據集上的一次動態執行過程進程一般由程序&#xff0c;數據集&#xff0c;進程控制塊組成進程控制塊&#xff1a; 進程控制塊用來記錄進程的外部特征&#xff0c;描述進程的執行變化過程&#xff0c;系統可以利用它來控…

Android Studio出現Failed to open zip file. Gradle's dependency cache may be corrupt問題的解決

刪除了/Users/tycao/.gradle/wrapper/dists目錄下對應的gradle-X.X-all目錄重新sync了

雙機熱備份和負載均衡的區別

1、雙機熱備相當于2臺服務器其中有一臺是另一臺的備機&#xff0c;也可以互為備機&#xff1b;而且這兩臺主機的數據時實時同步的&#xff1b;主機在運行服務時&#xff0c;備機處于檢測狀態&#xff0c;主機發生故障后&#xff0c;備機將接管主機的服務。2、負載均衡是在這2臺…

Python 數據類型--Bytes類型

一、Bytes類型 在Python3以后&#xff0c;字符串和bytes類型徹底分開了。字符串是以字符為單位進行處理的&#xff0c;bytes類型是以字節為單位處理的。 bytes數據類型在所有的操作和使用甚至內置方法上和字符串數據類型基本一樣&#xff0c;也是不可變的序列對象。 bytes對象只…

Android應用開發-onNewIntent()

轉載自Android中 activity 的onNewIntent函數

文件結構

C語言文件名命名的規則 1、文件標識符分為兩部分&#xff0c;即文件名前綴和后綴。文件名前綴的最前面要使用范圍限定符——模塊名&#xff08;文件名&#xff09;縮寫。 2、采用小寫字母命名文件&#xff0c;避免使用一些比較通俗的文件名&#xff0c;如&#xff1a;publi…

POJ 1187 隕石的秘密 (線性DP)

題意&#xff1a; 公元11380年&#xff0c;一顆巨大的隕石墜落在南極。于是&#xff0c;災難降臨了&#xff0c;地球上出現了一系列反常的現象。當人們焦急萬分的時候&#xff0c;一支中國科學家組成的南極考察隊趕到了出事地點。經過一番偵察&#xff0c;科學家們發現隕石上刻…

bzoj2561 最小生成樹

題意&#xff1a;給你無向圖&#xff0c;給定一條邊&#xff0c;求至少在原圖中刪去多少邊才能使它同時在某個最大生成樹和某個最小生成樹中。 解&#xff1a; 假裝我們把邊排序了&#xff0c;然后把所有邊權小于給定邊的邊都加進去了。 那么我們要刪的就是s到t的一個割。 最大…