摘要:我們?cè)谧铋_(kāi)始使用進(jìn)行查詢時(shí),是這樣做的?;叵胛覀兪褂玫闹苯訒?huì)返回了對(duì)象。在很多框架中反射使用的很頻繁。反射的應(yīng)用場(chǎng)景在中,當(dāng)時(shí)實(shí)例一個(gè)對(duì)象的時(shí)候,對(duì)象點(diǎn)號(hào)的時(shí)候,你能獲取到對(duì)象的方法和屬性??纯丛趺葱薷模軌蚴共樵兏咏?。
在后端開(kāi)發(fā)中,我們經(jīng)常和數(shù)據(jù)庫(kù)打交道。從最開(kāi)始的使用jdbc進(jìn)化到框架(mybatis)我們的開(kāi)發(fā)效率提升了很多,但是不知道你沒(méi)有思考過(guò)框架是如何在日常的開(kāi)發(fā)中幫助我們的?
在我之前的博客中,討論過(guò) 從jdbc進(jìn)化到mybatis,但是那個(gè)只是一個(gè)簡(jiǎn)單的介紹,今天我們來(lái)討論,那篇博客中的第五條: 處理結(jié)果。
我們?cè)谧铋_(kāi)始使用jdbc進(jìn)行查詢時(shí),是這樣做的。
public class User{ private string name; private string password; private string address; //省略 set和get方法 }
public User query(){ Class.ForName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection con = DriverManager.getConnection("url","username","password"); Statement sta = con.createStatement(); ResultSet rs = sta.executeQuery("sql"); User user = new User(); while(rs.next){ user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setAddress(rs.getString("address")); } con.close(); return user; }
以上,是我們最開(kāi)始接觸jdbc時(shí),查詢出的user。 但是我們能夠發(fā)現(xiàn),如果是一個(gè)示例代碼,還能給新手簡(jiǎn)單介紹下查詢數(shù)據(jù)庫(kù),但是要是應(yīng)用到實(shí)際的項(xiàng)目中,我們需要不停的重復(fù)上面的代碼來(lái)適應(yīng)不同的對(duì)象。
這樣的代碼沒(méi)有健壯性可言。回想我們使用的mybatis直接會(huì)返回了對(duì)象。 是怎么做到的呢?
現(xiàn)在思考,我們?cè)鯓有薷纳厦娴拇a,能使它可以返回一個(gè)對(duì)象。
我們的方法首先需要知道,返回具體那個(gè)對(duì)象,那么我們需要把這個(gè)對(duì)象信息通過(guò)參數(shù)傳遞進(jìn)來(lái),但是我們不知道,傳進(jìn)來(lái)的參數(shù)有哪些屬性,怎么辦? 這個(gè)時(shí)候,回想一下,之前有沒(méi)有聽(tīng)說(shuō)過(guò) 反射,可以動(dòng)態(tài)獲取對(duì)象的信息。 在很多框架中 反射使用的很頻繁。
不知道也不要緊,現(xiàn)在我們簡(jiǎn)單看看 反射:
java反射的主要作用是獲取程序在運(yùn)行時(shí)刻的內(nèi)部結(jié)構(gòu)。
其實(shí)你經(jīng)常和反射打交道。
反射的應(yīng)用場(chǎng)景: 1. 在ide中,當(dāng)時(shí)實(shí)例一個(gè)對(duì)象的時(shí)候, 對(duì)象+點(diǎn)號(hào)(user. )的時(shí)候,你能獲取到對(duì)象的方法和屬性。 2. debugger 現(xiàn)在你只要知道反射能夠獲取到對(duì)象的內(nèi)部信息就 ok了。
看看怎么修改,能夠使 查詢更加健壯。
publicT queryTableTwo(String sql, Class c) throws Exception { @SuppressWarnings("unchecked") T result = (T) c.newInstance(); Field[] fields = c.getDeclaredFields(); String driveName = "drivename"; String dbURL = "url"; String userName = "username"; String passWord = "password"; ResultSet rs = null; try { Class.forName(driveName); Connection con = DriverManager.getConnection(dbURL, userName, passWord); Statement sta = con.createStatement(); rs = sta.executeQuery(sql); while (rs.next()) { for (Field f : fields) { String name = f.toString().substring(f.toString().lastIndexOf(".") + 1); // 取出屬性名稱 Field field = c.getDeclaredField(name); field.setAccessible(true); String queryResult = rs.getString(name); field.set(result, queryResult); } } con.close(); } catch (Exception e) { e.printStackTrace(); } return result; }
關(guān)注我的公眾號(hào)第一時(shí)間閱讀有趣的技術(shù)故事
掃碼關(guān)注:
也可以在微信搜索公眾號(hào)即可關(guān)注我:codexiulian
渴望與你一起成長(zhǎng)進(jìn)步!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/76854.html
摘要:這個(gè)文件包含對(duì)對(duì)數(shù)據(jù)訪問(wèn)進(jìn)行封裝的所有類。為等提供的一致的聲明式和編程式事務(wù)管理。 SSM 環(huán)境搭建 目錄創(chuàng)建 pom.xml SSM 逐層配置 一、目錄 1.1 src/main/java 目錄下的包(以下包要放在項(xiàng)目包下,如:com.imooc.項(xiàng)目名) entity: 存放實(shí)體類 web: 存放controller,相當(dāng)于Struts中的action service: 業(yè)務(wù)...
摘要:是訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)規(guī)范提供了一種基準(zhǔn)據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。在將此值發(fā)送到數(shù)據(jù)庫(kù)時(shí),驅(qū)動(dòng)程序?qū)⑺D(zhuǎn)換成一個(gè)類型值。 1.JDBC概念和數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 A: JDBC概述 JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),...
摘要:是訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)規(guī)范提供了一種基準(zhǔn)據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。在將此值發(fā)送到數(shù)據(jù)庫(kù)時(shí),驅(qū)動(dòng)程序?qū)⑺D(zhuǎn)換成一個(gè)類型值。例如值不支持中文,如果需要使用非英文字符,將進(jìn)行轉(zhuǎn)換。 01JDBC概念和數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 * A: JDBC概念和數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 * a: JDBC概述 * JDBC(Java Data...
閱讀 3331·2021-11-23 10:02
閱讀 3262·2021-11-16 11:53
閱讀 3285·2021-09-23 11:21
閱讀 3511·2019-08-30 13:02
閱讀 1765·2019-08-29 16:18
閱讀 1697·2019-08-29 12:55
閱讀 1611·2019-08-26 12:24
閱讀 2251·2019-08-26 10:36