
代码我就不看了 直接给你找段类似的
拷下以前写的论文中部分
232 使用JDBC的一般流程
加载某个数据库的驱动(Driver类)
通常使用ClassforName(“驱动的类名“);
连接数据库
Connection con = DriverManagergetConnection(url,username,password);
得到会话
Statement stmt = concreateStatement();
执行 *** 作
Result rs = stmtexecuteQuery(“SQL查询语句”);
5 处理结果
while(rsnext()){
String col1 = rsgetString(1);
……
}
XxxDao接口的设计
XxxDao是数据持久化层对数据库进行 *** 作的接口。所有Service层对数据库的 *** 作都是通过调用DAO层相应的XxxDao接口中的方法来实现。以AdminDao为例说明XxxDao接口是如何定义的:
AdminDaojava
public interface AdminDao {
/ 登陆验证,验证指定管理理ID和密码的记录是否存在 /
public Admin getAdminByIdAndPswd(String adminId, String adminPswd);
/此接口的中其他方法省略/
//其他方法声明的代码省略
}
说明:
XxxDao接口总是被相应的XxxDaoJdbcImpl类实现,通过相应方法的重写达到具体的数据 *** 作。
XxxDao接口实现类XxxDaoJdbcImpl的设计
XxxDaoJdbcImpl是XxxDao接口的实现类,该实现类中通过对接口方法的重写,来达到对特定数据表的增删改查等 *** 作。以AdminDaoJdbcImpl为例来说明是如何进行对数据库表的 *** 作,具体 *** 作说明见代码注释:
AdminDaoJdbcImpljava
public class AdminDaoJdbcImpl implements AdminDao {
/查询指定用户ID和密码的记录是否存在。若存在返回保存此记录的对象/
public Admin getAdminByIdAndPswd(String adminId, String adminPswd) {
/调用utils包中的公共数据库连接类DatabaseConn的静态方法getConnection() 取得指定数据库的连接。/
Connection conn = DatabaseConngetConnection();
try {
/创建(MySql)数据库查询语句/
String sql = "select from t_admin where ADMIN_ID= and ADMIN_PSWD= and STATE='1'";
/ 表示预编译的 SQL 语句的对象。SQL 语句被预编译并存储在 PreparedStatement 对象中,然后可以使用此对象多次高效地执行该语 句。/
PreparedStatement prep = connprepareStatement(sql);
/数字1代表第一个问号,表示用实参adminId给sql中的第一个问号赋值。 下一句类同。在这里必须注意实参的类型和数据库中数据类型的匹配。在 这里实参String类型对应于数据库中的varchar()。/
prepsetString(1, adminId);
prepsetString(2, adminPswd);
/在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。不会返回 null。ResultSet 本身是一个interface 。 /
ResultSet rs = prepexecuteQuery();
/如果结果集中有值,表示用户输入的管理理ID和密码是有效的,这样的 记录存在。/
if (rsnext()) {
// 先把信息取出来,并实例化一个Admin对象。
Admin admin = new Admin();
adminsetAdminId(adminId);
adminsetAdminPswd(adminPswd);
adminsetAdminName(rsgetString("ADMIN_NAME"));
adminsetLastLoginTime(rsgetTimestamp("LASTLOGIN_TIME"));
adminsetLastLoginMes(rsgetString("LASTLOGIN_MES"));
adminsetAdminDesc(rsgetString("ADMIN_DESC"));
/关闭ResultSet/
rsclose();
/关闭PreparedStatement /
prepclose();
// 修改登陆时间,t_admin表中存储着用户最近一次登陆的时间
String updateLoginTime = "update t_admin set LASTLOGIN_TIME= where ADMIN_ID= ";
PreparedStatement updatePrep = conprepareStatement(updateLoginTime);
updatePrepsetTimestamp(1, new Timestamp(new javautilDate()
getTime()));
updatePrepsetString(2, adminId);
updatePrepexecuteUpdate();
updatePrepclose();
// 返回
return admin;
} else {
/如果结果集中没有值,表示用户输入的ID密码不正确。
关闭ResultSet,关闭PreparedStatement ,程序返回null。/
rsclose();
prepclose();
return null;
}
} catch (Exception e) {
eprintStackTrace();
} finally {
/在程序执行return返回前,finally语句会被执行,在这里执行必须的一 步 *** 作-关闭数据库连接。即使有异常抛出,finally{}语句照样能执行, 保证数据库连接可以安全释放,不会造成数据库出现其它数据异常等问 题。/
DatabaseConncloseConnection(conn);
}
return null;
}
/AdminDao接口中的其他方法的实现/
//其他方法的实现代码省略
}
说明:
整个对数据库 *** 作的过程就是:取得数据库连接--〉创建Sql语句--〉创建PreparedStatement 语句--〉对语句中的‘?’进行赋值--〉执行executeX() *** 作,获得结果放入ResultSet中--〉根据需求从ResultSet中获得需要的结果-->关闭ResultSet-->关闭PreparedStatement --〉断开数据库连接--〉结果返回。
首先nodejs 三个重要的层 Dao持久层(数据层) service服务层(业务层) router表现层(路由)
Dao持久层(数据层) :
mysql的配置 回调服务层的函数
databasejs 这里主要是配置mysql参数
配置过后不用再改变 可以固定不变
var mysql = require('mysql');
function getConAPI(){
var con = mysqlcreateConnection({
host:'127001',
user:'root',
password:'123456',
database:'backstage'
});
return con;
}
function query(sql,param,func){
var con = getConAPI();
if(!func){
func = param;
param = [];
}
conquery(sql,param,function(e,r){
if(e){
consolelog("����������"+e);
}else{
func(r);
}
conend();
});
}
function queryByPage(curpage,eachpage,sql,param,func){
var con = getConAPI();
if(!curpage || curpage <= 0){
curpage = 1;
}
if(!func){
func = param;
param = [];
}
conquery("select count() cnt from ("+sql+") t",param,function(e,r){
var count = r[0]cnt;
var maxpage = Mathceil(count/eachpage);
sql += " limit "+((curpage-1)eachpage)+","+eachpage;
var inner_con = getConAPI();
inner_conquery(sql,param,function(e,r){
var page = {"curpage":curpage,"maxpage":maxpage,"eachpage":eachpage};
if(e){
consolelog("����������"+e);
}else{
pagedata = r;
func(page);
}
inner_conend();
});
conend();
});
}
exportsgetCon = getConAPI;
exportsquery = query;
exportsqueryByPage = queryByPage;
dao ---
userDaojs
这里主要是运用mysql语句 对数据的增删查改
/
Created by HeSir on 2016/3/23
/
var database = require("/database");
//登录
exportsfindeByUserNameAndPwd = function(ary,fun){
databasequery("select from user where username= and password=",ary,fun);
consolelog("查询用户名和密码");
consolelog(ary);
};
service----
服务层 这里主要是连接数据层和表现层的 1校验规则2回调持久层
/
Created by HeSir on 2016/3/23
/
var userDao = require("/dao/userDao");
//登录 ----login
exportslogin = function(ary,fun){
userDaofindeByUserNameAndPwd(ary,fun);
};
router---
管理路径 获取数据 请求(req)和响应(res)
利用ajax提交和获取
/
Created by HeSir on 2016/3/23
/
var express = require('express');
var router = expressRouter();
var userService = require("/service/userService");
//get users listing
routerget('/',function(req,res,next){
ressend('respond width a resource');
});
//登录------login
routerpost("/login",function(req,res){
var ary = [reqbodyusername,reqbodypassword];
userServicelogin(ary,function(i){
if(ilength > 0){
reqsessionuser = i[0];
}
ressend(i);
});
});
moduleexports = router;
appjs
里面配置好路由
var userRoute = require('/routes/UserRoute');
appuse('/users', userRoute);
activity可以 *** 作service了,我们还需要service能 *** 作activity。
我觉得可以有3中方式:
1直接把activity传给service,service通过activity实例随便 *** 作activity
2使用接口回调方式,activity实现相应的接口,service通过接口进行回调,比较灵活
3使用广播
使用广播是比较常见的方式,我们就不具体讲解了,下面我们介绍前面2中方法,具体看代码,用service更新seekbar。
我们的activity代码:
[html] view plain copy
package comhckbindservice;
import androidappActivity;
import androidcontentComponentName;
import androidcontentIntent;
import androidcontentServiceConnection;
import androidosBundle;
import androidosIBinder;
import androidutilLog;
import androidviewView;
import androidwidgetSeekBar;
import androidwidgetToast;
import comhckbindserviceMyServiceMyBuild;
public class MainActivity extends Activity {
private MyService myService; //我们自己的service
private SeekBar pBar; //模拟service更新进度条
private ConnectionService connectionService;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutmain);
pBar = (SeekBar) findViewById(Ridseekbar);
connectionService=new ConnectionService();
}
public void startService(View view) { //绑定service
bindService(new Intent(this,MyServiceclass), connectionService, 1);
}
/
@author Administrator
实现service接口,用于service绑定时候,回调
/
class ConnectionService implements ServiceConnection
{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService=((MyBuild)service)getMyService(); //获取Myservice对象
/
直接把当前对象传给service,这样service就可以随心所欲的调用本activity的各种可用方法
/
myServicesetMainActivity(MainActivitythis); //把当前对象传递给myservice
/
使用一个接口来实现回调,这样比上面方法更加灵活,推荐
/
// myServicesetOnProgressBarListener(new UpdateProgressListener() {
//
// @Override
// public void updateBar(int size) {
// updateBar(size);
// }
// });
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
/
@param size
更新seekbar
/
public void updateBar(int size)
{
pBarsetProgress(size);
}
/
@param view
开始更新seekbar
/
public void startBar(View view) {
if (myService==null) {
ToastmakeText(this, "请先开始service", ToastLENGTH_LONG)show();
}
else {
myServicestartUpdateProgress();
}
}
/
@param view
停止更新seekbar
/
public void stopBar(View view) {
if (myService==null) {
ToastmakeText(this, "更新没有开始", ToastLENGTH_LONG)show();
}
else {
myServicestopUpdateProgress();
}
}
/
@param view
停止service
/
public void stopService(View view) {
myService=null;
unbindService(connectionService);
}
@Override
protected void onDestroy() {
superonDestroy();
try {
unbindService(connectionService);
} catch (Exception e) {
}
}
}
重要代码是onServiceConnected回调方法里面
myService=((MyBuild)service)getMyService(); //获取Myservice对象
获取service对象后,我们想怎么 *** 作它都行了,比如上面的,把activity实例直接通过它的方法传递过去,便于
service调用activity的各种方法。或者,设置传递一个回调接口对象过去,用户回调
service代码:
[html] view plain copy
package comhckbindservice;
import androidappService;
import androidcontentIntent;
import androidosBinder;
import androidosHandler;
import androidosIBinder;
import androidutilLog;
public class MyService extends Service{
private int size=0;
private UpdateProgress updateProgress;
private final long TIME=2000;
private boolean isUpdate=true;
private MainActivity activity;
private UpdateProgressListener listener;
@Override
public IBinder onBind(Intent intent) {
return new MyBuild();
}
@Override
public void onCreate() {
superonCreate();
updateProgress=new UpdateProgress();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return superonStartCommand(intent, flags, startId);
}
/
@author Administrator
线程用来改变seekbar进度的大小
/
class UpdateProgress implements Runnable
{
@Override
public void run() {
if (isUpdate) {
size+=10;
if (size>100) {
size=0;
}
handlersendEmptyMessage(0);
}
}
}
/
调用更新相应方法,更新进度条
/
Handler handler=new Handler()
{
public void handleMessage(androidosMessage msg) {
/
直接调用activity对象里面的方法
/
if (activity!=null) {
activityupdateBar(size);
}
/
使用接口回调
/
// if (listener!=null) {
// listenerupdateBar(size);
// }
handlerpostDelayed(updateProgress, TIME);
};
};
/
停止更新
/
public void stopUpdateProgress()
{
isUpdate=false;
}
/
开启更新
/
public void startUpdateProgress()
{
if (!isUpdate) {
handlerpost(updateProgress);
}
isUpdate=true;
}
public void onDestroy() {
isUpdate=false;
};
/
@param activity
初始化MainActivity对象
/
public void setMainActivity(MainActivity activity)
{
thisactivity=activity;
}
/
@param listener
初始化UpdateProgressListener对象
/
public void setOnProgressBarListener(UpdateProgressListener listener)
{
thislistener=listener;
}
/
@author Administrator
使用类部类,返回当前service的实例,用于activity,调用service的各种方法
/
class MyBuild extends Binder
{
public MyService getMyService()
{
return MyServicethis;
}
}
}
service里面最重要的就是,最下面我们的MyBuild类部类了,通过它的getMyService方法,获取service的实例
该类的实例实在onBind时候,我们返回给activity的。
接口:
[html] view plain copy
package comhckbindservice;
public interface UpdateProgressListener {
public void updateBar(int size);
}
一个简单接口,用于service回调activity
上面是使用 bindService来启动service的,那么如果我们使用startService启动service时候,上面的办法就不行了。
因为onBind不会执行,我们获取不到IBinder实例。这个时候,我们可以使用设计模式的观察者模式来处理。
</summary///<paramname=serverContext服务上下文</param///<paramname=connStr格式如:SERVER=fsgt;INSTANCE=esri_sde;USER=scott;PASSWORD=tiger;VERSION=SDEDEFAULT</param///<returns</returnspublicstaticIWorkspaceGetWorkspaceByServerContext(IServerContextserverContext,stringconnStr){try{IWorkspaceFactory2pWorkspaceFactory2=serverContextCreateObject(esriDataSourcesGDBSdeWorkspaceFactory)asIWorkspaceFactory2;returnpWorkspaceFactory2OpenFromString(connStr,0);}catch{thrownewArgumentException(无法获取连接,请检查连接字符串格式是否正确!);}}publicstaticESRIArcGISServerIServerContextGetServerContext(stringhost,stringserviceName,stringserviceType){ESRIArcGISServerIServerObjectManagerserverManager=GetServerConnection(host)ServerObjectManager;returnserverManagerCreateServerContext(serviceName,serviceType);}///<summary///获取Server的连接,注意此连接必须在客户端与服务端的当前 *** 作系统帐户一致情况下才有效(此时无须再指定用户名/密码)///</summary///<paramname=host</param///<paramname=serviceName</param///<returns</returnspublicstaticGISServerConnectionClassGetServerConnection(stringhost){ESRIArcGISServerGISServerConnectionClassgisConnection=newESRIArcGISServerGISServerConnectionClass();gisConnectionConnect(host);returngisConnection;}在客户端,你大概可以这样调用:[Test]publicvoidGetWorkspaceFromServerContext(){//获取服务上下文IServerContextserverContext=GetServerContext(Host,YourServiceName,MapServer);//打开Workspace的连接字符串,支持直连和非直连方式stringconnStr=SERVER=host;INSTANCE=esri_sde;USER=scott;PASSWORD=tiger;VERSION=SDEDEFAULT;IWorkspacepWorkspace=GetWorkspaceByServerContext(serverContext,connStr);//AssertIsNotNull(pWorkspace);//注意释放上下文serverContextReleaseContext();}之前试过用获取IMap的第一个图层,再QI为IDataset,再获取到IWorkspace这种方式来获取IWorkspace,但这种方式感觉还是不大正规,有旁门左道之嫌。That's all!
以上就是关于哪位大侠能给这段Java语言加上注释,谢谢!再能对程序的功能分析、参数的选择依据给出分析就好了。全部的内容,包括:哪位大侠能给这段Java语言加上注释,谢谢!再能对程序的功能分析、参数的选择依据给出分析就好了。、webstord中怎么启动服务器、service怎么得到绑定的activity实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)