Easyui+servket+javabean模式
實體層
持久層
業務層
項目 https://gitee.com/night_lack/easyui_servlet_javabean.git
實體層創建
其實就是爲每一張數據表創建創建一個實體類,實體類的成員變量的變量名、類型、長度和個數要和數據表的字段名、字段類型、字段長度和個數要一致。
如:login數據表的表結構如下圖所示。
則login數據表的實體類的代碼如下。
package entity;
public class LoginEntity {
private long id;
private String name;
private String pass;
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPass() { return pass; }
public void setPass(String pass) { this.pass = pass; }
}
持久層創建
第一步:在項目中的"Java Resources\src目錄中創建一個數據包,包名爲dao,然後右單擊數據包“ado”彈出如下的快捷菜單。
第二步:單擊“new->class”創建數據庫連接類DataConnection.java,如下圖所示。
第三步:單擊“Finish”按鈕完成DataConnection.java的創建。如下圖所示。
第四步:編寫DataConnection.java類的代碼,(注意引入的是com.sql下的包))代碼如下
package ado;
import java.lang.reflect.*; //反射類庫
import java.sql.*; //連接mysql數據庫相關的類都存入在java.sql數據包中,所以我們採用了"java.sql.*".
import java.util.*;// java工具包
public class DataConnection<T>{
//連接數據庫的驅動程序的字符常量
private static final String DBDRIVER="org.gjt.mm.mysql.Driver";
//連接數據庫地址,其中jdbc是連接數據庫的主協議;mysql是子協議;localhost:3306是我們在本機上安裝的mysql數據庫管理服務器名,stsc是在myssql數據庫系統中創建的數據庫名
private static final String DBURL="jdbc:mysql://localhost/stsc";
//連接數據庫管理員,是mysql數據庫的系統管理員root
private static final String DBUSER="root";
//連接數據庫管理員登錄密碼,是在安裝mysql數據庫時,給定的密碼
private static final String DBPASS="admin";
private static Connection conn=null;
/**
* 方法用於獲取數據庫連接對象
* @return 連接成功返回數據庫連接對象(Connection類的對象)
*/
public static Connection getConn(){
try {
//加載驅動程序
Class.forName(DBDRIVER);
//獲取數據庫連接對象
conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS);
//連接成功返回連接對象
return conn;
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
//如果連接失敗返回null
return conn;
}
}
/**
* 用於對數據庫操作對象進行關閉操作,一般對數據庫進行操作對象都是這三個類(ResultSet,PreparedStatement ,Connection )的對象
* @param rs 保存從數據表取加的數據集
* @param psta 執行sql命令的對象
* @param conn 連接數據對象
*/
public static void close(ResultSet rs,PreparedStatement psta,Connection conn){
try {
//判斷rs不爲空,則它存在,就關閉它
if(rs != null){
rs.close();
}
//判斷psta不爲空,則它存在,就關閉它
if(psta != null){
psta.close();
}
//判斷conn不爲空,則它存在,就關閉它
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 執行insert、update和delete命令的方法
* @param sqlcomm sql命令字符串
* @param para sql命令中參數參數所對應的值
* @return 執行命令成功返回true,否則返回false
*/
public static boolean request(String sqlcomm,Object ... para){
boolean flag=false;
try {
//創建數據庫連接
Connection conn=getConn();
//創建執行sql命令的對象
PreparedStatement psta = conn.prepareStatement(sqlcomm);
//判斷命令中是否有參數,若沒有參數,則把參數值的數組設置爲0
if(para==null){
para=new Object[0];
}
//遍歷參數列表,並進行賦值
for(int i=0;i<para.length;i++){
psta.setObject(i+1, para[i]);
}
//執行sql命令
int i=psta.executeUpdate();
if(i>0){
flag= true;
}
close(null, psta, conn);
return flag;
} catch (SQLException e) {
return false;
}
}
/**
* 用於執行查詢命令
* @param cls 數據表所對應的實體類
* @param sql 要執行的sql查詢命令
* @param para 要執行的sql命令中參數所對應的值,若沒有則爲null
* @return 返回數據集,數據集中的第一個元素都是cls的對象
*/
public List<T> query(Class<T> cls , String sql, Object ... para){
List<T> list = new ArrayList<>();
try {
conn = getConn();
PreparedStatement psta = conn.prepareStatement(sql);
//判斷命令中是否有參數,若沒有參數,則把參數值的數組設置爲0
if(para==null){
para=new Object[0];
}
//遍歷參數列表,並進行賦值
for(int i=0;i<para.length;i++){
psta.setObject(i+1, para[i]);
}
ResultSet rs = psta.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();//rs中列的名稱和類型的信息,並把它賦給rsmd,如:select id,name,pass from login,rsmd爲得列名稱爲id,name,pass,列的類型爲long、String、String等信息
while(rs.next()){
T obj = cls.newInstance(); //創建這個類的新的實例
int col = rsmd.getColumnCount();//獲取rs中的列數據,取sql命令中所給的字段 數,如 select id,name,pass from login,則col=3
//遍歷rs中所有列
for (int i=1; i<=col; i++){
String DBField = rsmd.getColumnLabel(i); //獲取第i列名稱
Field field = cls.getDeclaredField(DBField); //獲取cls類中定的成員變量名與列名DBField
field.setAccessible(true); //私有可見
field.set(obj, rs.getObject(i));//把rs元素中的第i個列的值,賦給對象obj的field成員變量
}
list.add(obj);//obj添加到list中
}
close(rs, psta, conn);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
第四步:測試DataConnection.java類是否能夠正確的應用。
1、測試是否能夠連接到數據庫,我們在data數據包創建一個Test.java類,代碼如下。
package ado;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(DataConnection.getConn().toString());
}
}
運行Test.java程序,若見如下的信息,則表示連接成功。
com.mysql.jdbc.JDBC4Connection@d8cfe0
2、測試是否能夠正確執行增刪改操作,代碼如下。
package ado;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String sql="insert into login(name,pass) values(?,?)";//定義要執行的sql命令
Object[] para=new Object[]{new String("test"),new String("test")};//定義兩個一個數組用於存放與sql命令參數對應的數據值。
if(DataConnection.request(sql, para)){//調用數據庫類中的request()方法,執行sql命令,若執行成功返回true,否則返回false
System.out.println("添加數據成功");
}else{
System.out.println("添加數據失敗");
}
}
}
運行程序結果如下。
3、測試查詢命令是否能夠執行,代碼如下。
package ado;
import java.util.*;
import entity.LoginEntity;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String sql="select id,name,pass from login ";//定義要執行的sql命令
LoginEntity Login=new LoginEntity();//創建數據表的實體類
DataConnection dc=new DataConnection<LoginEntity>();//創建數據庫類的對象
List<LoginEntity> list=dc.query(Login.getClass(), sql, null);//調用查詢方法返回數據集
for (LoginEntity LoginEntity : list) {//採用遍歷方式把數據進行輸出
System.out.println("id="+LoginEntity.getId()+",name="+LoginEntity.getName()+",pass="+LoginEntity.getPass());
}
}
}
運行程序結果如下: