Struts2+spring+hibernate实现oracle数据库操作接口

本文的主要是讲述在SSH2框架下实现对oracle数据库的分页查询,删除,更新,插入的接口。注意:第一部分的代码是不用更改,直接可以添加到你工程使用的,它们是整个框架的基础,注意查看代码后的注释,有助于你的水平提高。第二部分代码则不是,用处不同,而且第二部分我写的也不好,见谅!
一。定义公共类,接口
1.数据库抽象接口类:BaseDaoInterface

package com.commons;

import java.util.List;
public interface BaseDaoInterface{
void addObject(Object o);
void excutesql(String sql);
void updateObject(Object o);
List getinfo( String sql);
List getinfo( String sql,String modelname);
List getRows( String sql,int pageSize, int startRow);//
List getRows( String sql,int pageSize, int startRow,String modelname);//
}

2.数据库接口实现抽象类:BaseDaoInterfaceImple

package com.commons;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class BaseDaoInterfaceImple extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(DaoInterfaceimpl.class);
//执行添加
public void addObject(Object o) {
// TODO Auto-generated method stub
this.getHibernateTemplate().save(o);

}
//执行一句sql,主要用于删除等。
public void excutesql(final String sql) {
try {
this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws SQLException, HibernateException {
try{
Query query = session.createQuery(sql);

query.executeUpdate();
session.close();
return null;
}
catch(Exception e){
session.close();
return null;
}
}
});
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
//执行更新
public void updateObject(Object o) {
this.getHibernateTemplate().update(o);
// TODO Auto-generated method stub

}
//执行sql,返回一组数据,主要用于查询
public List getinfo(final String sql) {
return getHibernateTemplate().executeFind(new HibernateCallback() {// 回调
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
try{
Query query = session.createSQLQuery(sql);
List list = query.list();
session.close();
return list;
}
catch(Exception e){
session.close();
return null;
}
}
});
}
//执行分段查询,在分页查询中使用
public List getRows(final String sql, int pageSize, int startRow)
throws HibernateException {
final int pageSize1 = pageSize;
final int startRow1 = startRow;
return getHibernateTemplate().executeFind(new HibernateCallback() {// 回调
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
try{
Query query = session.createSQLQuery(sql);
query.setFirstResult(startRow1);
query.setMaxResults(pageSize1);
List list = query.list();
session.close();
return list;
}
catch(Exception e){
session.close();
return null;
}
}
});

}

}

3.实现分页的:1.Pager(此为一个bean,主要包含当前页,每页行数等属性,和点击下页等方法) 2.PagerService(提供对Page的操作及返回一个Page)
3.1:Pager类

package com.commons;
public class Pager {
private int totalRows; // 总行数
private int pageSize = 10; // 每页显示的行数
private int currentPage; // 当前页号
private int totalPages; // 总页数
private int startRow; // 当前页在数据库中的起始行

public Pager() {
}

public Pager(int _totalRows) {
totalRows = _totalRows;
totalPages = totalRows / pageSize;
int mod = totalRows % pageSize;
if (mod > 0) {
totalPages++;
}
if (0 == totalRows) {
currentPage = 0;
startRow = 0;
}
else{
currentPage = 1;
startRow = 0;

}
}

public void first() {
if (0 == totalPages) {
currentPage = 0;
startRow = 0;
return;
}
currentPage = 1;
startRow = 0;
}

public void last() {
currentPage = totalPages;
startRow = (currentPage - 1) * pageSize;
}

public void previous() {
if (currentPage <= 1) {
startRow = 0;
return;
}
currentPage--;
startRow = (currentPage - 1) * pageSize;
}

public void next() {
if (currentPage >= totalPages) {
startRow = (totalPages - 1) * pageSize;
return;
}
currentPage++;
startRow = (currentPage - 1) * pageSize;
}

public void stay() {
startRow = (currentPage - 1) * pageSize;
}

public void refresh(int _currentPage) {
currentPage = _currentPage;
if (currentPage > totalPages) {
last();
} else if (currentPage < 0) {
first();
}else if(0 == currentPage && 1 == totalPages){
currentPage = 1;
}
}

public int getStartRow() {
return startRow;
}

public int getTotalPages() {
return totalPages;
}

public int getCurrentPage() {
return currentPage;
}

public int getPageSize() {
return pageSize;
}

public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}

public void setStartRow(int startRow) {
this.startRow = startRow;
}

public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}

public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public int getTotalRows() {
return totalRows;
}
}

3.2:PagerService 类

package com.commons;
public class PagerService {
public Pager getPager(String currentPage,String pagerMethod,int totalRows) {
// 定义pager对象,用于传到页面
Pager pager = new Pager(totalRows);
// 如果当前页号为空,表示为首次查询该页
// 如果不为空,则刷新pager对象,输入当前页号等信息
if (currentPage != null) {
pager.refresh(Integer.parseInt(currentPage));
}
// 获取当前执行的方法,首页,前一页,后一页,尾页。
if (pagerMethod != null) {
if (pagerMethod.equals("first")) {
pager.first();
} else if (pagerMethod.equals("previous")) {
pager.previous();
} else if (pagerMethod.equals("next")) {
pager.next();
} else if (pagerMethod.equals("last")) {
pager.last();
} else if (pagerMethod.equals("stay")) {
pager.stay();
}
}
return pager;
}
}

4.业务逻辑接口实现抽象类,此类只是在逻辑上划分了一下:BaseServiceInterface

public interface BaseServiceInterface{
void addObject(Object[] o,Object log);
void excutesql(String[] sql,Object log);
void updateObject(Object[] o,Object log);
void addObject(Object o,Object log);
void excutesql(String sql,Object log);
void updateObject(Object o,Object log);
void addObject(Object[] o);
void excutesql(String[] sql);
void updateObject(Object[] o);
List getinfo( String sql);
List getinfo( String sql,String modelname);
List getRows( String sql,int pageSize, int startRow);
List getRows( String sql,int pageSize, int startRow,String modelname);
}

二.应用在不同模块的接口和类:
1.CaDaoInterface

package com.CA.dao.inface;

import com.commons.BaseDaoInterface;

public interface CaDaoInterface extends BaseDaoInterface {

}

2.CaDaoImple 重点类:此类实现了上面的接口,上面的接口是继承了数据库抽象接口类,而且继承了数据库接口实现抽象类,这样它就具有了真正操作数据库的方法了,它里面的2个方法是可以不要的,是特殊要求的。你就可以调用上面的实现接口来调用操作方法。实现方法为在apllication中注入到服务接口中,下面会讲。

package com.CA.dao.imple;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;

import com.CA.dao.inface.CaDaoInterface;
import com.commons.BaseDaoInterfaceImple;


public class CaDaoImple extends BaseDaoInterfaceImple implements CaDaoInterface {

public List getRows(String sql, int pageSize, int startRow, String modelname) {
// TODO Auto-generated method stub
final String sql1 = sql;
final int pageSize1 = pageSize;
final int startRow1 = startRow;
final String modelname1 = modelname;
return getHibernateTemplate().executeFind(new HibernateCallback() {// 回调
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
SQLQuery query = session.createSQLQuery(sql1);
query.setFirstResult(startRow1);
query.setMaxResults(pageSize1);
List list = null;
if (modelname1.equals("TbKeyInfo")) {
//System.out.print("NND == NND");
list = query.addEntity(TbKeyInfo.class).list();
}
return list;

}
});

}

public List getinfo(String sql, String modelname) {
// TODO Auto-generated method stub
return null;
}

}

3.CaServicesInface接口,具体应用业务逻辑接口,继承公共的业务逻辑

package com.CA.service.inface;

import com.commons.BaseServiceInterface;

public interface CaServicesInface extends BaseServiceInterface {

}

4.CaServiceImple类,具体应用业务逻辑实现类,在此会注入一个CaDaoInterface,它是被实现了操作数据库的接口,调用它等于调用的CaDaoImple,CaDaoImple是真正操作数据库的类。

package com.CA.services.imple;
import java.util.List;

import com.CA.dao.inface.CaDaoInterface;
import com.CA.service.inface.CaServicesInface;

public class CaServiceImple implements CaServicesInface {
private CaDaoInterface caDaoInterface;
public CaDaoInterface getCaDaoInterface() {
return caDaoInterface;
}

public void setCaDaoInterface(CaDaoInterface caDaoInterface) {
this.caDaoInterface = caDaoInterface;
}

public void addObject(Object[] o, Object log) {
// TODO Auto-generated method stub

}

public void addObject(Object o, Object log) {
// TODO Auto-generated method stub

}

public void addObject(Object[] o) {
// TODO Auto-generated method stub
for (int i = 0; i < o.length; i++){
caDaoInterface.addObject(o[i]);
}
}

public void excutesql(String[] sql, Object log) {
// TODO Auto-generated method stub

}

public void excutesql(String sql, Object log) {
// TODO Auto-generated method stub

}

public void excutesql(String[] sql) {
// TODO Auto-generated method stub
for (int i = 0; i < sql.length; i++){
caDaoInterface.excutesql(sql[i]);
}

}

public List getRows(String sql, int pageSize, int startRow) {
// TODO Auto-generated method stub
return caDaoInterface.getRows(sql, pageSize, startRow);
}

public List getRows(String sql, int pageSize, int startRow, String modelname) {
// TODO Auto-generated method stub
return caDaoInterface.getRows(sql, pageSize, startRow, modelname);
}

public List getinfo(String sql) {
// TODO Auto-generated method stub
return caDaoInterface.getinfo(sql);
}

public List getinfo(String sql, String modelname) {
// TODO Auto-generated method stub
return null;
}

public void updateObject(Object[] o, Object log) {
// TODO Auto-generated method stub

}

public void updateObject(Object o, Object log) {
// TODO Auto-generated method stub

}

public void updateObject(Object[] o) {
// TODO Auto-generated method stub
for (int i = 0; i < o.length; i++){
caDaoInterface.updateObject(o[i]);
}
}

}

5.Action类:此类就是你处理提交数据,返回数据,控制跳转的
你在其中注入private CaServicesInface caServicesInface
就可以使用操作数据库的各个方法了。例子:此为一个实际使用过的,只供举例。

package com.CA.web.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.ResourceBundle;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import com.opensymphony.xwork2.ActionContext;
import com.CA.hibernate.TbKeyInfo;
import com.CA.hibernate.TbReadedInfo;
import com.CA.hibernate.TbUseruploadInfo;
import com.CA.service.inface.CaServicesInface;
import com.commons.BaseAction;
import com.commons.Pager;
import com.commons.PagerService;
import com.commons.PublicUtil;

public class AcceptAction extends BaseAction {
private PagerService pagerService;
private CaServicesInface caServicesInface;
private Pager pager;
protected String currentPage;
protected String pagerMethod;
protected String totalRows;

private String returnResult;
private String msg;
private String url;
private String sqlText;

private ArrayList userInfo;// 显示登陆用户所有可接收的密文
private String id;//显示接收哪一个密文
private File[] inputfile1;//上传的私钥
private String encrytesturl;
private String encrydeskeyurl;
private String signeurl;
private String systemdisturl;

public String getEncrytesturl() {
return encrytesturl;
}
public void setEncrytesturl(String encrytesturl) {
this.encrytesturl = encrytesturl;
}
public String getEncrydeskeyurl() {
return encrydeskeyurl;
}
public void setEncrydeskeyurl(String encrydeskeyurl) {
this.encrydeskeyurl = encrydeskeyurl;
}
public String getSigneurl() {
return signeurl;
}
public void setSigneurl(String signeurl) {
this.signeurl = signeurl;
}
public String getSystemdisturl() {
return systemdisturl;
}
public void setSystemdisturl(String systemdisturl) {
this.systemdisturl = systemdisturl;
}
public File[] getInputfile1() {
return inputfile1;
}
public void setInputfile1(File[] inputfile1) {
this.inputfile1 = inputfile1;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public ArrayList getUserInfo() {
return userInfo;
}
public void setUserInfo(ArrayList userInfo) {
this.userInfo = userInfo;
}
public PagerService getPagerService() {
return pagerService;
}
public void setPagerService(PagerService pagerService) {
this.pagerService = pagerService;
}
public CaServicesInface getCaServicesInface() {
return caServicesInface;
}
public void setCaServicesInface(CaServicesInface caServicesInface) {
this.caServicesInface = caServicesInface;
}
public Pager getPager() {
return pager;
}
public void setPager(Pager pager) {
this.pager = pager;
}
public String getCurrentPage() {
return currentPage;
}
public void setCurrentPage(String currentPage) {
this.currentPage = currentPage;
}
public String getPagerMethod() {
return pagerMethod;
}
public void setPagerMethod(String pagerMethod) {
this.pagerMethod = pagerMethod;
}
public String getTotalRows() {
return totalRows;
}
public void setTotalRows(String totalRows) {
this.totalRows = totalRows;
}
public String getReturnResult() {
return returnResult;
}
public void setReturnResult(String returnResult) {
this.returnResult = returnResult;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getSqlText() {
return sqlText;
}
public void setSqlText(String sqlText) {
this.sqlText = sqlText;
}
// 查询出当前登陆用户的所有已经保存的文件
public String Showallfile() {
Map session = ActionContext.getContext().getSession();
String userid = session.get("userid").toString();
TbUseruploadInfo tbuseruploadinfo = null;
if (session.get("userid") != null) {
try {
sqlText = "select count(ID) FROM tb_userupload_info where RECEIVE_USER_ID='"
+ userid + "'"+" ORDER BY ID";
int totalRow = Integer.valueOf((((ArrayList) caServicesInface
.getinfo(sqlText)).get(0).toString()));

pager = pagerService.getPager(this.getCurrentPage(), this
.getPagerMethod(), totalRow);
this.setCurrentPage(String.valueOf(pager.getCurrentPage()));
this.setTotalRows(String.valueOf(totalRow));
sqlText = "select * FROM tb_userupload_info where RECEIVE_USER_ID='"
+ userid + "'";
userInfo = (ArrayList) caServicesInface.getRows(sqlText, pager
.getPageSize(), pager.getStartRow());
Iterator iter = userInfo.iterator();
ArrayList list = new ArrayList();
while (iter.hasNext()) {
Object[] row = (Object[]) iter.next();
tbuseruploadinfo = new TbUseruploadInfo();
tbuseruploadinfo.setId(String.valueOf(row[0]));
tbuseruploadinfo.setUploadUserId(String.valueOf(row[1]));
tbuseruploadinfo.setReceiveUserId(String.valueOf(row[2]));
tbuseruploadinfo.setFileOrTest(String.valueOf(row[3]));
tbuseruploadinfo.setTitle(String.valueOf(row[4]));
tbuseruploadinfo.setUploadTime(String.valueOf(row[5]));
tbuseruploadinfo.setDigitalSignatureTest(String
.valueOf(row[6]));
tbuseruploadinfo.setEncryptTest(String.valueOf(row[7]));
tbuseruploadinfo.setEncryptKey(String.valueOf(row[8]));
tbuseruploadinfo.setDigitalSignatureTestUrl(String
.valueOf(row[9]));
tbuseruploadinfo.setEncryptTestUrl(String.valueOf(row[10]));
tbuseruploadinfo.setEncryptKeyUrl(String.valueOf(row[11]));
list.add(tbuseruploadinfo);
}
userInfo = list;
returnResult = "browseallacceptfile";
} catch (Exception e) {
e.printStackTrace();
msg = "AcceptAction!Showallfile"
+ ResourceBundle.getBundle("resource").getString(
"databaseerror");
this.setUrl("AcceptAction!Showallfile.action?currentPage=1&pagerMethod=first");
returnResult = "fail";
}

} else {
msg = ResourceBundle.getBundle("resource").getString("timeout");
url = ResourceBundle.getBundle("resource").getString("timeouturl");
returnResult = "timeout";
}

return returnResult;
}

//接受文件
public String acceptfile(){
Map session = ActionContext.getContext().getSession();
if (session.get("userid") != null) {
try {


returnResult = "acceptsuccess";
} catch (Exception e) {
e.printStackTrace();
msg = "AcceptAction!acceptfile"
+ ResourceBundle.getBundle("resource").getString(
"databaseerror");
this.setUrl("AcceptAction!Showallfile.action?currentPage=1&pagerMethod=first");
returnResult = "fail";
}

} else {
msg = ResourceBundle.getBundle("resource").getString("timeout");
url = ResourceBundle.getBundle("resource").getString("timeouturl");
returnResult = "timeout";
}

return returnResult;
}
//验证填写的接收回执
public String uploadmessage(){
Map session = ActionContext.getContext().getSession();
String userid=session.get("userid").toString();
ArrayList userInfo = null;
ArrayList UserInfo;
Iterator iter;
TbKeyInfo tbkeyinfo=new TbKeyInfo();
TbUseruploadInfo tbuseruploadinfo = new TbUseruploadInfo();
PublicUtil p=new PublicUtil();
BASE64Encoder enc = new BASE64Encoder();
BASE64Decoder dec = new BASE64Decoder();
if (session.get("userid") != null) {
try {

//读取到私钥
ObjectInputStream in=new ObjectInputStream(new FileInputStream(inputfile1[0]));
PrivateKey myprikey=(PrivateKey)in.readObject();
byte[] prikey=myprikey.getEncoded();
String prikey1=enc.encodeBuffer(prikey);
//查询到私钥
sqlText = "select * from TB_KEY_INFO where ID_NUM='" +userid
+ "'";
userInfo = (ArrayList) caServicesInface.getinfo(sqlText);
iter = userInfo.iterator();
ArrayList list = new ArrayList();
while (iter.hasNext()) {
Object[] row1 = (Object[]) iter.next();
tbkeyinfo.setIdNum(String.valueOf(row1[0]));
tbkeyinfo.setPublicKey(String.valueOf(row1[1]));
tbkeyinfo.setPrivateKey(String.valueOf(row1[2]));
list.add(tbkeyinfo);
}
userInfo = list;
String prikey2=tbkeyinfo.getPrivateKey();
//查询到接收文件的地址以供用户下载
sqlText = "select * FROM tb_userupload_info where ID='"
+ id + "'";
UserInfo = (ArrayList) caServicesInface.getinfo(sqlText);
iter = UserInfo.iterator();
while (iter.hasNext()) {
Object[] row = (Object[]) iter.next();
tbuseruploadinfo.setId(String.valueOf(row[0]));
tbuseruploadinfo.setUploadUserId(String.valueOf(row[1]));
tbuseruploadinfo.setReceiveUserId(String.valueOf(row[2]));
tbuseruploadinfo.setFileOrTest(String.valueOf(row[3]));
tbuseruploadinfo.setTitle(String.valueOf(row[4]));
tbuseruploadinfo.setUploadTime(String.valueOf(row[5]));
tbuseruploadinfo.setDigitalSignatureTest(String
.valueOf(row[6]));
tbuseruploadinfo.setEncryptTest(String.valueOf(row[7]));
tbuseruploadinfo.setEncryptKey(String.valueOf(row[8]));
tbuseruploadinfo.setDigitalSignatureTestUrl(String
.valueOf(row[9]));
tbuseruploadinfo.setEncryptTestUrl(String.valueOf(row[10]));
tbuseruploadinfo.setEncryptKeyUrl(String.valueOf(row[11]));
tbuseruploadinfo.setRedeadyReceiveUserId(String.valueOf(row[12]));
}

//得到各个连接地址
String filePath =
ResourceBundle.getBundle("resource").getString(
"upload");
systemdisturl=filePath+tbuseruploadinfo.getDigitalSignatureTest();
prikey1=prikey1.replaceAll("\r\n", "");
prikey2=prikey2.replaceAll("\r\n", "");
// System.out.println(prikey1);
// System.out.println(prikey2);
// System.out.println(prikey1.length());
// System.out.println(prikey2.length());
if(prikey1.equals(prikey2)){
//填写已读回执,写入数据库
sqlText = "select max(ID)+1 as id FROM tb_readed_info ";
// 计算保存信息的最大ID号
String a;
try {
a = ((ArrayList) caServicesInface
.getinfo(sqlText)).get(0).toString();
} catch (Exception e) {
a = "1";
}

String time=p.getNowtime();
TbReadedInfo t=new TbReadedInfo();
t.setId(a);
t.setUploadUserId(tbuseruploadinfo.getUploadUserId());
t.setReceiveUserId(userid);
t.setTitle(tbuseruploadinfo.getTitle());
t.setReadedTime(time);
t.setIsvalid(id);
Object obj[] = {t};
caServicesInface.addObject(obj);
returnResult = "accepttrue";
}else{
returnResult = "acceptfalse";
}
} catch (Exception e) {
e.printStackTrace();
msg = "AcceptAction!uploadmessage"
+ ResourceBundle.getBundle("resource").getString(
"databaseerror");
this.setUrl("AcceptAction!Showallfile.action?currentPage=1&pagerMethod=first");
returnResult = "fail";
}

} else {
msg = ResourceBundle.getBundle("resource").getString("timeout");
url = ResourceBundle.getBundle("resource").getString("timeouturl");
returnResult = "timeout";
}

return returnResult;
}

}

三。配置application,只显示相关的:

<!-- 定义session工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 依赖注入数据源,注入正是上文定义的dataSource -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 定义hibernate的SessionFactor的属性 -->
<property name="hibernateProperties">
<props>
<!-- 定义使用数据的SQL方言-->
<!-- Derby数据库 -->
<!--
<prop key="hibernate.dialect">
org.hibernate.dialect.DerbyDialect
</prop>
-->
<!-- Oracle9 i数据库 -->

<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>

<!-- 定义显示调试的SQL语句 -->
<prop key="hibernate.show_sql ">true</prop>
</props>
</property>

<!-- 定义加载Hibernate持久化对象实体映射文件 -->
<property name="mappingResources">
<list>
<value></value>
</list>
</property>
</bean>
<!-- 定义事务管理器,使适用于Hiberante的事务管理器-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<!-- 为事务管理器注入sessionFactory -->
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<!-- 配置业务逻辑 -->
<bean id="pagerService" class="com.sunnysky.commons.PagerService"></bean>

<bean id="caDaoInterface"
class="com.sunnysky.CA.dao.imple.CaDaoImple">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="caServicesInface"
class="com.sunnysky.CA.services.imple.CaServiceImple">
<property name="caDaoInterface">
<ref bean="caDaoInterface" />
</property>
</bean>

<bean id="EncryptAction"
class="com.sunnysky.CA.web.action.EncryptAction" scope="request">
<property name="caServicesInface">
<ref bean="caServicesInface" />
</property>

<property name="pagerService">
<ref bean="pagerService" />
</property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值