Spring 註解學習手札(四) 持久層淺析
引用
aopalliance-1.0.jar
commons-collections.jar
commons-dbcp.jar
commons-logging-1.1.1.jar
commons-pool.jar
jstl.jar
log4j-1.2.15.jar
mysql-connector-java-5.1.6-bin.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-context-support-2.5.6.jar
spring-core-2.5.6.jar
spring-jdbc-2.5.6.jar
spring-tx-2.5.6.jar
spring-web-2.5.6.jar
spring-webmvc-2.5.6.jar
standard.jar
主要增加了commons-collections.jar、commons-dbcp.jar、commons-pool.jar、mysql-connector-java-5.1.6-bin.jar和spring-jdbc-2.5.6.jar
先弄個數據庫,這裡使用MySQL,我的最愛!可惜前途未卜!
建庫:
Sql程式碼
- CREATEDATABASE`spring`/*!40100DEFAULTCHARACTERSETutf8*/;
建表:
Sql程式碼
- DROPTABLEIFEXISTS`spring`.`account`;
- CREATETABLE`spring`.`account`(
- `id`int(10)unsignedNOTNULLAUTO_INCREMENT,
- `username`varchar(45)NOTNULL,
- `password`varchar(45)NOTNULL,
-
`birthday`datetimeNOT
- `email`varchar(45)NOTNULL,
- PRIMARYKEY(`id`)
- )ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;
插入預設資料:
Sql程式碼
- INSERTINTO`spring`.`account`(
- `username`,
- `password`,
- `birthday`,
- `email`)
- VALUES(
- 'snowolf',
- 'zlex',
- '2010-01-01',
- '[email protected]');
給出一個數據庫查詢的結果:
很不巧,為了能讓資料查詢更有意義,我又要改動Account類:
Account.java
Java程式碼
- publicclassAccountimplementsSerializable{
- /**
- *主鍵
- */
- privateintid;
- /**
- *使用者名稱
- */
- privateStringusername;
- /**
- *密碼
- */
- privateStringpassword;
- /**
- *生日
- */
- privateDatebirthday;
- /**
- */
- privateStringemail;
- //get方法set方法省略
- }
這樣,域物件與資料庫表將完成一一對應繫結關係。
再建立一個用於構建資料來源配置的檔案database.properties
database.properties:
Properties程式碼
- dataSource.driverClassName=com.mysql.jdbc.Driver
- dataSource.url=jdbc:mysql://localhost:3306/spring
- dataSource.username=root
- dataSource.password=admin
- dataSource.maxActive=200
- dataSource.maxIdle=50
- dataSource.maxWait=10000
該檔案位於/WEB-INF/目錄下。
接下來,我們需要把它引入spring容器,修改applicationContext.xml:
applicationContext.xml
Xml程式碼
- <context:property-placeholder
- location="/WEB-INF/database.properties"/>
如果需要引入多個properties檔案,可以用逗號分隔。
這時,我們已經引入了資料來源配置,我們可以通過修改dao.xml構建基於DBCP的資料來源:
dao.xml中dataSource配置
Xml程式碼
- <bean
- id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close"
- lazy-init="false"
- p:driverClassName="${dataSource.driverClassName}"
- p:url="${dataSource.url}"
- p:username="${dataSource.username}"
- p:password="${dataSource.password}"
- p:maxActive="${dataSource.maxActive}"
- p:maxIdle="${dataSource.maxIdle}"
- p:maxWait="${dataSource.maxWait}"/>
上述配置稀鬆平常,沒有什麼好闡述的內容,這與一般spring配置無異樣。
需要注意的是這個jdbcTemplate配置!
dao.xml中jdbcTemplate配置
Xml程式碼
- <bean
- class="org.springframework.jdbc.core.JdbcTemplate"
- p:dataSource-ref="dataSource"/>
這個配置很關鍵,如果你要使用其他的ORM框架,同樣需要配置這樣的模板類,在Dao實現中無需繼承JdbcDaoSupport類。
不需要明確JdbcTemplate的id(id="jdbcTemplate")嗎?不再需要了!
AccountDao.java
Java程式碼
- publicinterfaceAccountDao{
- /**
- *讀取賬戶資訊
- *
- *@paramusername
- *@return
- */
- Accountread(Stringusername);
- /**
- *讀取賬戶資訊
- *
- *@paramid
- *@return
- */
- Accountread(intid);
- }
AccountDaoImpl.java
Java程式碼
- /**
- *2010-1-23
- */
- packageorg.zlex.spring.dao.impl;
- importjava.sql.ResultSet;
- importjava.sql.SQLException;
- importorg.springframework.beans.factory.annotation.Autowired;
- importorg.springframework.jdbc.core.JdbcTemplate;
- importorg.springframework.jdbc.core.RowMapper;
- importorg.springframework.stereotype.Repository;
- importorg.zlex.spring.dao.AccountDao;
- importorg.zlex.spring.domain.Account;
- /**
- *賬戶資料庫實現
- *
- *@author<ahref="mailto:[email protected]">樑棟</a>
- *@version1.0
- *@since1.0
- */
- @Repository
- publicclassAccountDaoImplimplementsAccountDao{
- @Autowired
- privateJdbcTemplatejdbcTemplate;
- @Override
- publicAccountread(Stringusername){
- Stringsql="SELECT*FromaccountWHEREusername=?";
- return(Account)jdbcTemplate.queryForObject(sql,
- newObject[]{username},accountRowMap);
- }
- @Override
- publicAccountread(intid){
- Stringsql="SELECT*FromaccountWHEREid=?";
- return(Account)jdbcTemplate.queryForObject(sql,newObject[]{id},
- accountRowMap);
- }
- protectedRowMapperaccountRowMap=newRowMapper(){
- @Override
- publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException{
- Accountaccount=newAccount();
- account.setId(rs.getInt("id"));
- account.setUsername(rs.getString("username"));
- account.setPassword(rs.getString("password"));
- account.setBirthday(rs.getDate("birthday"));
- account.setEmail(rs.getString("email"));
- returnaccount;
- }
- };
- }
分段詳述:
註解@Repository明確這個類是用於持久層的實現類,注意這樣的註解不能用於介面,僅適用於實現類!
同時,不再需要繼承JdbcDaoSupport類,其而代之的是直接注入JdbcTemplate類!
再看宣告JdbcTemplate類:
Java程式碼
- @Autowired
- privateJdbcTemplatejdbcTemplate;
需要說明一下,這裡的JdbcTemplate物件jdbcTemplate名稱可以自定,沒有任何限制!
這裡使用 RowMapper 定義了一個用於繫結Account域物件的內部對映類:
RowMapper
Java程式碼
- protectedRowMapperaccountRowMap=newRowMapper(){
- @Override
- publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException{
- Accountaccount=newAccount();
- account.setId(rs.getInt("id"));
- account.setUsername(rs.getString("username"));
- account.setPassword(rs.getString("password"));
- account.setBirthday(rs.getDate("birthday"));
- account.setEmail(rs.getString("email"));
- returnaccount;
- }
- };
相關推薦
Spring 註解學習手札(四) 持久層淺析
這裡將用到以下幾個包: 引用 aopalliance-1.0.jar commons-collections.jar commons-dbcp.jar commons-logging-1.1.1.jar commons-pool.jar jstl.jar log4j-1.
Spring 註解學習手札(一) 構建簡單Web應用
轉載自 http://snowolf.iteye.com/blog/577989 我們將用到如下jar包: 引用 aopalliance-1.0.jar commons-logging-1.1.1.jar log4j-1.2.15.ja
Spring 註解學習手札(八)補遺——@ExceptionHandler
Spring註解,改變了我的開發思路。前段時間,用@RequestBody,@ResponseBody,不費吹灰之力就解決了JSon自動繫結。接著就發現,如果遇到RuntimeException,需要給出一個預設返回JSON。 以前都是用SimpleMappingExcep
Spring註解學習手札(一)構建web應用
近來工作發生了一些變化,有必要學習一下Spring註解了! 網上找了一些個例子,總的說來比較土,大多數是轉載摘抄,按照提示弄下來根本都執行不了,索性自己趟一遍這渾水,在這裡留下些個印記。 這次,先來構建一個極為簡單的web應用,從controller到dao。不考慮具體實現
Spring學習手札(四)配置DispatcherServlet
本文描述了web.xml最基本配置方式。 Spring MVC的核心是DispatcherServlet,作為Spring MVC的前端控制器; 和任何Servlet一樣,我們需要在web.xml檔案中配置DispatcherServlet; 下面的描述以這個web.xml為
Spring框架學習筆記(四)
兩個 低版本 事務管理器 對象關系 多行 通配符 表單 spring整合 val 上接Spring框架學習筆記(三) 聲明式事務管理(xml配置) 1 配置文件方式使用aop思想配置 第一步 配置事務管理器 第二步 配置事務增強 第三步 配置切面 聲明式事務
Spring Boot學習筆記(四)—— 使用Spring Security
一、前言 Spring Boot同樣提供了關於Spring Security的自動配置支援,在org.springframework.boot.autoconfigure.security包中可以看到,在SpringBootWebSecurityConfiguration中,為我們自動配
Spring Boot學習筆記(四)與mybatis的合體
1.pom.xml的配置(spring boot配置已有) 驅動包、連線池(還不知道啥意思),org.mybatis.spring.boot, 日後補足吧。 <dependency> <groupId>mysql</gro
Spring基礎學習筆記(四)
Bean物件的作用域 預設自定義的bean都是單例 自己寫的類:dao層,service層,action層,domain層,util層 哪些層應該是單例? dao層,
Spring框架學習筆記(四)-- Mybatis
Mybatis是什麼MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis,實質上Mybatis對ibatis進行一些改進。MyBatis
Spring Boot學習日誌(四)使用Mybatis
前言 之前簡單介紹了一下Soring Boot Jpa操作Mysql資料庫的相關方法,但是在使用Jpa的時候總有寫不習慣,比如:複雜的邏輯使用Jpa的規則生成Sql總覺得很麻煩,如果直接在 @Query裡面寫Sql總是不那麼的“舒服”,下面開始關於MyBa
Spring原始碼學習--XmlWebApplicationContext(四)
ApplicationContext應用上下文體系如下:
Spring 學習筆記(四)IOC之註解方式
用註解向IOC容器增加javaBean配置,還有一些注入的註解 第一步:添加註解的jar包 spring-aop-4.3.3.RELEASE.jar 第二步:applicationContext.xml檔案中開啟註解 注意beans標籤內增加了context的名稱空間和約束 &l
Spring學習筆記(四)
array contain ets loader html 新的 -c spring學習 llb 本教程對應視頻課程:http://edu.51cto.com/course/14731.html 1、自動裝配 1.1、Spring標簽 Autowired標簽的作用 1、通過
Spring學習手札(一)
Spring能做什麼 1. 能根據配置檔案建立及組裝物件之間的依賴關係; 2. 面向切面程式設計,能幫助我們無耦合的實現日誌記錄,效能統計,安全控制等; 3. 提供第三方資料訪問框架(如Hibernate),而且自己也提供了一套JDBC訪問模板方便訪問資料庫; 4. 非常簡單的管理資料庫事務;
Spring學習手札(二)面向切面程式設計AOP
AOP理解 Aspect Oriented Program面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。 但是,這種說法有些片面,因為在軟體工程中,AOP的價值體現的並不是程式碼方面,更多的是為了專案的模組化,而不僅僅是為了減少重複程式碼。 AOP是一種程
Spring學習手札(三)理解IoC 拯救不開心
Inverse of Control,翻譯成“控制反轉”,是Spring的核心。IoC不是一種技術,而是一種設計思想。就是將原本在程式中手動建立物件的控制權(new Object() ),交由Spring容器來管理控制。不用new物件,直接從Spring那裡獲取一個物件(其內部使用的是反射技術)。
spring boot 學習筆記 (8)MyBatis 註解版
註解版 註解版的使用方式和 XML 版本相同,只有在構建 SQL 方面有所區別,所以本課重點介紹兩者之間的差異部分。 相關配置 註解版在 application.properties 只需要指明實體類的包路徑即可,其他保持不變: mybatis.type-aliases-packag
Quartz2.x學習筆記(四):spring注入異常解決方法
在使用Quartz與spring整合時,有時需要在Job任務類裡注入spring的bean。如下: 那麼問題來了,當你啟動專案時,會發現報了空指標異常: 查閱資料以及百度之後,終於找到一個解決
Spring學習筆記(四):Spring AOP詳解
一.前言 二、什麼是 AOP? AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種