Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Các thao tác cơ bản trong lập trình JDBC

Sau khi bạn đã kết nối vào cơ sở dữ liệu ở phần trước, bây giờ chúng ta có thể thao tác với đối tượng JDBC. Bài viết này, tôi sẽ giới thiệu một vài thao tác. Giả sử ta có 1 database MySQL có tên là logondb với 1 bảng users có 2 trường username, password và 1 kết nối con đến database.

1> Sử dụng đối tượng Statement

Với đối tượng này, chúng ta có thể dùng để thực thi câu các SQL. Tương ứng với loại câu SQL ta sẽ dùng các phương thức tương ứng.

Đầu tiên chúng ta khởi tạo đối tượng Statement bằng phương thức:

Statement stmt=con.createStatement();

hoặc là

Statement stmt=con.createStatement(int resultSetType, int resultSetConcurrency)

với con là đối tượng Connection kết nối đến CSDL trước đó.

resultsetType là 1 trong 3 kiểu:
* ResultSet.TYPE_FORWARD_ONLY, (chỉ đi tới, mặc định)
* ResultSet.TYPE_SCROLL_INSENSITIVE, (cho phép cuộn và không cập nhật thay đổi)
* ResultSet.TYPE_SCROLL_SENSITIVE (cho phép cuộn và không cập nhật thay đổi trên người dùng khác)

resultSetConcurrency là 1 trong 2 kiểu:
* ResultSet.CONCUR_READ_ONLY (chỉ cho phép đọc)
* ResultSet.CONCUR_UPDATABLE (Cho phép cập nhật trên ResultSet)

Chúng ta thực thi câu SQL bằng cách gọi các phương thức executeXXX với XXX là kiểu thực thi

int executeUpdate(String sql) throws SQLException

Phương thức này dùng để thực thi các câu sql insert, delete, update,… ngoại trừ câu select. Phương thức này trả về số mẫu tin bị ảnh hưởng bởi câu SQL.

void TestExecuteUpdate() {
try {
con=ConnectDBFactory.CreateMySqlConnection(“logondb”);
Statement stmt=con.createStatement();
String sql=”Insert into users values(‘det’,’123′)”;
int smt=stmt.executeUpdate(sql);
if(smt<1)
System.out.println(“Không chèn được”);
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

ResultSet executeQuery(String sql) throws SQLException

Phương thức này thực thi câu select SQL, trả về 1 đối tượng ResultSet để chứa 1 danh sách các records thỏa mãn câu select.

void TestExecuteQuery() {
try {
con=ConnectDBFactory.CreateMySqlConnection(“logondb”);
Statement stmt=con.createStatement();
String sql1=”select * from users”;
ResultSet rs=stmt.executeQuery(sql1);
while(rs.next()) {
String ms=rs.getString(“username”);
String mk=rs.getString(“password”);
System.out.println(ms+”\t”+mk);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

boolean execute(String sql) throws SQLException

Phương thức này thực thi 1 câu SQL bất kỳ và có thể trả về các kiễu khác nhau. Như vậy sau khi thực thi câu SQL bằng phương thức này ta có thể lấy kết quả bằng 3  phương thức sau:
int getUpdateCount() throws SQLException
ResultSet getResultSet() throws SQLException
hoặc boolean getMoreResults() throws SQLException.

int[] executeBatch() throws SQLException

Cho phép thực thi 1 lô các câu SQL (lưu ý là các câu sql không bao gồm câu select)

void TestExecuteBatch() {
try {
con=ConnectDBFactory.CreateMySqlConnection(“logondb”);
Statement stmt=con.createStatement();
String sql1=”Insert into users values(‘det1′,’123’)”;
String sql2=”Insert into users values(‘det2′,’123’)”;
String sql3=”delete from users where username=’2424′”;
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);

int []ds=stmt.executeBatch();
for(int i:ds) {
System.out.println(“kết quả: “+i);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

2> Sử dụng đối tượng PrepareStatement

Đối tượng này được sử dụng khi chúng ta muốn thực thi 1 câu truy vấn có tham số. Tuy nhiên nó được khuyên dùng ngay cả khi không cần phài truyền tham số bởi nó thực thi nhanh hơn do được preload trước khi thực thi. Nó là 1 đối tượng được extends từ statement(public interface PreparedStatement extends Statement) cho nên mọi phương thức của Statement đều có thể dùng ở đây.  Cú pháp của nó như sau:

PreparedStatement prepareStatement(String sql)throws SQLException hoặc

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)throws SQLException

với sql là câu truy vấn truyền vào.

Ví dụ sau cho chúng ta cách dùng đối tượng này. Đây là ví dụ về đăng nhập hệ thống với database đã cho ở trên.

boolean Logon(String un,String psw)throws Exception {
con=ConnectDBFactory.CreateMySqlConnection(“logondb”);
String sql=”select * from users where username=? and password=?”;
PreparedStatement pStmt=con.prepareStatement(sql);
//truyền tham số
pStmt.setString(1, un);//qui định tham số
pStmt.setString(2, psw);
ResultSet rs=pStmt.executeQuery();//thực thi
if(rs.next())
return true;
return false;
}

3> Sử dụng đối tượng ResultSet

Đối tượng ResultSet trong lập trình JDBC rất quan trọng, nó lưu giữ các mẫu tin thỏa mãn 1 tính chất nào đó của database, cho phép thực hiện các thao tác trên nó,…

ResultSet có được khi chúng ta thực thi 1 câu select SQL từ đối tượng xStatement. Sau khi có được đối tượng ResultSet ta có thể đọc 1 mẫu tin bằngphương thức next(). Phương thức này trả về false khi không có mẫu tin để đọc (có thể là cuối danh sách). Sau khi đọc 1 mẫu tin, ta có thể lấy dữ liệu từ mẫu tin hiện tại bằng cách dùng các phương thức getXXX(“fieldName hoặc index”) trong đó XXX là kiểu dữ liệu của field cần đọc. Vì do kiểu của csdl và kiểu của java là không giống nhau nên ta phải chú ý ánh xã từ kiểu của csdl sang kiểu của java tương ứng. Tuy nhiên trong 1 số trường hợp, jdbc tự ép kiểu cho chúng ta theo nguyên tắc của việc chuyển kiểu.

Về tham số truyền vào phương thức getXXX, tôi nghĩ là chúng ta nên truyền vào tên field thay thì chỉ số index vô tri vô giác. Lưu ý: trong lập trình JDBC, index luôn bắt đầu từ 1. Vi dụ :

void TestExecuteQuery() {
try {
con=ConnectDBFactory.CreateMsSqlServerConnection("BookMS");
Statement stmt
=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql1="select * from book";
ResultSet rs=stmt.executeQuery(sql1);
while(rs.next()) {
String ms=rs.getString("isbn");
String mk=rs.getString("bookTiitle");
System.out.println(ms+"\t"+mk);
}
rs.previous();
String ms=rs.getString("isbn");
System.out.println("Sau khi di lui");
System.out.println(ms);
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

Đối với 2 kiểu đặc biệt CLOB và BLOB tôi sẽ bàn đến trong bài sau.

Chúc các bạn thành công!

35 Responses to “Các thao tác cơ bản trong lập trình JDBC”

  1. pog said

    em chào thầy, hiện em đang học lập trình về eclipse với các project về OpenGL, JDBC. Thầy có thể cho em vài đoạn code thật( thật, rất, cực kì) đơn giản được không thầy.Em đang cần đoạn code để check JDBC (em đã làm theo thầy là mở admin. tools …..) nhưng đoạn code em thấy rất dài, rắc rối (ý kiến chủ quan của em thôi, vì gần như là em ko có căn bản về OpenGL và JDBC). Thầy có thể cho em một vài ebook tiếng việt được ko thầy. Em nghe nhiều người nói rằng OGL và JDBC rất dễ nhưng nếu ko có căn bản thì ko làm gì được.

  2. lahanh said

    Chào thầy, em đang làm 1 chương trình về CSDL qua rmi, thầy cho em hỏi ResultSet làm kiểu data trả về cho 1 hàm có được khg ạh, vì ở lớp implement khi truy xuất CSDL em cho trả về 1 ResultSet để khi client triệu gọi có thể nhận về ResultSet giống như được truy xuất trực tiếp từ CSDL. Nếu không thể dùng cách này, thầy cho em hỏi có cách làm nào tương tự như vậy khg?

  3. giang said

    Hi bạn, mình dùng đối tượng resultset muốn insert tiếng việt vào sql thì cú pháp insert là thế nào hả bạn

  4. vovanhai said

    Thêm N’ vào. Nhưng nói trước là java không có hỗ trợ unicode với MS Acces. Bạn phải làm cách khác phức tạp hơn.

  5. nguyenlan said

    Thầy vui lòng hướng dẫn e cách thực hiện kiểm tra username xem đã có trong database sql server 2005 chưa? sau đó nếu ko tồn tại thì insert vào database. Thầy cho e đoạn code demo để e càng dễ hiểu thầy nhé! Cám ơn thầy nhiều nhiều!

  6. vovanhai said

    có 2 cách: 1 là cứ chèn lụi vào rồi bắt lỗi. 2 là dùng câu select để kiểm tra trước khi chèn.

  7. Binh said

    package Connect;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.sql.*;

    import javax.sql.RowSetMetaData;
    import javax.sql.rowset.CachedRowSet;
    import javax.sql.rowset.JdbcRowSet;
    import javax.sql.rowset.JoinRowSet;
    import javax.sql.rowset.WebRowSet;

    import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
    import com.microsoft.sqlserver.jdbc.SQLServerDriver;

    import com.sun.rowset.CachedRowSetImpl;
    import com.sun.rowset.JdbcRowSetImpl;
    import com.sun.rowset.WebRowSetImpl;

    public class connectURL {

    public Connection getConnect() {
    Connection con = null;
    SQLServerDataSource ds = new SQLServerDataSource();
    ds.setUser(“sa”);
    ds.setPassword(“binhnguyen”);
    ds.setPortNumber(1433);
    ds.setDatabaseName(“WebShop”);
    ds.setServerName(“localhost”);
    ds.setIntegratedSecurity(true);
    try {
    con = ds.getConnection();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return con;
    }

    public JdbcRowSet getResultSet(String table) {
    JdbcRowSet rs = null;
    try {
    rs = new JdbcRowSetImpl();
    rs.setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
    rs.setConcurrency(ResultSet.CONCUR_READ_ONLY);
    rs.setUsername(“sa”);
    rs.setPassword(“binhnguyen”);
    String url = “jdbc:sqlserver://localhost:1433;”
    + “databaseName=WebShop;IntegratedSecurity=true”;
    rs.setUrl(url);
    String query = “Select * from ” + table;
    rs.setCommand(query);
    rs.execute();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return rs;
    }

    public void printTable() {
    try {
    ResultSet rs = getResultSet(“SinhVien”);
    ResultSetMetaData rsmt = rs.getMetaData();
    int number_column = rsmt.getColumnCount();
    for (int i = 1; i <= number_column; i++) {
    System.out.print(rsmt.getColumnName(i) + " ");

    }
    System.out.println();
    while (rs.next()) {
    for (int j = 1; j <= number_column; j++) {

    System.out.print(rs.getString(j) + " ");
    }
    System.out.println();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }

    public void updateData() {
    Statement stmt = null;
    try {
    stmt = getConnect().createStatement();
    for (int i = 1; i < 10; i++) {
    String query = "Insert into SinhVien values('"
    + String.valueOf(i) + "','Binh" + String.valueOf(i)
    + "', 'Nguyen " + String.valueOf(i) + "')";
    stmt.execute(query);

    }
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    try {
    stmt.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }

    public void WebRowSet() {
    JdbcRowSet jrs = getResultSet("SinhVien");
    try {
    CachedRowSet crs = new CachedRowSetImpl();
    crs.populate(jrs);
    crs.setPageSize(3);
    crs.setMaxRows(4);
    RowSetMetaData rsmt = (RowSetMetaData) crs.getMetaData();
    int rowset_column = rsmt.getColumnCount();
    while (crs.nextPage()) {

    while (crs.next()) {
    for (int j = 1; j <= rowset_column; j++) {
    System.out.print(crs.getString(j));
    }
    System.out.println();
    }
    System.out.println("het trang -qua trang moi");
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

    public void exportXML(String file) {
    try {
    try {
    ResultSet rs = getResultSet("SinhVien");
    WebRowSet wrs = new WebRowSetImpl();
    wrs.populate(rs);
    wrs.writeXml(rs, new FileWriter(new File(file)));
    } catch (SQLException e) {
    e.printStackTrace();
    }

    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException ez) {
    ez.printStackTrace();
    }

    }

    public void JdbcRowSet() {
    try {
    JdbcRowSetImpl jrs = new JdbcRowSetImpl(getResultSet("SinhVien"));
    ResultSetMetaData rsmt = (ResultSetMetaData) jrs.getMetaData();
    int column = rsmt.getColumnCount();
    while (jrs.next()) {
    for (int i = 1; i <= column; i++) {
    System.out.print(jrs.getString(i));
    }
    System.out.println();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    connectURL cn = new connectURL();
    // cn.updateData();
    // cn.printTable();
    cn.WebRowSet();
    // cn.exportXML("C:/out.xml");
    // cn.JdbcRowSet();

    }
    }
    Em chào Thầy. Em sử dụng đối tượng CachedRowSet mãi mà không được em đã thử test theo nhiều cách nhưng vẫn không được. Mong Thầy giúp em. Đây là lỗi của nó
    Exception in thread "main" java.lang.NullPointerException
    at com.sun.rowset.JdbcRowSetImpl.prepare(Unknown Source)
    at com.sun.rowset.JdbcRowSetImpl.execute(Unknown Source)
    at Connect.connectURL.getResultSet(connectURL.java:54)
    at Connect.connectURL.WebRowSet(connectURL.java:106)

  8. vovanhai said

    Lỗi chỗ này:
    JdbcRowSet jrs = getResultSet(“SinhVien”);
    Em xem lại kết nối của em xuống csdl đúng chưa? Đã lấy được JdbcRowset chưa?
    (jrs bị null)

  9. Binh said

    Em thử rồi Thầy nhưng em không hiểu vì sao nó lại lỗi. Khi dùng đối tượng ResultSet thì mọi thứ đều ổn nhưng khi chuyển sang JdbcRowSet hoặc là CachedRowSet thì mọi thứ không ổn. Đây là đoạn code em test trên 2 đối tượng ResultSet và JdbcRowSet mong Thầy giúp cho em. Em cảm ơn Thầy!
    package Connect;

    import java.sql.*;

    import javax.sql.RowSetMetaData;
    import javax.sql.rowset.JdbcRowSet;

    import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
    import com.microsoft.sqlserver.jdbc.SQLServerException;
    import com.sun.rowset.JdbcRowSetImpl;

    public class ConnectSQL {

    public Connection getConnect() {
    Connection con = null;
    try {

    SQLServerDataSource consql = new SQLServerDataSource();
    consql.setDatabaseName(“WebShop”);
    consql.setUser(“sa”);
    consql.setPassword(“binhnguyen”);
    consql.setPortNumber(1433);
    consql.setServerName(“localhost”);
    con = consql.getConnection();
    } catch (SQLServerException e) {
    e.printStackTrace();
    }
    return con;

    }

    public ResultSet getResult(String query) {
    ResultSet rs = null;
    try {
    Statement stmt = getConnect()
    .createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);
    rs = stmt.executeQuery(query);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return rs;
    }

    public JdbcRowSet getRowSet() {
    JdbcRowSet rs= null;
    try {
    rs = new JdbcRowSetImpl(rs);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return rs;
    }

    public void printTableForResultSet() {
    String query = “Select * from SinhVien”;
    ResultSet rs = getResult(query);
    try {
    ResultSetMetaData rsmt = (ResultSetMetaData) rs.getMetaData();
    if (rsmt == null) {
    System.out.print(“doi tuong rs is null”);
    }
    int getColumn = rsmt.getColumnCount();
    for (int i = 1; i <= getColumn; i++) {
    System.out.print("Column is " + rsmt.getColumnName(i));
    }
    System.out.println();
    while (rs.next()) {
    for (int i = 1; i <= getColumn; i++) {
    System.out.print(rs.getString(i));
    }
    System.out.println();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

    public void printTableForJdbcRowSet() {
    String query = "Select * from SinhVien";
    ResultSet rs = getResult(query);
    JdbcRowSet jrs = getRowSet();
    try {
    RowSetMetaData rsmt = (RowSetMetaData) jrs.getMetaData();
    if (rsmt == null) {
    System.out.print("doi tuong jrs is null");
    }
    int getColumn = rsmt.getColumnCount();
    for (int i = 1; i <= getColumn; i++) {
    System.out.print("Column is " + rsmt.getColumnName(i));
    }
    while (rs.next()) {
    for (int i = 1; i <= getColumn; i++) {
    System.out.print(jrs.getString(i));
    }
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

    public static void main(String[] args) {
    new ConnectSQL().printTableForResultSet();
    new ConnectSQL().printTableForJdbcRowSet();
    }

    }
    Đây là kết xuất khi chạy chương trình :
    Column is idColumn is firstnameColumn is lastname
    1 Binh1 Nguyen 1
    2 Binh2 Nguyen 2
    3 Binh3 Nguyen 3
    java.lang.NullPointerException
    at com.sun.rowset.JdbcRowSetImpl.(Unknown Source)
    at Connect.ConnectSQL.getRowSet(ConnectSQL.java:48)
    at Connect.ConnectSQL.printTableForJdbcRowSet(ConnectSQL.java:83)
    at Connect.ConnectSQL.main(ConnectSQL.java:106)
    Exception in thread “main” java.lang.NullPointerException
    at Connect.ConnectSQL.printTableForJdbcRowSet(ConnectSQL.java:85)
    at Connect.ConnectSQL.main(ConnectSQL.java:106)

  10. Binh said

    Cho em sữa lại 2 đoạn code :
    public void printTableForResultSet() {
    String query = “Select * from SinhVien”;
    ResultSet rs = getResult(query);
    try {
    ResultSetMetaData rsmt = (ResultSetMetaData) rs.getMetaData();
    if (rsmt == null) {
    System.out.print(“rs is null”);
    }
    int getColumn = rsmt.getColumnCount();
    for (int i = 1; i <= getColumn; i++) {
    System.out.print("Column is " + rsmt.getColumnName(i));
    }
    System.out.println();
    while (rs.next()) {
    for (int i = 1; i <= getColumn; i++) {
    System.out.print(rs.getString(i));
    }
    System.out.println();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

    public void printTableForJdbcRowSet() {

    JdbcRowSet jrs = getRowSet();
    try {
    RowSetMetaData rsmt = (RowSetMetaData) jrs.getMetaData();
    if (rsmt == null) {
    System.out.print("jrs is null");
    }
    int getColumn = rsmt.getColumnCount();
    for (int i = 1; i <= getColumn; i++) {
    System.out.print("Column is " + rsmt.getColumnName(i));
    }
    while (jrs.next()) {
    for (int i = 1; i <= getColumn; i++) {
    System.out.print(jrs.getString(i));
    }
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

  11. Binh said

    Em xin lỗi Thầy cho em sữa lại đoạn code hoàn chỉnh:
    package Connect;

    import java.sql.*;

    import javax.sql.RowSetMetaData;
    import javax.sql.rowset.JdbcRowSet;

    import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
    import com.microsoft.sqlserver.jdbc.SQLServerException;
    import com.sun.rowset.JdbcRowSetImpl;

    public class ConnectSQL {

    public Connection getConnect() {
    Connection con = null;
    try {

    SQLServerDataSource consql = new SQLServerDataSource();
    consql.setDatabaseName(“WebShop”);
    consql.setUser(“sa”);
    consql.setPassword(“binhnguyen”);
    consql.setPortNumber(1433);
    consql.setServerName(“localhost”);
    con = consql.getConnection();
    } catch (SQLServerException e) {
    e.printStackTrace();
    }
    return con;

    }

    public ResultSet getResult(String query) {
    ResultSet rs = null;
    try {
    Statement stmt = getConnect()
    .createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);
    rs = stmt.executeQuery(query);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return rs;
    }

    public JdbcRowSet getRowSet() {
    JdbcRowSet rs= null;
    try {
    String query = “Select * from SinhVien”;
    rs = new JdbcRowSetImpl(getResult(query));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return rs;
    }

    public void printTableForResultSet() {
    String query = “Select * from SinhVien”;
    ResultSet rs = getResult(query);
    try {
    ResultSetMetaData rsmt = (ResultSetMetaData) rs.getMetaData();
    if (rsmt == null) {
    System.out.print(“rs is null”);
    }
    int getColumn = rsmt.getColumnCount();
    for (int i = 1; i <= getColumn; i++) {
    System.out.print("Column is " + rsmt.getColumnName(i));
    }
    System.out.println();
    while (rs.next()) {
    for (int i = 1; i <= getColumn; i++) {
    System.out.print(rs.getString(i));
    }
    System.out.println();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

    public void printTableForJdbcRowSet() {

    JdbcRowSet jrs = getRowSet();
    try {
    RowSetMetaData rsmt = (RowSetMetaData) jrs.getMetaData();
    if (rsmt == null) {
    System.out.print("jrs is null");
    }
    int getColumn = rsmt.getColumnCount();
    for (int i = 1; i <= getColumn; i++) {
    System.out.print("Column is " + rsmt.getColumnName(i));
    }
    while (jrs.next()) {
    for (int i = 1; i <= getColumn; i++) {
    System.out.print(jrs.getString(i));
    }
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }

    }

    public static void main(String[] args) {
    new ConnectSQL().printTableForResultSet();
    new ConnectSQL().printTableForJdbcRowSet();
    }

    }
    Kết quả em chạy chương trình :
    Column is idColumn is firstnameColumn is lastname
    1 Binh1 Nguyen 1
    2 Binh2 Nguyen 2

    Exception in thread "main" java.lang.ClassCastException: com.microsoft.sqlserver.jdbc.SQLServerResultSetMetaData cannot be cast to javax.sql.RowSetMetaData
    at Connect.ConnectSQL.printTableForJdbcRowSet(ConnectSQL.java:85)
    at Connect.ConnectSQL.main(ConnectSQL.java:106)
    Mong Thầy hướng dẫn cho em. Em đang rất cần . Thầy cho em hỏi một điểm nữa là có thể sử dụng CachedRowSet để phân trang được không? Vì mục đích em test CachedRowSet là để phân trang thay vì sử dụng dotJ.

  12. Binh said

    Em làm được all rồi . Cảm ơn Thầy!

  13. Le Duong said

    E chào Thầy đây là lần đầu tiên em đọc được trang web của Thầy. Và thấy Thầy đã rất tận tình giúp đỡ các bạn. Em cũng là SV đang phải làm đồ án gấp về java và em có làm kết nối MS SQL như hướng dẫn của Thầy và bây giờ em muốn đưa dữ liệu từ bảng lên nhưng em ko hiểu sao dùng lệnh kết nối ko đc lại phải ghi lại mặc dù kết nối SQL đã thành công, xong sau khi để kết xuất dữ liệu lên form mà em thiết kế = kéo thả JFrame thì nó vẫn báo lỗi. Mong Thầy sửa dùm em với ạ! Em rất mong sự giúp đỡ của Thầy!
    đây là đoạn code của em:
    /**************** Kết nối csdl ******************
    package DTO;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;

    public class ConnectODBC_ConString {
    private Connection con=null;
    public ConnectODBC_ConString() throws Exception{
    String url=”sun.jdbc.odbc.JdbcOdbcDriver”;
    Class.forName(url);
    String dbUrl=”jdbc:odbc:Driver={SQL Server};”
    + “Server=.;Database=qlvatlieuxd;UserName=sa;Password=”;
    con=DriverManager.getConnection(dbUrl);
    System.out.println(con.getCatalog());
    }

    ConnectODBC_ConString(String string) {
    throw new UnsupportedOperationException(“Not yet implemented”);
    }

    // public ConnectODBC_ConString(String string) {
    // throw new UnsupportedOperationException(“Not yet implemented”);
    //}
    /*
    * Lấy danh sách các mẫu tin của bảng CSDL
    * @param tableName: tên bảng cần lấy các dòng
    * @return danh sách các dòng được lưu trong 1 ResultSet
    * @throws SQLException
    */
    public ResultSet GetResultSet(String tableName)throws SQLException {
    ResultSet rs=null;
    Statement stmt=con.createStatement();
    String sql=”select * from “+tableName;
    rs=stmt.executeQuery(sql);
    return rs;
    }
    public int queryInsertUpdate(String query)
    {
    int result=0;
    try
    {
    Statement update = con.createStatement();
    result = update.executeUpdate(query);
    }
    catch(SQLException er)
    {
    er.printStackTrace();
    return -1;
    }
    return result;
    }
    public ResultSet querySelect(String query)
    {
    ResultSet result = null;
    try
    {
    Statement select = con.createStatement();
    result = select.executeQuery(query);
    }
    catch(SQLException er)
    {
    er.printStackTrace();
    return null;
    }
    return result;
    }
    public void Close()throws Exception{
    con.close();
    }
    /*Thử chương trình
    public static void main(String[] args) {
    try {
    System.out.println(“Danh sách Phiếu Xuất Kho – connection string”);
    ConnectODBC_ConString conDSN=new ConnectODBC_ConString();
    ResultSet rs=conDSN.GetResultSet(“T08_PXK”);
    while(rs.next()) {
    System.out.println(rs.getString(“MSPXK”));
    System.out.println(rs.getString (“MAKH”));
    System.out.println(rs.getString(“NGAY”));
    System.out.println(rs.getFloat(“PHI”));
    }
    conDSN.Close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    *
    */

    }
    /******************** đưa dữ liệu lên *********************************
    /*
    * DanhMucHangHoa.java
    *
    * Created on Feb 12, 2011, 3:48:02 PM
    */

    package DTO;

    import java.util.Vector;
    //import ketnoiSQL.ConnectODBC_ConString;
    import javax.swing.JFrame;
    import java.awt.*;
    import java.sql.ResultSet;
    import java.sql.*;
    /**
    *
    * @author user
    */
    public class DanhMucHangHoa extends JFrame {
    int row;
    Vector vectorHH;
    String sUpdate;
    ResultSet rs;

    //ConnectODBC_ConString con = new ConnectODBC_ConString(“”);

    /** Creates new form DanhMucHangHoa */
    public DanhMucHangHoa() {
    initComponents();
    }

    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    @SuppressWarnings(“unchecked”)
    //
    private void initComponents() {

    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jLabel3 = new javax.swing.JLabel();
    jLabel4 = new javax.swing.JLabel();
    jLabel5 = new javax.swing.JLabel();
    jLabel6 = new javax.swing.JLabel();
    jLabel7 = new javax.swing.JLabel();
    jLabel8 = new javax.swing.JLabel();
    jTextField1 = new javax.swing.JTextField();
    jTextField2 = new javax.swing.JTextField();
    jTextField3 = new javax.swing.JTextField();
    jTextField4 = new javax.swing.JTextField();
    jTextField5 = new javax.swing.JTextField();
    jTextField6 = new javax.swing.JTextField();
    jTextField7 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jButton3 = new javax.swing.JButton();
    jButton4 = new javax.swing.JButton();
    jButton5 = new javax.swing.JButton();
    jLabel9 = new javax.swing.JLabel();
    jTextField8 = new javax.swing.JTextField();
    jButton6 = new javax.swing.JButton();
    jButton7 = new javax.swing.JButton();
    jButton8 = new javax.swing.JButton();
    jButton9 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jLabel1.setText(“Danh Mục Hàng Hóa”);

    jLabel2.setText(“Mã Hàng”);
    jLabel2.setName(“lblMaHang”); // NOI18N

    jLabel3.setText(“Tên Hàng”);

    jLabel4.setText(“Quy Cách”);

    jLabel5.setText(“Đơn Vị Tính”);

    jLabel6.setText(“Giá Bán”);

    jLabel7.setText(“Số Lượng Tồn”);

    jLabel8.setText(“Giá Trị Tồn”);

    jTextField1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jTextField1ActionPerformed(evt);
    }
    });

    jButton1.setText(“&First”);
    jButton1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton1ActionPerformed(evt);
    }
    });

    jButton2.setText(“Next”);
    jButton2.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton2ActionPerformed(evt);
    }
    });

    jButton3.setText(“Privious”);
    jButton3.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton3ActionPerformed(evt);
    }
    });

    jButton4.setText(“Last”);
    jButton4.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton4ActionPerformed(evt);
    }
    });

    jButton5.setText(“Find”);
    jButton5.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton5ActionPerformed(evt);
    }
    });

    jLabel9.setText(“Tìm Theo Mã Hàng”);

    jButton6.setText(“New”);
    jButton6.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton6ActionPerformed(evt);
    }
    });

    jButton7.setText(“Save”);
    jButton7.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton7ActionPerformed(evt);
    }
    });

    jButton8.setText(“Update”);
    jButton8.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton8ActionPerformed(evt);
    }
    });

    jButton9.setText(“Delete”);
    jButton9.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton9ActionPerformed(evt);
    }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addContainerGap()
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 226, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addGap(146, 146, 146))
    .addGroup(layout.createSequentialGroup()
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(jLabel4))
    .addGap(22, 22, 22)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
    .addComponent(jTextField3)
    .addComponent(jTextField1)
    .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jLabel6)
    .addComponent(jLabel5)
    .addComponent(jLabel7)
    .addComponent(jLabel8))
    .addGap(22, 22, 22)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jTextField7, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 151, Short.MAX_VALUE)
    .addComponent(jTextField4, javax.swing.GroupLayout.DEFAULT_SIZE, 151, Short.MAX_VALUE)
    .addComponent(jTextField6, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 151, Short.MAX_VALUE))
    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGap(73, 73, 73))
    .addGroup(layout.createSequentialGroup()
    .addComponent(jLabel9)
    .addGap(29, 29, 29)
    .addComponent(jTextField8, javax.swing.GroupLayout.DEFAULT_SIZE, 269, Short.MAX_VALUE)
    .addGap(18, 18, 18)
    .addComponent(jButton5)
    .addGap(113, 113, 113))
    .addGroup(layout.createSequentialGroup()
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
    .addComponent(jButton6, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
    .addComponent(jButton1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    .addGap(26, 26, 26)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jButton2)
    .addComponent(jButton7))
    .addGap(24, 24, 24)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addComponent(jButton3)
    .addGap(18, 18, 18)
    .addComponent(jButton4))
    .addGroup(layout.createSequentialGroup()
    .addComponent(jButton8)
    .addGap(18, 18, 18)
    .addComponent(jButton9)))
    .addContainerGap(254, Short.MAX_VALUE))))
    );
    layout.setVerticalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addComponent(jLabel1)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(29, 29, 29)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel2)
    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGap(18, 18, 18)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel3)
    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGap(18, 18, 18)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING)
    .addComponent(jTextField3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
    .addGroup(layout.createSequentialGroup()
    .addGap(18, 18, 18)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(jLabel5))
    .addGap(18, 18, 18)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
    .addComponent(jLabel6)
    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(15, 15, 15)
    .addComponent(jLabel7))
    .addGroup(layout.createSequentialGroup()
    .addGap(18, 18, 18)
    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
    .addGap(18, 18, 18)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jLabel8)
    .addComponent(jTextField7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
    .addGap(28, 28, 28)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jButton1)
    .addComponent(jButton2)
    .addComponent(jButton3)
    .addComponent(jButton4))
    .addGap(18, 18, 18)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jButton6)
    .addComponent(jButton7)
    .addComponent(jButton8)
    .addComponent(jButton9))
    .addGap(57, 57, 57)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel9)
    .addComponent(jTextField8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(jButton5))
    .addGap(130, 130, 130))
    );

    pack();
    }//

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {

    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    row = 0;
    T03_DMHH hh = (T03_DMHH)vectorHH.get(row);
    jTextField1.setText(hh.getMaHang());
    sUpdate = hh.getMaHang();
    /*jTextField2.setText(hh.getTenHang());
    jTextField3.setText(hh.getQuyCach());
    jTextField3.setText(hh.getDVT());
    jTextField4.setText(hh.getSLTon());
    */

    }

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
    row = vectorHH.size()-1;
    T03_DMHH hh = (T03_DMHH)vectorHH.get(row);
    jTextField1.setText(hh.getMaHang());
    sUpdate = hh.getMaHang();
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    try{
    row++;
    T03_DMHH hh = (T03_DMHH)vectorHH.get(row);
    jTextField1.setText(hh.getMaHang());
    sUpdate = hh.getMaHang();
    }catch(Exception e){
    row = vectorHH.size()-1;
    }
    }

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    try{
    row–;
    T03_DMHH hh = (T03_DMHH)vectorHH.get(row);
    jTextField1.setText(hh.getMaHang());
    sUpdate = hh.getMaHang();
    }catch(Exception e){
    row = 0;
    }
    }

    private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {
    jTextField1.setText(“”);
    jTextField2.setText(“”);
    jTextField3.setText(“”);
    jTextField4.setText(“”);
    jTextField5.setText(“”);
    jTextField6.setText(“”);
    jTextField7.setText(“”);
    jTextField8.setText(“”);

    jButton7.setEnabled(true);
    jButton1.setEnabled(false);
    jButton2.setEnabled(false);
    jButton3.setEnabled(false);
    jButton4.setEnabled(false);
    jButton5.setEnabled(false);
    jButton6.setEnabled(false);
    jButton8.setEnabled(false);
    jButton9.setEnabled(false);
    }

    private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {
    try{
    ConnectODBC_ConString conDSN=new ConnectODBC_ConString();
    ResultSet rs=conDSN.GetResultSet(“T03_DMHH”);
    int result = conDSN.queryInsertUpdate(“insert into T03_DMHH(MAHANG,”
    + “TEN,QUYCACH,DVT,GIABAN,SLTON,TGTON) values (‘”+
    jTextField1.getText()+”‘,'”+jTextField2.getText()+
    “‘,'”+jTextField3.getText()+”‘,'”+jTextField4.getText()+
    “‘,'”+jTextField5.getText()+”‘,'”+jTextField6.getText()+
    “‘,'”+jTextField7.getText()+”‘)”);
    LoadData();
    conDSN.Close();
    }catch(Exception eSave){
    eSave.printStackTrace();
    }
    finally{
    // conDSN.Close();
    jButton7.setEnabled(false);
    jButton1.setEnabled(true);
    jButton2.setEnabled(true);
    jButton3.setEnabled(true);
    jButton4.setEnabled(true);
    jButton5.setEnabled(true);
    jButton6.setEnabled(true);
    jButton8.setEnabled(true);
    jButton9.setEnabled(true);
    }
    //this.setVisible(false);
    }

    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
    try{
    ConnectODBC_ConString conDSN=new ConnectODBC_ConString();
    ResultSet rs=conDSN.GetResultSet(“T03_DMHH”);
    int result = conDSN.queryInsertUpdate(“”
    + “Delete from T03_DMHH where MAHANG ='”+
    jTextField1.getText()+”‘”);
    LoadData();
    conDSN.Close();

    }catch(Exception e){
    e.printStackTrace();
    }
    }

    private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {
    if(jTextField1.getText().compareTo(sUpdate) == 0){
    try{
    ConnectODBC_ConString conDSN=new ConnectODBC_ConString();
    ResultSet rs=conDSN.GetResultSet(“T03_DMHH”);
    int result = conDSN.queryInsertUpdate(“”
    + “Update T03_DMHH set TEN,QUYCACH,DVT,GIABAN,SLTON,TGTON='”+
    jTextField2.getText()+”‘,'”+jTextField3.getText()+”‘,'”+
    jTextField4.getText()+”‘,'”+jTextField5.getText()+”‘,'”+
    jTextField6.getText()+”‘,'”+jTextField7.getText()+
    “‘ where MAHANG ='”+sUpdate+”‘”);
    LoadData();
    conDSN.Close();
    }catch(Exception eUpdate){
    eUpdate.printStackTrace();
    }
    }
    }

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {

    }
    public void LoadData(){
    row =0;
    vectorHH = new Vector();
    try{
    ConnectODBC_ConString conDSN=new ConnectODBC_ConString();
    ResultSet rs=conDSN.GetResultSet(“T03_DMHH”);
    while(rs.next()) {

    T03_DMHH hh = new T03_DMHH(rs.getString(“MAHANG”),
    rs.getString(“TEN”),rs.getString(“QUYCACH”),
    rs.getString(“DVT”),rs.getFloat(“GIABAN”),
    rs.getInt(“SLTON”),rs.getFloat(“TGTON”));
    vectorHH.add(hh);
    }
    conDSN.Close();
    }catch(Exception eLoad)
    {
    eLoad.printStackTrace();
    }
    if(vectorHH.size() > 0){
    T03_DMHH hh = (T03_DMHH)vectorHH.get(0);
    jTextField1.setText(hh.getMaHang());
    jTextField2.setText(hh.getTenHang());
    jTextField3.setText(hh.getQuyCach());
    jTextField4.setText(hh.getDVT());
    //jTextField5.set(hh.getGiaBan());
    sUpdate = hh.getMaHang();
    }
    }

    public boolean checkMaHang(String MaHang) throws Exception{
    try{
    ConnectODBC_ConString conDSN=new ConnectODBC_ConString();
    ResultSet rs=conDSN.GetResultSet(“T03_DMHH”);
    while(rs.next()){
    if(MaHang.compareTo(rs.getString(“MAHANG”))==0){
    // return true;
    }
    }
    conDSN.Close();
    return false;
    }catch(Exception echeck){
    echeck.printStackTrace();
    return true;
    }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new DanhMucHangHoa().setVisible(true);
    }
    });
    }

    // Variables declaration – do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JButton jButton7;
    private javax.swing.JButton jButton8;
    private javax.swing.JButton jButton9;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField3;
    private javax.swing.JTextField jTextField4;
    private javax.swing.JTextField jTextField5;
    private javax.swing.JTextField jTextField6;
    private javax.swing.JTextField jTextField7;
    private javax.swing.JTextField jTextField8;
    // End of variables declaration

    }

  14. Le Duong said

    Thưa Thầy khi chạy thì nó báo lỗi thế này ạ!
    Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
    at DTO.DanhMucHangHoa.jButton1ActionPerformed(DanhMucHangHoa.java:287)
    at DTO.DanhMucHangHoa.access$100(DanhMucHangHoa.java:19)
    at DTO.DanhMucHangHoa$2.actionPerformed(DanhMucHangHoa.java:97)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6267)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6032)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    BUILD SUCCESSFUL (total time: 9 seconds)

  15. Võ Văn Hải said

    Post lỗi như vậy thì chẳng thể biết chính xác là gì. Theo tôi đoán có lẽ là do lỗi của một đối tượng nào đó bị null trong file DanhMucHangHoa.java ở method actionPerformed. Bạn kiểm tra nhé!

  16. Võ Văn Hải said

    Em viết: “em muốn đưa dữ liệu từ bảng lên nhưng em ko hiểu sao dùng lệnh kết nối ko đc lại phải ghi lại mặc dù kết nối SQL đã thành công, xong sau khi để kết xuất dữ liệu lên form mà em thiết kế = kéo thả JFrame thì nó vẫn báo lỗi.”
    Tôi không hiểu ý em nói chỗ này là gì cả. Bây giờ em thử viết 1 lớp driver kết nối đến server sau đó truy vấn 1 bảng thử xem nó có OK không đã rồi hãy làm tiếp.


    public class TestDB{
    public static void main(String[]args)throws Exception{
    private Connection con=null;
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String dbUrl="jdbc:odbc:Driver={SQL Server};Server=.;Database=qlvatlieuxd;UserName=sa;Password=";
    con=DriverManager.getConnection(dbUrl);
    Statement st=con.createStatement("select * from yourtableName");
    ResultSet rs=st.executeQuery();
    while(rs.next()){
    System.out.println(rs.getString(1));
    }
    con.close()
    }
    }

  17. Le Duong said

    Cảm ơn Thầy đã giúp em. Em đã thử viết 1 lớp Connection rồi và đã thử truy vấn với bảng và cũng đã thành công. Nhưng khi em muốn sd lại lớp Connect đó để kết nối thì ko đc viết Connect_class ngay sau tên class ví dụ:
    public class DanhMucHangHoa extends JFrame {
    //sau đó là ta có thể đặt lệnh kết nối ngay ở đây như sau:
    Connect_class con = new Connect_class();//(*)
    mà phải đặt dòng lệnh trên sau mỗi phương thức nào nếu muốn truy xuất dữ liệu
    với cách này thì em có up được dữ liệu xong em thấy phải viết lại câu lệnh(*) nhiều lần quá. và khi em chạy
    thử form này thì em phải ấn vào nút Save thì nó mới hiện dữ liệu. NHưng vẫn có lỗi. Thầy ah Em gửi Thầy bài của em Thầy dành chút thời gian quý báu xem dùm em với Thầy nhé! Cảm ơn Thầy ạ!Mong hồi âm của Thầy!
    http://www.mediafire.com/?fljjj54vn65jxdx

  18. Le Duong said

    à em quên mất Thầy à trong bài của em khi Thầy xem Thầy sửa dùm em trong class Login có dòng báo lỗi classMain thầy sửa lại dùm em là MainClass với ạ. Em cảm ơn Thầy nhiều!

  19. mai said

    thay xem dum loi khi them ạ, load thi bthuong loi khi them em ko chinh dc a.

  20. Duy IT said

    hay,,đúng là thầy giáo tận tình

  21. son said

    Thầy cho em hỏi làm sao để tăng kích thước chiều dài giới hạn một String , vì em gặp phải trường hợp là khi tạo câu truy vấn , câu truy vấn của em khá dài nên đã vượt khỏi sức chứa của 1 String nên không cập nhật cơ sở dữ liệu được.

  22. Võ Văn Hải said

    >2 tỷ ký tự mà không đủ hả em? tôi không tin. Có khi em bị lỗi gì đó thôi.
    TÔi nghĩ là em không nên build 1 chuỗi truy vấn như thế mà em nên dùng câu truy vấn có tham số (dùng preparedStatement thay vì Statement) rồi truyền tham số vào. Hoặc pro hơn nữa là tạo 1 storedproc dưới database rồi dùng callableStatement để gọi.

  23. Phụng said

    Chào thầy!
    – Thấy có cách nào để insert chuỗi Unicode và CSDL sqlite3 ko?

  24. Tai said

    thầy ơi ! em insert dữ liệu kiểu ngày từ java vào oracle bị báo lỗi :
    Error code 1843, SQL state 22008: ORA-01843: not a valid month

    câu lệnh SQL là : insert docgia values(‘Hoang Khue’,’Q.5′,’05/06/1981′,’DG0004′,’X’,’2/07/2010′,’NV0002′)

    rồi em đem câu lệnh này vào oracle để chạy trực tiếp thì nó lại insert đc ,thầy giúp em sửa lỗi này với
    Em cảm ơn thầy !

  25. Mui said

    Thầy cho em hỏi làm sao để update date lên CSDL.

  26. Hương said

    Em cám ơn những bài giảng và những bài Demo rất bổ ích của thầy.
    Thực sự những tài liệu (mà với em là bài học) trong blog của thầy rất có giá trị với những sinh viên mới như em.
    Em xin cảm ơn sự giúp đỡ của thầy lần nữa và chúc thầy công tác tốt ạ.

  27. Huy Thang said

    Thưa thầy có cách nào tham chiếu sử dụng câu lệnh SQL trên dữ liệu ảo của ResultSet, RowSet… không ạ?

  28. Bui minh trung said

    hello.da e chao thay,thay co the giang cho e hiu insert delete update dc k ,e co lam oy ma e chưa hình dung la nen bắt đầu như nào ,từ đâu,da mong su hồi âm cua thầy,dear,!thanks

  29. Võ Văn Hải said

    da e chao thay,thay co the giang cho e hiu insert delete update dc k ,e co lam oy ma e chưa hình dung la nen bắt đầu như nào ,từ đâu,da mong su hồi âm cua thầy,dear,!thanks

    Cái này bạn tự học đã nghen.

  30. Võ Văn Hải said

    có cách nào tham chiếu sử dụng câu lệnh SQL trên dữ liệu ảo của ResultSet, RowSet… không ạ

    Em thử dùng JDBCRowSet thử.

  31. tatngth said

    backup và restore db mysql thế nào thầy?

  32. Ronaldo said

    Thầy ơi muốn kết nối cơ sở dữ liệu cho bảng e đã tạo ở phần Swing có phải viết lại từ đầu không, muốn sửa lại thì phải làm thế nào ak

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.Vector;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    import javax.swing.table.DefaultTableModel;

    public class QuanLySinhVien extends JFrame implements ActionListener{
    JPanel jPaneldau = new JPanel();
    JPanel jPanelcuoi = new JPanel();
    Vector Danhsach = new Vector();
    Vector Tieude = new Vector();

    JLabel jLabel1 = new JLabel(“Quan Ly Sinh Vien”);
    JPanel jPanel1 = new JPanel();
    JPanel jPanel2 = new JPanel();
    JPanel jPanel3 = new JPanel();
    JPanel jPanel4 = new JPanel();
    JPanel jPanel5 = new JPanel();

    JButton butAdd = new JButton(“ADD”);
    JButton butDelete = new JButton(“DELETE”);
    JButton butUpdate = new JButton(“UPDATE”);

    JPanel jPanelten = new JPanel();
    JLabel jLabelten = new JLabel();
    JTextField txtTen = new JTextField();
    JPanel jPaneltuoi = new JPanel();
    JLabel jLabeltuoi = new JLabel();
    JTextField txtTuoi = new JTextField();
    JPanel jPaneldiachi = new JPanel();
    JLabel jLabeldiachi = new JLabel();
    JTextField txtDiaChi = new JTextField();
    JLabel jLabelsex = new JLabel();
    JPanel JPanelsex = new JPanel();
    JTextField txtSex = new JTextField();

    JScrollPane jScrollPane = new JScrollPane();
    JTable tableList = new JTable();

    JPanel jPten = new JPanel();
    JLabel jLten = new JLabel();
    JTextField ten = new JTextField();
    JPanel jPtuoi = new JPanel();
    JLabel jLtuoi = new JLabel();
    JTextField tuoi = new JTextField();
    JPanel jPdiachi = new JPanel();
    JLabel jLdiachi = new JLabel();
    JTextField diachi = new JTextField();
    JPanel jPsex = new JPanel();
    JLabel jLsex = new JLabel();
    JTextField sex = new JTextField();

    public QuanLySinhVien() {
    Display();

    butAdd.addActionListener(this);
    butDelete.addActionListener(this);
    butUpdate.addActionListener(this);

    Tieude.add(“Ten”);
    Tieude.add(“Tuoi”);
    Tieude.add(“Dia Chi”);
    Tieude.add(“Gioi Tinh”);

    tableList.setModel(new DefaultTableModel(Danhsach, Tieude));

    setSize(800,600);
    setTitle(“Quan ly sinh vien”);
    }

    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == butAdd) {
    if(txtTen.getText().equals(“”)||txtTuoi.getText().equals(“”)||txtDiaChi.getText().equals(“”)){
    JOptionPane.showMessageDialog(rootPane, “Ban nhap thieu thong tin”);
    }
    else if(!txtSex.getText().equals(“Nam”)&&!txtSex.getText().equals(“Nu”)){
    JOptionPane.showMessageDialog(rootPane, “Ban chi duoc nhap (Nam/Nu)”);
    }
    else {
    Vector data = new Vector();
    data.add(txtTen.getText());
    data.add(txtTuoi.getText());
    data.add(txtDiaChi.getText());
    data.add(txtSex.getText());
    Danhsach.add(data);

    DefaultTableModel datatable = new DefaultTableModel(Danhsach,Tieude){
    public boolean isCellEditable(int row, int column) {
    return false;
    }
    };

    tableList.setModel(datatable);
    JOptionPane.showMessageDialog(rootPane, “Them thanh cong”);
    txtTen.setText(“”);
    txtTuoi.setText(“”);
    txtDiaChi.setText(“”);
    txtSex.setText(“”);
    }
    }

    if (e.getSource() == butDelete) {
    int row = tableList.getSelectedRow();
    if (row == -1) {
    JOptionPane.showMessageDialog(rootPane, “Ban chua chon du lieu can xoa”);
    } else {
    if (JOptionPane.showConfirmDialog(getRootPane(), “Ban co chac chan muon xoa”, “Lua chon”, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
    Danhsach.remove(row);
    tableList.setModel(new DefaultTableModel(Danhsach, Tieude));
    }
    }
    }

    if (e.getSource() == butUpdate) {
    int row = tableList.getSelectedRow();
    if (row == -1) {
    JOptionPane.showMessageDialog(rootPane, “Ban chua chon dong can sua”);
    } else {
    Vector data = new Vector();
    data.add(ten.getText());
    data.add(tuoi.getText());
    data.add(diachi.getText());
    data.add(sex.getText());
    Danhsach.set(row, data);
    tableList.setModel(new DefaultTableModel(Danhsach, Tieude));
    JOptionPane.showMessageDialog(rootPane, “Cap nhat xong”);
    }
    }
    }

    public void Display() {

    jPaneldau.setLayout(new GridLayout(3, 0));
    jPaneldau.add(jLabel1);

    jPanel1.setLayout(new GridLayout(1, 0));
    //jPaneldau.setBackground(Color.YELLOW);
    jPanelten.setLayout(new BorderLayout());
    jLabelten.setText(” Ten: “);
    jPanelten.add(jLabelten, BorderLayout.WEST);
    jPanelten.add(txtTen, BorderLayout.CENTER);
    jPanel1.add(jPanelten);

    jPaneltuoi.setLayout(new BorderLayout());
    jLabeltuoi.setText(” Tuoi: “);
    jPaneltuoi.add(jLabeltuoi, BorderLayout.WEST);
    jPaneltuoi.add(txtTuoi, BorderLayout.CENTER);
    jPanel1.add(jPaneltuoi);

    jPaneldiachi.setLayout(new BorderLayout());
    jLabeldiachi.setText(” DiaChi: “);
    jPaneldiachi.add(jLabeldiachi, BorderLayout.WEST);
    jPaneldiachi.add(txtDiaChi, BorderLayout.CENTER);
    jPanel1.add(jPaneldiachi);

    JPanelsex.setLayout(new BorderLayout());
    jLabelsex.setText(” GioiTinh: “);
    JPanelsex.add(jLabelsex,BorderLayout.WEST);
    JPanelsex.add(txtSex, BorderLayout.CENTER);
    jPanel1.add(JPanelsex);

    jPaneldau.add(jPanel1);
    jPanel2.add(butAdd);
    jPanel2.add(butDelete);
    jPaneldau.add(jPanel2);

    add(jPaneldau, BorderLayout.PAGE_START);
    jScrollPane.setViewportView(tableList);
    add(jScrollPane, BorderLayout.CENTER);

    jPanelcuoi.setLayout(new GridLayout(2, 0));
    jPanel3.setLayout(new GridLayout(1, 0));

    jPten.setLayout(new BorderLayout());
    jLten.setText(” Ten: “);
    jPten.add(jLten, BorderLayout.WEST);
    jPten.add(ten, BorderLayout.CENTER);
    jPanel3.add(jPten);

    jPtuoi.setLayout(new BorderLayout());
    jLtuoi.setText(” Tuoi: “);
    jPtuoi.add(jLtuoi, BorderLayout.WEST);
    jPtuoi.add(tuoi, BorderLayout.CENTER);
    jPanel3.add(jPtuoi);

    jPdiachi.setLayout(new BorderLayout());
    jLdiachi.setText(” DiaChi: “);
    jPdiachi.add(jLdiachi, BorderLayout.WEST);
    jPdiachi.add(diachi, BorderLayout.CENTER);
    jPanel3.add(jPdiachi);

    jPsex.setLayout(new BorderLayout());
    jLsex.setText(” Gioi Tinh: “);
    jPsex.add(jLsex, BorderLayout.WEST);
    jPsex.add(sex, BorderLayout.CENTER);
    jPanel3.add(jPsex);

    jPanelcuoi.add(jPanel3);
    jPanel5.add(butUpdate);
    jPanelcuoi.add(jPanel5);

    add(jPanelcuoi, BorderLayout.PAGE_END);
    pack();
    }

    public static void main(String args[]) {
    new QuanLySinhVien().setVisible(true);
    }

  33. huy said

    e chao thay, e tao 1 login vao forum dung bean va controller

    day la method trong bean
    public boolean login (String username, String password) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException{
    boolean check = false;
    Connection connection = null;
    Class.forName(“com.jdbc.mysql.Driver”).newInstance();
    connection = (Connection) DriverManager.getConnection(“jdbc:mysql:localhost/webapp01/”,”root”,””);
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery(“SELECT * FROM member”);
    while(rs.next()){
    if((rs.getString(“username”).equals(username))&& (rs.getString(“password”).equals(password))){
    check=true;
    break;
    }
    else check=false;
    }
    rs.close();
    return check;
    }

    con day la trong controller

    if(action.equals(“login”)){
    String usercheck = request.getParameter(“username”);
    String passcheck = request.getParameter(“password”);
    boolean check = false;

    try{
    bean01 checklogin = new bean01();
    check = checklogin.login(usercheck, passcheck);
    }
    catch (Exception e) {System.out.println(“exception”);}
    if (check){
    session.setAttribute(“weluser”,usercheck);
    response.sendRedirect(“welcomeuser.jsp”);
    }
    else
    response.sendRedirect(“loginagain.jsp”);

    }
    e bi loi la luc nao login cung fail mong thay giup do

  34. hi said

    bai nay rat hay —— like

  35. dung said

    cho em hỏi là : em vào 1 bài báo của trang web như 24h.com.vn , em bôi đen 1 đoạn văn và muốn so sánh với database của em , vậy pải làm cách nào vậy anh , em cảm ơn

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.