我就弄的用戶登入的代碼吧.這個(gè)挺簡(jiǎn)單的.
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到藍(lán)田網(wǎng)站設(shè)計(jì)與藍(lán)田網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋藍(lán)田地區(qū)。
這是題目:
用戶登陸驗(yàn)證:
1.創(chuàng)建數(shù)據(jù)庫(kù)Test,并新建用戶表users
字段包含:username varchar(20) not null
userpwd varchar(20) not null
在JBUILDER中編寫(xiě)Long類,實(shí)現(xiàn)登陸界面,并在用戶輸入用戶名和密碼后,
完成按紐的單擊事件,對(duì)用戶輸入的數(shù)據(jù)進(jìn)行驗(yàn)證,
(需要嚴(yán)整數(shù)據(jù)是否為空,密碼長(zhǎng)度必須是15位),
并實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接,將用戶輸入的用戶名密碼與表中的記錄比較,
若用戶名正確且密碼正確,彈出提示框告知登陸成功,否則登陸失敗。
這是代碼:
//連接數(shù)據(jù)庫(kù)
boolean isLogin(String name,String pwd){
boolean flag=false;
Connection conn=null;
PreparedStatement pst=null;
ResultSet rs=null;
//加載驅(qū)動(dòng)
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
//連接數(shù)據(jù)庫(kù)
try {
conn=DriverManager.getConnection("jdbc:odbc:login");
String sql="select * from [user] where username=? and userpwd=?";
pst=conn.prepareStatement(sql);
pst.setString(1,name);
pst.setString(2,pwd);
rs=pst.executeQuery();
if(rs.next())
flag=true;
} catch (Exception ex) {
ex.printStackTrace();
}finally{
try {
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
return flag;
}
//驗(yàn)證方法
public void jButton1_actionPerformed(ActionEvent e) {
String name=jTextField1.getText();
String pwd=jTextField2.getText();
//錯(cuò)誤處理
if(name.equals("")||pwd.equals(""))
JOptionPane.showMessageDialog(this,"請(qǐng)輸入完整的信息");
else {
if(isLogin(name,pwd))
JOptionPane.showMessageDialog(this,"登陸成功");
else
JOptionPane.showMessageDialog(this,"用戶名或密碼錯(cuò)誤");
}
}
}
.....
.....
這是在事件里寫(xiě)的,
1.用jdbc連接數(shù)據(jù)庫(kù)
public class DBConn {
private Connection con;
public Connection DBConn() {
//連接數(shù)據(jù)庫(kù)的屬性
String driver="sun.jdbc.odbc.JdbcOdbcDriver";
//獲得數(shù)據(jù)庫(kù)的真實(shí)路徑
String dburl = String.valueOf(Thread.currentThread().getContextClassLoader().getResource(""));
dburl = dburl + "lyb.mdb";//得到文件的URL: 'file:/C:\...'
dburl = dburl.substring(dburl.indexOf("/")+1);//去掉'file:/'
//dburl.replaceAll("%20"," ");
System.out.println("dburl :"+dburl);//測(cè)試用,運(yùn)行的時(shí)候顯示絕對(duì)路徑
dburl="E:/lyb/WebRoot/WEB-INF/classes/lyb.mdb";
String accessUrl="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+dburl;
try{
Class.forName(driver);
con = DriverManager.getConnection(accessUrl);
}catch(Exception e){
e.printStackTrace();
}
return con;
}
}
2.比如查詢數(shù)據(jù)庫(kù)中的record表,record表中存放的是實(shí)體MessageVO.
public Collection getMessage() throws Exception{
//SQL語(yǔ)句,從record里面獲得所有數(shù)據(jù)
String getLy="select count(*) from record";
String getLy1="select * from record order by id desc";
Collection ret=new ArrayList();
try{
if(con==null) System.out.println("con=null");
Statement stm=con.createStatement();
ResultSet res=stm.executeQuery(getLy);
int msg_count=0;
if(res.next()){
msg_count=res.getInt(1);
res.close();
}
if(msg_count0){
res=stm.executeQuery(getLy1);
while(res.next()){
int id=res.getInt("id");
String title=res.getString("title");
String name=res.getString("name");
String email=res.getString("email");
String content=res.getString("content");
java.sql.Timestamp ts=res.getTimestamp("ly_date");
java.sql.Date date=new java.sql.Date(ts.getTime());
//System.out.println(date);
MessageVO message=new MessageVO();
message.setId(id);
message.setTitle(title);
message.setName(name);
message.setEmail(email);
message.setContent(content);
message.setDate(date);
ret.add(message);
}
res.close();
stm.close();
}
con.close();
}catch(Exception e){
e.printStackTrace();
throw e;
}
return ret;
}
數(shù)據(jù)庫(kù)連接(Connection)
數(shù)據(jù)庫(kù)連接
獲取數(shù)據(jù)庫(kù)連接有兩種方法,一種是通過(guò)驅(qū)動(dòng)程序管理器DriverManager類,另一種則是使用DataSource接口。這兩種方法都提供了了一個(gè)getConnection方法,用戶可以在程序中對(duì)它們進(jìn)行相應(yīng)處理后調(diào)用這個(gè)方法來(lái)返回?cái)?shù)據(jù)庫(kù)連接。
? DriverManager類
? DataSource接口
? Connection接口
? JDBC URL
jdbc:subprotocol:subname
? 驅(qū)動(dòng)程序注冊(cè)方法
(1)調(diào)用Class.forName方法
(2)設(shè)置jdbc.drivers系統(tǒng)屬性
? DriverManager方法
DriverManager類中的所有方法都是靜態(tài)方法,所以使用DriverManager類的方法時(shí),不必生成實(shí)例。
DriverManager
? getConnection方法
作用是用于獲取數(shù)據(jù)庫(kù)連接,原型如下:
public static Connection getConnection(String url)
throws SQLException;
public static Connection getConnection(String url, String user, String password)
throws SQLException;
public static Connection getConnection(String url, Properties info)
throws SQLException;
? 使用DriverManager的getConnetion方法
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection
("jdbc:odbc:sqlserver", "sa", "sa");
? 使用設(shè)置jdbc.drivers系統(tǒng)屬性的方法
java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver test.java
DataSource 接口
……
//從上下文中查找數(shù)據(jù)源,并獲取數(shù)據(jù)庫(kù)連接
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("sqlserver");
Connection conn = ds.getConnection();
//查詢數(shù)據(jù)庫(kù)中所有記錄
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM student");
……
Connection 接口
Connection接口代表了已經(jīng)建立的數(shù)據(jù)庫(kù)連接,它是整個(gè)JDBC的核心內(nèi)容。Connnection接口中的方法按照它們所實(shí)現(xiàn)的功能,可以分為三類:
? 生成數(shù)據(jù)庫(kù)語(yǔ)句
? 管理數(shù)據(jù)庫(kù)事務(wù)
? 獲取數(shù)據(jù)庫(kù)信息
生成數(shù)據(jù)庫(kù)語(yǔ)句
JDBC將數(shù)據(jù)庫(kù)語(yǔ)句分成三種類型 :
? 生成Statement 語(yǔ)句 :
Connection.createStatement()
? 生成PreparedStatement 語(yǔ)句 :
Connection. prepareStatement()
? 生成CallableStatement 語(yǔ)句 :
Connection. prepareCall ()
管理數(shù)據(jù)庫(kù)事務(wù)
? 默認(rèn)情況下,JDBC將一條數(shù)據(jù)庫(kù)語(yǔ)句視為一個(gè)完整的事務(wù)??梢躁P(guān)掉默認(rèn)事務(wù)管理:
public void setAutoCommit(Boolean autoCommit) throws SQLException;
將autoCommit的值設(shè)置為false,就關(guān)掉了自動(dòng)事務(wù)管理模式
? 在執(zhí)行完事務(wù)后,應(yīng)提交事務(wù):
public void commit() throws SQLException;
? 可以取消事務(wù):
public void rollback() throws SQLException;
第二講 第四部分
數(shù)據(jù)庫(kù)語(yǔ)句
數(shù)據(jù)庫(kù)語(yǔ)句
JDBC數(shù)據(jù)庫(kù)語(yǔ)句共有三種類型:
? Statement:
Statement語(yǔ)句主要用于嵌入一般的SQL語(yǔ)句,包括查詢、更新、插入和刪除等等。
? PreparedStatement:
PreparedStatement語(yǔ)句稱為準(zhǔn)備語(yǔ)句,它是將SQL語(yǔ)句中的某些參數(shù)暫不指定,而等到執(zhí)行時(shí)在統(tǒng)一指定。
? CallableStatement:
CallableStatement用于執(zhí)行數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程。
Statement 語(yǔ)句
? executeQuery方法
? executeUpdate方法
? execute方法
? close方法
executeQuery方法
? executeQuery方法主要用于執(zhí)行產(chǎn)生單個(gè)結(jié)果集的SQL查詢語(yǔ)句(QL),即SELECT語(yǔ)句。executeQuery方法的原型如下所示:
? public ResultSet executeQuery(String sql) throws SQLException;
executeUpdate方法
? executeUpdate方法主要用于執(zhí)行 INSERT、UPDATE、DELETE語(yǔ)句,即SQL的數(shù)據(jù)操作語(yǔ)句(DML)
? executeUpdate方法也可以執(zhí)行類似于CREATE TABLE和DROP TABLE語(yǔ)句的SQL數(shù)據(jù)定義語(yǔ)言(DDL)語(yǔ)句
? executeUpdate方法的返回值是一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。而對(duì)于CREATE TABLE 或 DROP TABLE等并不操作特定行的語(yǔ)句,executeUpdate的返回值總為零。
execute方法
execute方法用于執(zhí)行:
? 返回多個(gè)結(jié)果集
? 多個(gè)更新計(jì)數(shù)
? 或二者組合的語(yǔ)句
execute方法
? 返回多個(gè)結(jié)果集:首先要調(diào)用getResultSet方法獲得第一個(gè)結(jié)果集,然后調(diào)用適當(dāng)?shù)膅etter方法獲取其中的值。要獲得第二個(gè)結(jié)果集,需要先調(diào)用getMoreResults方法,然后再調(diào)用getResultSet方法。
? 返回多個(gè)更新計(jì)數(shù):首先要調(diào)用getUpdateCount方法獲得第一更新計(jì)數(shù)。然后調(diào)用getMoreResults,并再次調(diào)用getUpdateCount獲得后面的更新計(jì)數(shù)。
? 不知道返回內(nèi)容:如果結(jié)果是ResultSet對(duì)象,則execute方法返回true;如果結(jié)果是int類型,則意味著結(jié)果是更新計(jì)數(shù)或執(zhí)行的語(yǔ)句是DDL命令。
execute方法
為了說(shuō)明如果處理execute方法返回的結(jié)果,下面舉一個(gè)代碼例子:
stmt.execute(query);
while (true) {
int row = stmt.getUpdateCount();
//如果是更新計(jì)數(shù)
if (row 0) {
System.out.println("更新的行數(shù)是:" + row);
stmt.getMoreResults();
continue;
}
execute方法
//如果是DDL命令或0個(gè)更新
if (row == 0) {
System.out.println("沒(méi)有更新,或SQL語(yǔ)句是一條DDL語(yǔ)句!");
stmt.getMoreResults();
continue;
}
//如果是一個(gè)結(jié)果集
ResultSet rs = stmt.getResultSet;
if (rs != null) {
while (rs.next()) {
// 處理結(jié)果集
. . .
}
stmt.getMoreResults();
continue;
}
break;
}
PreparedStatement 語(yǔ)句
登錄一個(gè)網(wǎng)站或BBS時(shí) :
? 使用Statement語(yǔ)句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery
(“SELECT password FROM userinfo
WHERE id=userId");
? 使用PreparedStatement語(yǔ)句
PreparedStatement pstmt=conn.prepareStatement
(“SELECT password FROM userinfo
WHERE id=?");
pstmt.setString(1, userId);
PreparedStatement語(yǔ)句
? 常用的setter方法
public void setBoolean(int parameterIndex, boolean x) throws SQLException;
public void setByte(int parameterIndex, byte x) throws SQLException;
public void setShort(int parameterIndex, short x) throws SQLException;
public void setInt(int parameterIndex,int x) throws SQLException;
public void setLong(int parameterIndex, long x) throws SQLException;
public void setFloat(int parameterIndex, float x) throws SQLException;
public void setDouble(int parameterIndex, double x) throws SQLException;
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException;
public void setString(int parameterIndex, String x) throws SQLException;
public void setBytes(int parameterIndex, byte[] x) throws SQLException;
public void setDate(int parameterIndex, Date x) throws SQLException;
public void setTime(int parameterIndex, Time x) hrows SQLException;
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException;
PreparedStatement語(yǔ)句
? PreparedStatement接口是由Statement接口擴(kuò)展而來(lái)的,重寫(xiě)了executeQuery方法、executeUpdate方法和execute 方法
? public ResultSet executeQuery() throws SQLException
? public int executeUpdate() throws SQLException
? public boolean execute() throws SQLException
CallableStatement語(yǔ)句
? CallableStatement語(yǔ)句是由Connection接口的prepareCall方法創(chuàng)建的,創(chuàng)建時(shí)需要傳入字符串參數(shù),參數(shù)的形式為:
? {call procedure_name[(?, ?, ...)]}
? {? = call procedure_name[(?, ?, ...)]}
? {call procedure_name}
CallableStatement語(yǔ)句
? 其中的問(wèn)號(hào)是參數(shù)占位符,參數(shù)共有兩種:
? IN參數(shù)
? OUT參數(shù)
? IN參數(shù)使用setter方法來(lái)設(shè)置
? OUT參數(shù)則使用registerOutParameter方法來(lái)設(shè)置
CallableStatement 語(yǔ)句
CallableStatement cstmt = con.prepareCall
("{call getTestData(?, ?)}");
cstmt.registerOutParameter
(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter
(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n =
cstmt.getBigDecimal(2, 3);
第二講 第五部分
結(jié) 果 集
結(jié)果集
? JDBC為了方便處理查詢結(jié)果,又專門定義了一個(gè)接口,這個(gè)接口就是ResultSet接口。ResultSet接口提供了可以訪問(wèn)數(shù)據(jù)庫(kù)查詢結(jié)果的方法,通常稱這個(gè)接口所指向的對(duì)象為結(jié)果集。
? 有兩種方法得到結(jié)果集,一種是直接執(zhí)行查詢語(yǔ)句,將結(jié)果存儲(chǔ)在結(jié)果集對(duì)象上;另一種是不存儲(chǔ)返回結(jié)果,而在需要時(shí)調(diào)用數(shù)據(jù)庫(kù)語(yǔ)句的getResultSet方法來(lái)返回結(jié)果集
結(jié)果集
? 結(jié)果集指針
由于返回的結(jié)果集可能包含多條數(shù)據(jù)記錄,因此ResultSet 接口提供了對(duì)結(jié)果集的所有數(shù)據(jù)記錄輪詢的方法。結(jié)果集自動(dòng)維護(hù)了一個(gè)指向當(dāng)前數(shù)據(jù)記錄的指針,初始時(shí)這個(gè)指針是指向第一行的前一個(gè)位置。 next 方法就是用于向前移動(dòng)指針的
結(jié)果集
? 結(jié)果集屬性
默認(rèn)情況下,結(jié)果集是一個(gè)不可更新集,并且結(jié)果集的指針也只能向前移動(dòng)。也就是說(shuō),在得到了一個(gè)結(jié)果集之后,用戶只能按照從第一條記錄到最后一條記錄的順序依次向后讀取,而不能跳到任意條記錄上,也不能返回到前面的記錄。不僅如此,結(jié)果集的這種輪詢只能進(jìn)行一次,而不能再將指針重置到初始位置進(jìn)行多次輪詢
結(jié)果集
? 結(jié)果集屬性
類型
并發(fā)性
有效性
? 屬性的設(shè)置是在生成數(shù)據(jù)庫(kù)語(yǔ)句時(shí)通過(guò)向生成方法傳入相應(yīng)的參數(shù)設(shè)定的,而當(dāng)結(jié)果集已經(jīng)返回時(shí)就不能夠再改變它的屬性了。
結(jié)果集生成Statement語(yǔ)句共有三種方法
public Statement createStatement() throws SQLException;
public Statement createStatement
(int resultSetType, int resultSetConcurrency)
throws SQLException;
public Statement createStatement
(int resultSetType, int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
結(jié)果集
? 生成PreparedStatement語(yǔ)句共有六種方法
public PreparedStatement prepareStatement(String sql) throws SQLException;
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
public PreparedStatement prepareStatement(String sql. String[] columnNames)
throws SQLException;
結(jié)果集
? 生成CallableStatement語(yǔ)句共有三種方法
public CallableStatement prepareCall(String sql)
throws SQLException;
public CallableStatement prepareCall
(String sql, int resultSetType,
int resultSetConcurrency)
throws SQLException;
public CallableStatement prepareCall
(String sql, int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
結(jié)果集
結(jié)果集類型
? 結(jié)果集的類型共有三種,TYPE_FORWARD_ONLY類型的結(jié)果集只能向前移動(dòng)指針,而TYPE_SCROLL_INSENSITIVE類型和TYPE_SCROLL_SENSITIVE類型的結(jié)果集則可以任意移動(dòng)指針。后兩種類型的區(qū)別在于,前者對(duì)來(lái)自其它處的修改不敏感(靜態(tài)),而后者則對(duì)于別人的修改敏感(動(dòng)態(tài)視圖)。
結(jié)果集
結(jié)果集類型
? 對(duì)于可以任意移動(dòng)指針的結(jié)果集,可以用來(lái)移動(dòng)指針的方法包括:
? next 和previous :
? absolute 和relative :參數(shù)可正可負(fù)
? afterLast 、beforeFirst 、last 和first :
結(jié)果集
結(jié)果集并發(fā)性
? 結(jié)果集的并發(fā)性共有兩種,CONCUR_READ_ONLY的結(jié)果集是只讀而不可更新的;而CONCUR_UPDATABLE的結(jié)果集則是可以通過(guò)update方法進(jìn)行更新的。
? ResultSet接口提供了一組update方法,用于更新結(jié)果集中的數(shù)據(jù)。這些方法與PreparedStatement接口中定義的setter方法一樣,也是與類型相對(duì)應(yīng)的。所有的update方法都以u(píng)pdate開(kāi)頭 。
? 所有的update方法都有兩個(gè)參數(shù),第一個(gè)參數(shù)用于指定更新的列,它可以是列名稱也可以是列的序號(hào);第二個(gè)參數(shù)則表示將要更新列的值。
結(jié)果集
結(jié)果集并發(fā)性
? Statement stmt = conn.createStatement
? (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
? ResultSet rs = stmt.executeQuery("SELECT * FROM student " +
? "WHERE grade=2 AND math60 AND physics60 AND " +
? "chemistry60 AND english60 AND chinese60");
? while(rs.next()){
? rs.updateString("grade", "3");
? rs.updateRow();
? }
結(jié)果集
結(jié)果集有效性
? 結(jié)果集的有效性是指在調(diào)用了Connection 接口的commit 方法后,結(jié)果集是否自動(dòng)關(guān)閉。所以它只有兩個(gè)可選值,即HOLD_CURSORS_OVER_COMMIT 和CLOSE_CURSORS_AT_COMMIT 。前者表示調(diào)用commit 方法之后,結(jié)果集不關(guān)閉;而后者則表示關(guān)閉結(jié)果集。
結(jié)果結(jié)果集
? 結(jié)果集的getter方法
ResultSet接口還提供了一組getter方法,用于返回當(dāng)前記錄的屬性值。它們都是以get開(kāi)頭的,后接數(shù)據(jù)類型。比如,如果要返回一個(gè)float類型的列值,則應(yīng)調(diào)用getFloat方法。每一種類型的getter方法都有兩種形式,它們的名稱相同而參數(shù)不同。這兩種形式的getter方法都只有一個(gè)參數(shù),第一種形式的getter方法參數(shù)是String類型的,用于指定列的名稱;另外一種形式的getter方法參數(shù)則是int類型的,用于指定列的序號(hào)。
詳情如下:
以JNDI方式創(chuàng)建數(shù)據(jù)源首先要配置數(shù)據(jù)源的相關(guān)連接信息,也就是數(shù)據(jù)源連接池。該配置應(yīng)該在Tomcat安裝目錄下的conf/context.xml 文件中配置,在Eclipse的J2EE架構(gòu)下,也可以把context.xml文件創(chuàng)建在/META-INF目錄下。
正確的配置后,就可以在程序中以JNDI的方式創(chuàng)建數(shù)據(jù)源,得到數(shù)據(jù)庫(kù)連接并進(jìn)行相應(yīng)的操作。
分享題目:數(shù)據(jù)庫(kù)java源代碼 java數(shù)據(jù)庫(kù)代碼實(shí)例
當(dāng)前網(wǎng)址:http://muchs.cn/article6/doeoiog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)