您的位置:首页 > 数据库

数据持久层DAO的建立和使用,实现数据库的连接

2017-02-03 22:59 821 查看
//DAO接口
package ex3;
import java.sql.Connection;
public interface DAO {
public Connection getConnection();//声明连接方法
}
//StudentDAO接口
package ex3;
import java.util.List;
public interface StudentDAO{
public void insertStudent(Student stu);//声明插入(增)方法
public void updateStudent(Student stu);//声明更新(改)方法
public void deleteStudent(String sid);//声明删除方法
public Student getStudent(String sid);//声明查询一个学生信息的方法
public List<Student> getStudentByC(String sql);// 声明查询多个学生信息的方法
}
// DAOBase连接基类
//每一个DAO对象中都有一个连接方法,进一步抽象为DAOBase连接基类
package ex3;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DAOBase implements DAO {//实现DAO接口中的连接方法
@Override
public Connection getConnection() {//实现连接
Connection conn = null;
try {
//加载JDBC驱动
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
//连接服务器和数据库sample
String dbURL = "jdbc:sqlserver://localhost:1433; DatabaseName=EDUCATION";
//构建url=数据库管理系统的标识+数据库管理系统的地址(ip+端口)+使用的数据库实例名称
String userName = "sa"; //默认用户名
Stri
4000
ng userPwd = "123456"; //密码
try{
Class.forName(driverName);//加载驱动
}catch (ClassNotFoundException e) {
System.out.println("无法找到驱动类!");
e.printStackTrace();
}
//建立连接
conn = DriverManager.getConnection(dbURL,userName,userPwd);
System.out.println("Connection Successful!"); //如果连接成功 控制台输出
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
//Student实体
package ex3;
public class Student {
private int sno;//学号
private String sn;//姓名
private String sex;//性别
private String bor;//生日
private String clano=null;//班号
private int age;//年龄
public int getsno() {//获得学号
return sno;
}
public void setsno(int sno) {//设置学号
this.sno = sno;
}
public String getsn() {//获得姓名
return sn;
}
public void setsn(String sn) {//设置姓名
if(sn==null){
System.out.println("姓名不能为空!");
}
this.sn = sn;
}
public String getsex() {//获得性别
return sex;
}
public void setsex(String sex) {//设置性别
if(sex==null){
System.out.println("性别不能为空!");
}
this.sex = sex;
}
public String getbor() {//获得生日
return bor;
}
public void setbor(String bor) {//设置生日
if(bor==null){
System.out.println("生日不能为空!");
}
this.bor = bor;
}
public String getclano() {//获得班号
return clano;
}
public void setclano(String clano) {//设置班号
this.clano =clano;
}
public int getage() {//获得年龄
return age;
}
public void setage(int age) {//设置年龄
this.age = age;
}
}
//StudentDAOMSImpl类(StudentDAO中方法的实现)
package ex3;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import ex3.Student;
public class StudentDAOMSImpl extends DAOBase implements StudentDAO {//继承DAOBase连接基类,实现StudentDAO接口中声明的方法
@SuppressWarnings("resource")
public static void Input(Student stu) throws IOException{
//此方法用于输入学生信息
Scanner ReadInt=new Scanner(System.in);
Scanner ReadStr=new Scanner(System.in);
System.out.println("请输入一个学生的信息:");
System.out.println("学号:");
stu.setsno(ReadInt.nextInt());
System.out.println("姓名:");
stu.setsn(ReadStr.nextLine());
System.out.println("性别:");
stu.setsex(ReadStr.nextLine());
System.out.println("生日(xxxx-xx-xx):");
stu.setbor(ReadStr.nextLine());
System.out.println("班号:");
stu.setclano(ReadStr.nextLine());
System.out.println("年龄:");
stu.setage(ReadInt.nextInt());
}
private static final String CREATE_STUDENT_SQL ="INSERT INTO Student values(?,?,?,?,?,?)";
@Override
public void insertStudent(Student stu) {//实现插入方法(增)
Connection conn = null;
PreparedStatement pst = null;
try{
conn = getConnection();//连接数据库
Input(stu);//输入学生信息
pst = conn.prepareStatement(CREATE_STUDENT_SQL);
pst.setInt(1,stu.getsno());
pst.setString(2, stu.getsn());
pst.setString(3, stu.getsex());
pst.setString(4,stu.getbor());
pst.setString(5, stu.getclano());
pst.setInt(6,stu.getage());
int row=pst.executeUpdate();
System.out.println("成功更新了"+row+"行数据!");
pst.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}finally{
if(pst!=null)
try {
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void updateStudent(Student stu) {//实现更新(改)方法
//先删除,再插入;也可以用已有的update set 列=值,……
// TODO Auto-generated method stub
try{
Connection conn = null;
Statement stmt = null;
int rs ;
try {
conn = getConnection();//连接数据库
Scanner ReadStr=new Scanner(System.in);
System.out.println("请输入要更新学生的学号:");
stmt = conn.createStatement();
String sql = "delete from Student where sno=";
//删除已有学生信息
rs = stmt.executeUpdate(sql+ReadStr.nextLine());
//返回结果
insertStudent(stu);//插入新的学生信息
//显式释放资源
stmt.close();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void deleteStudent(String sid) {//实现删除方法
// TODO Auto-generated method stub
Connection conn = null;
Statement stmt = null;
int rs ;
try {
conn = getConnection();//连接数据库
Scanner ReadStr=new Scanner(System.in);
System.out.println("请输入要删除学生的学号:");
sid=ReadStr.nextLine();
stmt = conn.createStatement();
String sql = "delete from Student where sno=";
rs = stmt.executeUpdate(sql+Integer.parseInt(sid));//返回结果
System.out.println("成功删除了"+rs+"行数据!");
//显式释放资源
stmt.close();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static final String SEARCH_STUDENTC1 = "SELECT sno,sn,sex,bor,clano,age FROM Student WHERE sno=";
@Override
public Student getStudent(String sid) {//实现查询一个学生信息的方法
// TODO Auto-generated method stub
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
Student stu = new Student();
try{
conn = getConnection();
stmt = conn.createStatement();
Scanner ReadStr=new Scanner(System.in);
System.out.println("请输入要查询学生的学号:");
sid=ReadStr.nextLine();
String endsql = null;
endsql = SEARCH_STUDENTC1 +Integer.parseInt(sid);
rs=stmt.executeQuery(endsql);
while(rs.next()){
stu.setsno(rs.getInt("sno"));
stu.setsn(rs.getString("sn"));
stu.setsex(rs.getString("sex"));
stu.setbor(rs.getString("bor"));
stu.setclano(rs.getString("clano"));
stu.setage(rs.getInt("age"));
System.out.println(stu.getsno()+"     "+stu.getsn()+""+stu.getsex()+""+stu.getbor()+""+stu.getclano()+""+stu.getage());
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
private static final String SEARCH_STUDENTC = "SELECT sno,sn,sex,bor,clano,age FROM Student";
@Override
public List<Student> getStudentByC(String sql) {
//实现查询多个学生信息的方法
List<Student> students = new ArrayList<Student>();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = getConnection();
stmt = conn.createStatement();
String endsql = null;
if(sql.equals("")){
endsql = SEARCH_STUDENTC;
}else{
endsql = SEARCH_STUDENTC + " WHERE "+sql;
}
rs=stmt.executeQuery(endsql);
while(rs.next()){
Student student = new Student();
student.setsno(rs.getInt("sno"));
student.setsn(rs.getString("sn"));
student.setsex(rs.getString("sex"));
student.setbor(rs.getString("bor"));
student.setclano(rs.getString("clano"));
student.setage(rs.getInt("age"));
students.add(student);
}
for(int i=0;i<students.size();i++){
Student s = new Student();
s=students.get(i);
System.out.println(s.getsno()+"     "+s.getsn()+""+s.getsex()+""+s.getbor()+""+s.getclano()+""+s.getage());
}
rs.close();
stmt.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}finally{
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return students;
}
}
//DAOFactory工厂类
/*业务在实际操作数据的时候,还需要知道究竟使用的是哪个数据库管理系统的DAO对象,为了屏蔽这一过程,进一步使用工厂类DAOFactory。
DAOFactory使用工厂方法返回满足DAO接口的实际操作对象。*/
package ex3;
public class DAOFactory {
private static DAOFactory instance;	//声明instance为工厂类
static{
instance = new DAOFactory();	//new一个工厂类的instance
}
private DAOFactory(){//构造函数
}
public static DAOFactory getInstance(){
return instance;					//返回一个工厂类的instance
}
public static StudentDAO getStudentDAO(){
//获得StudentDAO对象,其实是StudentDAOMSImpl对象
StudentDAO studentDAO = new StudentDAOMSImpl();
return studentDAO;
}
}

1编写程序前要先导入JDBC驱动包。

2更新操作可以用先删除,再插入来实现,也可以用已有的update
set 列=值,……来实现。

3使用游标前要先给其赋值。

4现在一般在java中不用Date类,多用Calendar。在实验中可用String代替日期格式。

5从控制台输入可用stu.setsno(ReadInt.nextInt());和stu.setsn(ReadStr.nextLine());(Scanner ReadInt=newScanner(System.in);Scanner ReadStr=new Scanner(System.in);)

6每用PreparedStatement更新一行记录,更新数据后面都要紧跟pst.executeUpdate()。

7Student类中属性设为private,为了保证其安全性,可在对象类中的setter和getter中添加条件,判断传给成员项的值是否正确。

1、在DAO技术中,首先,对所有数据库中的关系建立对应的基本对象。如:Student实体类。还需建立对应于基本对象的操作数据操作对象,如对于student对象而言,应建立studentDAO操作对象。DAO操作对象包含了对于基本对象的插入、更新、修改、检索等对象操作。

2、由于每一个DAO对象中都有一个方法getConnection().考虑进一步抽象。面向对象的继承特点是提升抽象的内容,构成对象的基类。

3、业务在实际操作数据的时候,还需要知道究竟使用的是哪个数据库管理系统的DAO对象,为了屏蔽这一过程,进一步使用工厂类DAOFactory。

DAOFactory使用工厂方法返回满足DAO接口的实际操作对象。

业务逻辑仅需要调用DAOFactory.getInstance().get***DAO()即可获得操作数据库的DAO对象,而无需关心实现DAO的是哪一个数据库管理系统的DAO对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: