1. mysql语句如下所示;
在mysql中创建数据库,密码设置为sqladmin;
drop database if exists mldn;
create database mldn;
use mldn;
drop table if exists emp;
create table emp(
empno int(4) primary key,
ename varchar(10) not null,
job varchar(10) not null,
hiredate date not null,
sal float(7,2) not null
);
desc emp; //查询表的结构
insert into emp (empno,ename,job,hiredate ,sal) values(1,'石也强','学生','2014-10-10','10000');
insert into emp (empno,ename,job,hiredate ,sal) values(2,'罗谨','工程师','2012-5-5','10000');
select *from emp;
2. 根据数据库中的字段定义对应的VO类,Emp.java
package shiyeqiang.vo; //value object
import java.util.Date;
public class Emp {
//本程序定义了雇员类,以及一序列的setter、getter方法,
private int empno;
private String ename;
private String job;
private Date hiredate;
private float sal;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
3. 定义数据库的连接及关闭资源类:DatabaseConnection.java
package shiyeqiang.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
// 该类主要是用于完成数据库的打开以及关闭操作
// 在构造方法完成打开,close()方法完成关闭,所有异常直接抛出,交给调用处 处理
public static void main(String[] args) {
}
private static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; // 定义mysql中的数据库驱动程序
private static final String DBURL = "jdbc:mysql://localhost:3306/mldn"; // 定义数据库的连接地址,其中mldn为数据库的名称
private static final String DBUSER = "root"; // 定义数据库的连接用户名
private static final String DBPASS = "sqladmin"; // 定义数据库的连接密码
private Connection conn = null; // 数据库连接
public DatabaseConnection() throws Exception {
// 在构造方法内,进行数据库的连接操作
try {
Class.forName(DBDRIVER); // 加载驱动
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);// 试图建立到给定数据库
} catch (Exception e) { // 为了方便,直接抛出Exception异常
throw e;
}
}
public Connection getConnection() { // 取得数据库的连接
return this.conn;
}
public void close() throws SQLException {
if (this.conn != null) {
try {
this.conn.close();
} catch (SQLException e) {
throw e;
}
}
}
}
4: 定义DAO操作的标准,IEmpDAO接口内部定义一序列的操作接口
package shiyeqiang.dao;
import java.util.List;
import shiyeqiang.vo.Emp; //导入雇员类所在的VO包
public interface IEmpDAO { // 定义DAO操作的标准;
// doXXX:表示数据的增加操作
public boolean doCreate(Emp emp) throws Exception;
// findAll:表示数据的查询操作,返回的是Emp的list集合
public List<Emp> findAll(String keyWord) throws Exception;
// findById:表示根据员工编号查询,返回的是Emp对象
public Emp findById(int empno) throws Exception;
}
package shiyeqiang.dao.impl;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import shiyeqiang.dao.IEmpDAO;
import shiyeqiang.vo.Emp;
public class EmpDAOImpl implements IEmpDAO { // 真实主题实现类
// 真实主题没有进行数据库的打开和关闭操作,只是通过构造方法取得了数据库的连接
// 真正负责数据库的打开和关闭操作交给代理类完成
private Connection conn = null; // 数据库连接对象
private PreparedStatement psmt = null;// 数据操作对象
public EmpDAOImpl(Connection conn) { // 通过构造方法完成数据库的连接
this.conn = conn;
}
@Override
// 数据更新操作,将emp对象插入到数据库中,
public boolean doCreate(Emp emp) throws Exception {
boolean flag = false;
String sql = "insert into emp (empno,ename,job,hiredate ,sal) values(?,?,?,?,?)"; // 插入语句
this.psmt = this.conn.prepareStatement(sql);
this.psmt.setInt(1, emp.getEmpno()); // 下面为依次给?号赋值的操作
this.psmt.setString(2, emp.getEname());
this.psmt.setString(3, emp.getJob());
this.psmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime()));
this.psmt.setFloat(5, emp.getSal());
int num = this.psmt.executeUpdate(); // 数据更新的操作,返回记录的条数
if (num > 0) {
flag = true;
}
this.psmt.close(); // 数据操作对象关闭
return flag;
}
@Override
// findAll:表示数据的查询操作,返回的是Emp的list集合
public List<Emp> findAll(String keyWord) throws Exception {
List<Emp> all = new ArrayList<Emp>();
String sql = "select empno,ename,job,hiredate ,sal from emp where ename like ? or job like ?"; // 将雇员的姓名和职位定义成模糊查询
this.psmt = this.conn.prepareStatement(sql); // 准备数据操作
this.psmt.setString(1, "%" + keyWord + "%");
this.psmt.setString(2, "%" + keyWord + "%");
ResultSet rs = this.psmt.executeQuery();
Emp emp = null;
while (rs.next()) {
emp = new Emp();
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
Date hiredate = rs.getDate(4);
float sal = rs.getFloat(5);
emp.setEmpno(empno);
emp.setEname(ename);
emp.setJob(job);
emp.setHiredate(hiredate);
emp.setSal(sal);
all.add(emp);
}
this.psmt.close();
return all;
}
@Override
// findById:表示根据员工编号查询,返回的是Emp对象
public Emp findById(int empno) throws Exception {
String sql = "select empno,ename,job,hiredate ,sal from emp where empno=?"; // 将雇员的姓名和职位定义成模糊查询
this.psmt = this.conn.prepareStatement(sql); // 准备数据操作
this.psmt.setInt(1, empno);
ResultSet rs = this.psmt.executeQuery();
Emp emp = null;
while (rs.next()) {
emp = new Emp();
int no = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
Date hiredate = rs.getDate(4);
float sal = rs.getFloat(5);
emp.setEmpno(no);
emp.setEname(ename);
emp.setJob(job);
emp.setHiredate(hiredate);
emp.setSal(sal);
}
this.psmt.close();
return emp;
}
}
6: 代理主题实现类:EmpDAOProxy
代理类的作用:连接数据库,调用真实的主题类来完成操作,资源的关闭在每一个方法内部
package shiyeqiang.dao.proxy;
import java.util.List;
import shiyeqiang.dao.IEmpDAO;
import shiyeqiang.dao.impl.EmpDAOImpl;
import shiyeqiang.dbc.DatabaseConnection;
import shiyeqiang.vo.Emp;
public class EmpDAOProxy implements IEmpDAO { // 代理类的作用:连接数据库,调用真实的主题类来完成操作,资源的关闭在每一个方法内部
public static void main(String[] args) {
}
private DatabaseConnection dbc = null; // 定义连接数据库的操作
private EmpDAOImpl dao = null; // 真实主题类
public EmpDAOProxy() throws Exception {
// 构造方法内:连接数据库,实例化真实主题类
this.dbc = new DatabaseConnection();
this.dao = new EmpDAOImpl(this.dbc.getConnection());
}
@Override
public boolean doCreate(Emp emp) throws Exception {
boolean flag = false;
try {
if (this.dao.findById(emp.getEmpno()) == null) {
// 如果雇员的编号不存在的话,则可以进行插入操作
flag = this.dao.doCreate(emp);
}
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return flag;
}
@Override
public List<Emp> findAll(String keyWord) throws Exception {
List<Emp> all = null;
try {
all = this.dao.findAll(keyWord);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return all;
}
@Override
public Emp findById(int empno) throws Exception {
Emp emp = null;
try {
emp = this.dao.findById(empno);
} catch (Exception e) {
} finally {
this.dbc.close();
}
return emp;
}
}
7:工厂类:取得代理类的实例
package shiyeqiang.factory;
import shiyeqiang.dao.proxy.EmpDAOProxy;
public class DAOFactory { // 取得DAO接口的实例化对象
public static EmpDAOProxy getIEmpDAOInstance() throws Exception {
return new EmpDAOProxy(); // 取得代理类的实例
}
}
8:测试代码:
package text;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import shiyeqiang.factory.DAOFactory;
import shiyeqiang.vo.Emp;
public class TetsInsect {
public static void main(String[] args) throws Exception {
List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll("");
Iterator<Emp> iterator = all.iterator();
while (iterator.hasNext()) {
Emp emp = iterator.next();
System.out
.println("编号:" + emp.getEmpno() + " 姓名:" + emp.getEname());
}
}
}