freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

圖書進(jìn)存銷系統(tǒng)(編輯修改稿)

2024-08-30 11:13 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 lic class BookInRecord extends ValueObject { private String BOOK_ID_FK。 //對(duì)應(yīng)書的外鍵, 從數(shù)據(jù)庫(kù)查出來(lái)時(shí)有值 private String T_IN_RECORD_ID_FK。 //對(duì)應(yīng)銷售記錄外鍵 private String IN_SUM。 //入庫(kù)數(shù)量 //省略setter和getter方法}銷售記錄類SaleRecord,代碼清單:code\book\src\org\crazyit\book\vo\public class SaleRecord extends ValueObject { private String RECORD_DATE。 //交易日期 //省略setter和getter方法}書的銷售記錄類BookSaleRecord。代碼清單:code\book\src\org\crazyit\book\vo\public class BookSaleRecord extends ValueObject { private String BOOK_ID_FK。 //該記錄對(duì)應(yīng)的書的外鍵 private String T_SALE_RECORD_ID_FK。 //該記錄對(duì)應(yīng)的銷售記錄的外鍵 private String TRADE_SUM。 //該記錄所對(duì)應(yīng)的書的銷售數(shù)量 //省略setter和getter方法}到現(xiàn)在,與系統(tǒng)相關(guān)的各個(gè)表所對(duì)應(yīng)的類都已經(jīng)編寫好了,下面小節(jié),我們將講解這些建立好的類在開發(fā)過(guò)程中所體現(xiàn)的作用。 編寫配置讀取類由于本章涉及到數(shù)據(jù)庫(kù)操作,因此與數(shù)據(jù)庫(kù)相關(guān)的一些配置,例如對(duì)應(yīng)數(shù)據(jù)庫(kù)的相關(guān)驅(qū)動(dòng)、數(shù)據(jù)庫(kù)地址、用戶名和密碼,我們可以放到配置文件中,如果需要更換數(shù)據(jù)庫(kù)或者地址,只需要修改這份配置文件即可。,內(nèi)容如下://JDBC驅(qū)動(dòng)=//連接地址=jdbc:mysql://localhost:3306/book_system//數(shù)據(jù)庫(kù)用戶名=book//密碼=book建立好該文件后,再編寫類去讀取該文件,獲得所需要的值即可。用于讀取配置的PropertiesUtil類,代碼如下。代碼清單:code\book\src\org\crazyit\book\jdbc\public class PropertiesUtil { private static Properties properties = new Properties()。//該記錄所對(duì)應(yīng)的書的銷售數(shù)量 private static String CONFIG = /cfg/。//配置文件的路徑 //讀取資源文件, 設(shè)置輸入流 private static InputStream is = (CONFIG)。 public static String JDBC_DRIVER。 //數(shù)據(jù)庫(kù)驅(qū)動(dòng) public static String JDBC_URL。 //jdbc連接url public static String JDBC_USER。 //數(shù)據(jù)庫(kù)用戶名 public static String JDBC_PASS。 //數(shù)據(jù)庫(kù)密碼 static { (is)。 //加載輸入流 //獲得配置的各個(gè)屬性 JDBC_DRIVER = ()。 JDBC_URL = ()。 JDBC_USER = ()。 JDBC_PASS = ()。 }}讀取的各個(gè)配置的作用。 編寫JDBC操作類JDBC是Java Data Base Connectivity的簡(jiǎn)稱,是Java中進(jìn)行數(shù)據(jù)庫(kù)連接的技術(shù)。JDBC的API提供了標(biāo)準(zhǔn)統(tǒng)一的SQL數(shù)據(jù)存取接口,可以讓程序員不需要關(guān)心如何去連接不同的數(shù)據(jù)庫(kù),只需為不同的數(shù)據(jù)庫(kù)提供不同的驅(qū)動(dòng),就可以達(dá)到連接不同數(shù)據(jù)庫(kù)的要求。,我們已經(jīng)提供了配置,可以修改對(duì)應(yīng)的配置文件來(lái)連接數(shù)據(jù)庫(kù),就是數(shù)據(jù)庫(kù)的連接驅(qū)動(dòng),在本例中我們使用了MySQL數(shù)據(jù)庫(kù),因此需要提供MySQL的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包。,如果需要最新的驅(qū)動(dòng)程序,請(qǐng)到,下載后將驅(qū)動(dòng)包加到環(huán)境變量中。除了配置驅(qū)動(dòng)外,還需要配置數(shù)據(jù)庫(kù)的連接地址、用戶名和密碼,=jdbc:mysql://服務(wù)器ip:3306/book_system,用戶名密碼為你的MySQL用戶密碼。配置好了之后,我們可以開始著手編寫數(shù)據(jù)庫(kù)的操作類,但在那之前,我們需要明確這個(gè)類幫我做些什么。首先肯定是幫我們進(jìn)行數(shù)據(jù)庫(kù)連接,我們之前配置了連接的相關(guān)屬性,但是程序并不知道我們需要怎樣去連接,接著我們需要這個(gè)類幫我們提供查詢、執(zhí)行SQL等功能。確定好目標(biāo)后,開始編寫。新建JDBCExecutor類,該類具有屬性如下: private static String DRIVER = 。 //獲得驅(qū)動(dòng) private static String URL = 。 //獲得url private static String USER = 。 //獲得連接數(shù)據(jù)庫(kù)的用戶名 private static String PASS = 。 //獲得連接數(shù)據(jù)庫(kù)的密碼 private Connection connection。 //連接對(duì)象 private static JDBCExecutor jdbcExecutor。 //維護(hù)一個(gè)本類型的對(duì)象 private Statement stmt。 //維護(hù)一個(gè)本類型的對(duì)象注:以上代碼的黑體部分,由于創(chuàng)建一個(gè)Connection對(duì)象需要耗費(fèi)很大的資源,因此我們使用單態(tài)模式,讓JDBCExecutor類維護(hù)一個(gè)JDBCExecutor對(duì)象,可以在構(gòu)造器中創(chuàng)建Connection,由于JDBCExecutor是單態(tài)的,因此可以保證在應(yīng)用中只創(chuàng)建一個(gè)Connection,單態(tài)模式將在下一小節(jié)中詳細(xì)講述。下面在JDBCExecutor的構(gòu)造器中創(chuàng)建各個(gè)對(duì)象,再提供一個(gè)方法返回JDBCExecutor的實(shí)例。代碼清單:code\book\src\org\crazyit\book\jdbc\ //私有構(gòu)造器 private JDBCExecutor() { //初始化JDBC驅(qū)動(dòng)并讓驅(qū)動(dòng)加載到j(luò)vm中 (DRIVER)。 //創(chuàng)建數(shù)據(jù)庫(kù)連接 connection = (URL, USER, PASS)。 //創(chuàng)建Statement對(duì)象 stmt = ()。 } //提供一個(gè)靜態(tài)方法返回本類的實(shí)例 public static JDBCExecutor getJDBCExecutor() { //如果本類所維護(hù)jdbcExecutor屬性為空,則調(diào)用私有的構(gòu)造器獲得實(shí)例 if (jdbcExecutor == null) jdbcExecutor = new JDBCExecutor()。 return jdbcExecutor。 }注:在以上代碼中,提供了一個(gè)JDBCExecutor的私有構(gòu)造器,因?yàn)樾枰3诌@個(gè)類只創(chuàng)建一次,因此不可提供public的構(gòu)造器讓其他類去創(chuàng)建JDBCExecutor的實(shí)例,外界只能通過(guò)它自己內(nèi)部的一個(gè)靜態(tài)方法創(chuàng)建JDBCExecutor實(shí)例。編寫執(zhí)行查詢的方法,代碼清單:code\book\src\org\crazyit\book\jdbc\ //執(zhí)行一句查詢的sql, 并返回ResultSet對(duì)象 public ResultSet executeQuery(String sql) { //利用Statement對(duì)象執(zhí)行參數(shù)的sql ResultSet result = (sql)。 return result。 }在上面的代碼中,并沒有關(guān)閉ResultSet的代碼,直接返回ResultSet對(duì)象,我們還需要對(duì)ResultSet對(duì)象進(jìn)行一些處理,因此在這里不進(jìn)行關(guān)閉操作,該方法只是簡(jiǎn)單的進(jìn)行查詢。編寫執(zhí)行SQL的方法,代碼清單:code\book\src\org\crazyit\book\jdbc\ //執(zhí)行單句INSERT、UPDATE 或 DELETE 語(yǔ)句, 如果執(zhí)行INSERT時(shí), 返回主鍵 public int executeUpdate(String sql) { int result = 1。 //執(zhí)行SQL語(yǔ)句 (sql)。 //獲得主鍵 ResultSet rs = ()。 while(()) result = (1)。 //返回最后一個(gè)主鍵 ()。 return result。 }在以上代碼中,將會(huì)返回執(zhí)行該句SQL所產(chǎn)生的主鍵。到這里,我們的JDBCExecutor類已經(jīng)編寫完了。 創(chuàng)建數(shù)據(jù)轉(zhuǎn)換工具類,JDBCExecutor中提供了一個(gè)executeQuery方法,該方法返回ResultSet對(duì)象,當(dāng)時(shí)我們并沒有關(guān)閉ResultSet,這是由于我們需要對(duì)該結(jié)果集進(jìn)行一些封裝。在本小節(jié)中將建立一個(gè)工具類,進(jìn)該結(jié)果集進(jìn)行封裝,并返回對(duì)應(yīng)的集合。,我們?cè)O(shè)計(jì)了各個(gè)表所對(duì)應(yīng)的類,那么在封裝的過(guò)程中,將結(jié)果集(ResultSet)中的某個(gè)值作為這些類(表對(duì)象)的屬性,并負(fù)責(zé)創(chuàng)建這些對(duì)象,放到集合中去。新建DataUtil類,具體的代碼如下。代碼清單:code\book\src\org\crazyit\book\mons\ //將rs中的值封裝成一個(gè)集合 public static Collection getDatas(Collection result, ResultSet rs, Class clazz) { while (()) { //創(chuàng)建類的實(shí)例 Object vo = ()。 //獲取本對(duì)象的屬性 Field[] fields = ()。 //獲取父類的屬性 Field[] superFields = ().getDeclaredFields()。 //父類的屬性和自己的屬性相加 Field[] allFields = addFields(superFields, fields)。 //遍歷所有的屬性 for (Field field : allFields) { //獲得setter方法的方法名 String setterMethodName = getSetterMethodName(())。 //獲得setter方法 Method setterMethod = (setterMethodName, ())。 invokeMethod(rs, field, vo, setterMethod)。 } (vo)。 } ()。 return result。 } //執(zhí)行一個(gè)方法, 從ResultSet中獲取一個(gè)字段的數(shù)據(jù), 調(diào)用vo的setter方法 private static void invokeMethod(ResultSet rs, Field field, Object vo, Method setterMethod) { //當(dāng)使用ResultSet獲取某個(gè)字段的時(shí)候, 如果沒有該字段, 會(huì)出現(xiàn)SQLException, 在這里忽略該異常 String value = (())。 //從ResultSet中獲取與該對(duì)象屬性名一致的字段, 并執(zhí)行setter方法 (vo, value)。 } //根據(jù)屬性名獲得setter方法的方法名 private static String getSetterMethodName(String fieldName) { String begin = (0, 1).toUpperCase()。 String end = (1, ())。 String methodName = set + begin + end。 return methodName。 } //相加兩個(gè)數(shù)組 private static Field[] addFields(Field[] f1, Field[] f2) { ListField l = new ArrayListField()。 for (Field f : f1) (f)。 for (Field f : f2) (f)。 return (new Field[ + ])。 }注意以上代碼的黑體部分,先使用class的newInstance方法創(chuàng)建類的實(shí)例,再獲得父類和本類的屬性,再通過(guò)setter方法將ResultSet中對(duì)應(yīng)的值設(shè)置到對(duì)象中。,約定了各個(gè)類的屬性命名都需要與數(shù)據(jù)庫(kù)中的表字段一致,在這里,我們很容易就可以得到某個(gè)字段的setter方法,并可以根據(jù)類的屬性名稱得到ResultSet中對(duì)應(yīng)的字段值。在本例中,父類就是ValueObject,ValueObject中有一個(gè)ID屬性,就對(duì)應(yīng)了各個(gè)表中的ID字段。ValueObject下面的各個(gè)子類的class都可以作為getDatas的clazz參數(shù)傳入,從而創(chuàng)建傳入類的對(duì)象。簡(jiǎn)單的說(shuō),DataUtil就是根據(jù)ResultSet來(lái)創(chuàng)建ValueObject的集合,當(dāng)創(chuàng)建完后,就需要在這里關(guān)閉ResultSet對(duì)象。這也是為什么在JDBCExecutor不需要關(guān)閉ResultSet的原因。到這里,開發(fā)的準(zhǔn)備工作已經(jīng)全部完成了,在本小節(jié)中,描述了如何連接JDBC進(jìn)行數(shù)據(jù)庫(kù)連接,使用Java的反射進(jìn)行字段與類屬性的映射,這些都為我們后面的功能開發(fā)打好了基礎(chǔ),在開發(fā)的過(guò)程中,我們可以直接編寫SQL,得到結(jié)果集,傳遞給DataUtil類,讓它轉(zhuǎn)換成集合,我們不再需要去處理ResultSet、Connection和Statement等對(duì)象。 出版社管理功能從本小節(jié)開始,我們開始實(shí)現(xiàn)系統(tǒng)功
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1