首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

DAO连接数据库,也良好

2012-08-19 
DAO连接数据库,也很好预备知识:抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体

DAO连接数据库,也很好

预备知识:抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

?适用性:1.一个系统要独立于它的产品的创建、组合和表示时。

?

2.一个系统要由多个产品系列中的一个来配置时。

?

3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。

?

?4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。

?DAO: Data Access Object.

:a Data Access Object provides the operations to create, delete, update, and find data in a database. (提供了对数据库增删改查的操作的方法. DTO: Data Transfer Objects(数据操作转换的对象,就是操作对象的一个类型的实例) -- ===================================================================================

?

1.连接工厂(Connection Factory):获得数据库的连接

?

2.DAO Factory: 获得不同的DAO

?

3.构建一个抽象工厂(Abstract Factory): 需要进行数据库的判断,根据不同的数据库提供不同的Factory 比如:OracleDaoFactory, SqlDaoFactory 以上的Factory均继承Factory.

?

?4.构建DAO步骤:

(1)需要一个DAO接口,接口;里面定义增删改查方法.

(2)用具体的实现类,实现接口中的方法,对于不同的数据库.创建不同的实现操作类.

?

5.调用步骤: (1)根据不同的数据库,从Connection Factory中获取连接.

(2)从DAO Factory中获得不同的DAO 工厂模式的优化: 将连接工厂封装到数据库工厂里面,对于具体的数据库进行具体的连接操作. 即:指定了数据库,那么我就可以进行指定的数据库连接操作了. -- ====================================================================================

具体实现如下: (仅实现了SQL Server2005 的连接,实现的一个添加的操作.其他的可以按照这个具体实现) 首先,定义一个DTO,我这里定义一个Student类: 属性为:学生姓名,密码和学号.代码如下:

?

public class Student {

?//学生姓名

?? ?private String stuName;

?//密码

??? private String stuPwd;

?//学生学号

?? private int stuId;

? //get和set方法

?

??public String getStuName()

??? {

??????? return stuName;

?? ?}

?

?public void setStuName(String stuName)

{

??? this.stuName = stuName;

? }

?

?public String getStuPwd() {

???? return stuPwd;

?? ?}

?

public void setStuPwd(String stuPwd)??? {

?? this.stuPwd = stuPwd;

?}

?

public int getStuId() {

?????? return stuId;

}

?

public void setStuId(int stuId) {

????? ?this.stuId = stuId;

}

?}

/*------------------------------------------*/

现在,我们建立一个DAO的接口,定义对数据库student的增删改查操作具体的实现由确定数据库后进行操作.具体代码如下:

?

public interface IStuOperDao {

?? /** * 添加学生 * @param stu 学生对象 */

?

public int addStu(Student stu);

?

?/** * 按照学号删除学生信息 * @param stuId 学生学号 */

?

?public int delStu(int stuId);

?

/** * 根据学生学号来获取学生信息 * @param stuId 学生学号 */

?

?public Student getStu(int stuId);

?

/** * 根据学号 修改学生信息 * @param stuId 学生学号 * @return 影响行数 */

?

?public int updateStu(int stuId); }

?

?/*--------------------------------*/

?

在这个接口的实现类中,对每个数据库我们都应该定义一个实现类,因为每种数据库的操作是不同的这也是我们在这里定义接口的好处,可以很方便地添加新的数据库实现. 这里具体实现的为SQL Server 2005的实现类.具体代码如下:

?

?public class SqlStuOperDAOImp implements IStuOperDao {

?

private Connection conn;

?

/** * 利用构造函数对conn进行初始化 * * @param conn */

?

?public SqlStuOperDAOImp(Connection conn) {

?

?????????? this.conn = conn;

??}

?

@Override

?

?public int addStu(Student stu) {

???????

???? ??Statement stmt = null;

?

???? //执行的SQL语句

?

?? ?String sql = "insert into student values('" + stu.getStuName() + "','" + stu.getStuPwd() + "')";

?

?? ?int num = 0;

?

??? try {

?

? ?//获取连接的Statement对象

?

stmt = conn.createStatement();

?

?//执行SQL语句,返回影响的行数

?

num = stmt.executeUpdate(sql);

?} catch (SQLException e) {

e.printStackTrace(); }

?

finally{ //关闭资源.

?try { if (stmt != null) { stmt.close(); }

if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return num; }

?

@Override

?

public int delStu(int stuId) {

?// TODO Auto-generated method stub return 0;

?}

?

@Override

?

public Student getStu(int stuId) {

?

// TODO Auto-generated method stub return null;

}

?

@Override

?

?public int updateStu(int stuId) {

// TODO Auto-generated method stub return 0;

} }

?

/*--------------------------------*/

?

现在,开始创建一个抽象工厂,判断不同的数据库,对不同的数据库,实例化不同的子类. 同时定义一个抽象方法,让其子类实现具体的操作.具体代码如下: /** * 构建抽象DAO工厂 * 此工厂根据不同的数据库产品得到对应数据库工厂

* @author Mc * */

?

public abstract class DaoFactory {

?

//SQL Server数据库的标识 private static final int sqlFlag =1;

?

//Oracle数据库的标识 private static final int oracleFlag = 2;

?

/** * 根据数据库的不同,获得不同的DAO工厂 * @param flag * @return */

?

public static DaoFactory getDaoFactory (int flag){

?

switch (flag) {

?

?case sqlFlag: return new SqlDaoFactory();

?

?case oracleFlag: return new OracleDaoFactory();

?

? default: return null;

?

} }

?

//抽象方法,子类具体实现,不同的数据库子类实现其对应的方法

public abstract IStuOperDao getStuOperDao();

}

?

/*--------------------------------*/

?

其子类的实现类为对应的不同的数据库,我这里实现的是对SQL Server 2005数据库. 具体代码如下:

?

public class SqlDaoFactory extends DaoFactory {

?

//数据库名称 private static String url = "jdbc:sqlserver://127.0.0.1:1433;databasename=J1106";

?

?//数据库驱动 private static String driveName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

?

//数据库帐号 private static String userName = "sa";

?

//数据库密码 private static String userPwd = "123";

?

@Override public IStuOperDao getStuOperDao() {

?

//先建立连接 Connection conn =null; try {

?

?//第一步,加载驱动 Class.forName(driveName);

?if (conn == null) {

?

?conn = DriverManager.getConnection(url,userName,userPwd);

?

?} } catch (ClassNotFoundException e) {

?e.printStackTrace(); } catch (SQLException e)

?{ e.printStackTrace(); }

?

?//返回对应的操作实现类

?

return new SqlStuOperDAOImp(conn);

?

} }

?

?/*------------------------------------------------*/

?

到这里,工厂模式已经基本实现了,那么我们用一个类来测试一下

?

public class Client { public static void main(String[] args) {

?

?//获得SqlServerDaoFactory

DaoFactory factory = DaoFactory.getDaoFactory(1);

?

?//获得StuOperDao

?

IStuOperDao iod = factory .getStuOperDao();

?

//示例化一个学生

?

?Student stu = new Student(); stu.setStuName("Mc"); stu.setStuPwd("123520");

?

?//添加用户 int num = iod.addStu(stu);

?

if (num > 0) {

System.out.println("添加成功~"); }

else {

System.out.println("添加失败");

} } }

/*------------------------------------------------*/ 最后打印出: 添加成功~ 然后在数据库中查询到已经添加成功了.

热点排行