2.3.2. 使用JdbcDao

2023-07-03 16:56 更新

1.1.準(zhǔn)備

首先,新建一個com.bstek.demo.jdbcDao包,在這個包中添加一個繼承com.bstek.bdf2.core.orm.jdbc.JdbcDao類的子類JdbcDaoTest和一個視圖文件JdbcDaoTest.view.xml。然后,在JdbcDaoTest.view.xml文件中添加一個name為dataTypeDemoUser的DataType,并設(shè)置creationType屬性為com.bstek.demo.model.DemoUser。再在視圖view節(jié)點下添加一個id為dataSetDemoUser的DataSet,并設(shè)置dataType屬性為我們剛才添加的name為dataTypeDemoUser的DataType,選擇DataType時,勾選Collection選項。然后,在視圖view節(jié)點下添加一個id為gridDemoUser的DataGrid。接下來,在JdbcDaoTest.java中添加一個DemoUserRowMapper類,其代碼如下:
class DemoUserRowMapper implements RowMapper<DemoUser>{
 public DemoUser mapRow(ResultSet rs, int rowNum) throws SQLException {
 DemoUser d=new DemoUser();
 d.setUsername(rs.getString("USERNAME_"));
 d.setMale(rs.getBoolean("MALE_"));
 d.setBirthday(rs.getDate("BIRTHDAY_"));
 d.setMobile(rs.getString("MOBILE_"));
 d.setAddress(rs.getString("ADDRESS_"));
 d.setEmail(rs.getString("EMAIL_"));
 return d;
 }
}
最后,在dorado-home文件夾下,找到context.xml,添加如下配置:
<bean id="jdbcDaoTest" class="com.bstek.demo.jdbcDao.JdbcDaoTest">
</bean>

1.2.使用JdbcDao實現(xiàn)增、刪、改

首先,在視圖文件的view節(jié)點添加id為updateActionDemoUser的UpdateAction,將其dataResolver屬性設(shè)為hibernateDaoTest#saveDemoUser,并將為其添加一個屬性dataSet為dataSetDemoUser的UpdateItem子項。然后,在view節(jié)點添加一個ToolBar,并為其添加三個按鈕ToolBarBotton,分別是添加按鈕、刪除按鈕和保存按鈕,其中,在添加按鈕的onClick事件中添加如下代碼:
var data=view.get("#dataSetDemoUser.data");
data.insert();
在刪除按鈕的onClick事件中添加如下代碼:
var entity=view.get("#dataSetDemoUser.data:#");
var updateActionDemoUser=view.get("#updateActionDemoUser");
if(entity){
 entity.remove();
}else{
 dorado.MessageBox.alert("必須選中一行記錄!");
}
在保存按鈕的onClick事件中添加如下代碼:
var updateActionDemoUser=view.get("#updateActionDemoUser");
updateActionDemoUser.execute();
最后,我們需要完成后臺服務(wù)方法的編寫,就是在HibernateDaoTest類中添加如下代碼:
@DataResolver
public void saveDemoUsers(Collection<DemoUser> users){
 for (DemoUser user : users) {
 SqlParameterSource paramSource =new BeanPropertySqlParameterSource(user);
 EntityState state = EntityUtils.getState(user);
 if (state.equals(EntityState.NEW)) {
 this.getNamedParameterJdbcTemplate().update("INSERT INTO Demo_USER 
(USERNAME_,MALE_,BIRTHDAY_,MOBILE_,ADDRESS_,EMAIL_)VALUES(:username,:male,:birthday,:mobile
,:address,:email)", paramSource);
 } else if (state.equals(EntityState.MODIFIED)) {
 this.getNamedParameterJdbcTemplate().update("UPDATE Demo_USER SET
MALE_=:male,BIRTHDAY_=:birthday,MOBILE_=:mobile,ADDRESS_=:address,EMAIL_=:email WHERE
USERNAME_=:username", paramSource);
 } else if (state.equals(EntityState.DELETED)) {
 this.getNamedParameterJdbcTemplate().update("DELETE FROM Demo_USER WHERE
USERNAME_=:username", paramSource);
 }
 }
}
這樣,我們就完成了對數(shù)據(jù)的增刪改了。

1.3.使用JdbcDao實現(xiàn)各種查詢

1.3.1.無查詢條件的查詢

將dataSetDemoUser的dataProvider屬性設(shè)置為jdbcDaoTest#query10。接下來,在JdbcDaoTest類里添加如下方法:
@DataProvider
public Collection<DemoUser> query10(){
 String sql="SELECT D.USERNAME_,D.MALE_,D.BIRTHDAY_,D.MOBILE_,D.ADDRESS_,D.EMAIL_ FROM
Demo_USER D";
 return this.getJdbcTemplate().query(sql, new DemoUserRowMapper());
}

1.3.2.帶Map參數(shù)的NamedParameterJdbcTemplate條件查詢

首先,在JdbcDaoTest.view.xml視圖中,添加一個id為將textUsername的TextEditor和一個查詢按鈕,并在查詢按鈕的onClick事件中添加如下代碼:
var username=view.get("#textUsername.value");
var dataSetDemoUser=view.get("#dataSetDemoUser");
if(username){
 dataSetDemoUser.set("parameter",{username:username}).flushAsync();
}
dataSetDemoUser的dataProvider屬性設(shè)置為jdbcDaoTest#query11。接下來,在JdbcDaoTest類里添加如下方法:
@DataProvider
public Collection<DomeUser> query11(String username){
 Map<String,Object> map =new HashMap<String,Object>();
 String sql="SELECT D.USERNAME_,D.MALE_,D.BIRTHDAY_,D.MOBILE_,D.ADDRESS_,D.EMAIL_ FROM
DOME_USER D ";
 if(username!=null&&!"".equals(username)){
 map.put("username", "%"+username+"%");
 sql+="WHERE D.USERNAME_ LIKE :username";
 }
 return this.getNamedParameterJdbcTemplate().query(sql, map, new DomeUserRowMapper());
}

1.3.3.無查詢條件的分頁查詢

將dataSetDemoUser的dataProvider屬性設(shè)置為jdbcDaoTest#query12,并將dataSetDemoUser的pageSize設(shè)置為10,再添加一個分頁工具DataPilot,并設(shè)置dataSet屬性為dataSetDemoUser,接下來,在JdbcDaoTest類里添加如下方法:
@DataProvider
public Collection<DemoUser> query12(){
 String sql="SELECT D.USERNAME_,D.MALE_,D.BIRTHDAY_,D.MOBILE_,D.ADDRESS_,D.EMAIL_ FROM
Demo_USER D";
 return this.getJdbcTemplate().query(sql, new DemoUserRowMapper());
}

1.3.4.帶Map參數(shù)的條件分頁查詢

dataSetDemoUser的dataProvider屬性設(shè)置為jdbcDaoTest#query13。接下來,在JdbcDaoTest類里添加如下方法:
@DataProvider
public void query13(Page<DemoUser> page,String username){
 Map<String,Object> map =new HashMap<String,Object>();
 String sql="SELECT D.USERNAME_,D.MALE_,D.BIRTHDAY_,D.MOBILE_,D.ADDRESS_,D.EMAIL_ FROM
DOME_USER D ";
 if(username!=null&&!"".equals(username)){
 map.put("username", username);
 sql+=" WHERE D.USERNAME_=:username";
 }
 this.pagingQuery(page, sql, new DomeUserRowMapper(),map);
}
代碼說明:JdbcDao對象的pagingQuery(Page<?>page,Stringsql,RowMapper<?>mapper,Map<String,Object>parameters)方法,可以實現(xiàn)帶參數(shù)的查詢,參數(shù)放到Map集合當(dāng)中,可以放入多查詢參數(shù)。

1.3.5.帶數(shù)組參數(shù)的條件分頁查詢

將dataSetDemoUser的dataProvider屬性設(shè)置為jdbcDaoTest#query14。接下來,在JdbcDaoTest類里添加如下方法:
@DataProvider
public void query14(Page<DemoUser> page,String username){
 String sql="SELECT D.USERNAME_,D.MALE_,D.BIRTHDAY_,D.MOBILE_,D.ADDRESS_,D.EMAIL_ FROM
DOME_USER D ";
 if(username!=null&&!"".equals(username)){
 sql+=" WHERE D.USERNAME_=?";
 this.pagingQuery(page, sql,new Object[]{username},new DomeUserRowMapper());
 }else{
 this.pagingQuery(page, sql,new DomeUserRowMapper());
 }
}
代碼說明:此段代碼的功能和上一節(jié)代碼的功能是一樣的,只是這里傳遞查詢參數(shù)是通過Object數(shù)組來實現(xiàn)。但是這種方式對查詢參數(shù)的順序有嚴(yán)格的要求,不推薦使用。

1.3.6. 結(jié)合DataGrid的過濾工具欄實現(xiàn)分頁查詢

將dataSetDemoUser的dataProvider屬性設(shè)置為jdbcDaoTest#query15,并將gridDemoUser的filterMode和showFilterBar屬性分別設(shè)置為serverSide和true。接下來,在 JdbcDaoTest類里添加如下方法:
@DataProvider
public void query15(Page<DemoUser> page,Criteria criteria){
 String sql="SELECT D.USERNAME_,D.MALE_,D.BIRTHDAY_,D.MOBILE_,D.ADDRESS_,D.EMAIL_ FROM
Demo_USER D ";
 ParseResult result=this.parseCriteria(criteria,false,"D");
 if(result!=null){
 StringBuffer sb=result.getAssemblySql();
 Map<String,Object> valueMap=result.getValueMap();
 sql+=" WHERE "+sb.toString();
 this.pagingQuery(page,sql,valueMap.values().toArray(),new DemoUserRowMapper());
 }else{
 this.pagingQuery(page,sql,new DemoUserRowMapper()); 
 }
}
@Override
protected String buildFieldName(String name) {
 if(name==null)return name;
 StringBuffer sb=new StringBuffer();
 for(char ch:name.toCharArray()){
 boolean upper=Character.isUpperCase(ch);
 sb.append(Character.toUpperCase(ch));
 if(upper){
 sb.append("_");
 }
 }
 sb.append("_");
 return sb.toString();
}
代碼說明:parseCriteria方法的作用是將Criteria對象的相應(yīng)成分映射到ParseResult的assemblySql和valueMap屬性中,以方便我們使用JdbcDao的相關(guān)API,其中assemblySql屬性是查詢語句的where子句部分,且不包括where關(guān)鍵字。而valueMap則是對應(yīng)的查詢參數(shù)。buildFieldName方法是對父類AbstractDao中的buildFieldName模板方法的重寫,此模板方法是parseCriteria方法內(nèi)部在拼湊查詢語句的where子句時調(diào)用的,作用是根據(jù)實體類的屬性名生成對應(yīng)的數(shù)據(jù)庫字段名,默認(rèn)實現(xiàn)是生成的數(shù)據(jù)庫字段名和屬性名相同,通過在子類對其重寫,可以實現(xiàn)自定義的從實體屬性名到數(shù)據(jù)庫字段名的映射。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號