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());
}
}
}
运行程序结果如下: