工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3404|回复: 11

浅谈DAO模式(一)

[复制链接]
发表于 2007-9-12 16:13 | 显示全部楼层 |阅读模式
最近在整理以前学习JAVA时留下的一些学习笔记,收获波多...现将其中一篇关于DAO模式的学习心得发出来,以供大家分享...


在此先说明一下,在本帖中,我并不会对DAO模式作很详细的讲解(关于DAO模式的更多详细介绍,还请您自己去上网查找一些牛人写的文档   ),如本文标题所示,只是"浅谈"而已.如果你看了本贴之后,能够快速的开发出自己的DAO组件,那就已经是达到了我的目的了...  ,如果您发现本文有错的地方,请指出来,不胜感激!!!


,废话少说,让我们进入正题...

DAO简介

在以前常规的应用程序开发当中,如果有涉及到数据持久层的操作,那业务代码将无可避免的嵌入一些与业务无关的语句,SQL语句,try{..}catch{..}语句...这样,代码将变得很难维护,而且组件复用也无从谈起,违背了OO原则.使用DAO模式能帮我们解决这个问题.DAO(Data Access Objects),也就是数据访问对象的简称.

首先,数据持久层开发人员先把对数据库的操作(也就是一些SQL语句:insert,update...)封装成一个DAO组件,然后发布给业务开发人员使用.则从使用者(业务开发人员)的角度来看,他们对数据的操作,就像是对对象的操作一样,一切都变得简单明了.,要将一个User对象插入到数据库中,可以这样来做:UserDAO.insert(user);DAO组件会自动帮你把User对象中的属性插入到持久层中.这样一来,业务开发人员再也不用面对那些烦人的SQL,try{..} catch{..}语句了,天大欢喜...


下面以一个实际的例子来说明DAO模式的好处.
假如有一个User,它有id,name,age等属性,它是一个标准的JAVABEAN.现我们的业务需求是要持久化一个User对象,直接使用JDBC的开发模式,业务开发人员将不得不这样来写:



  1. ...
  2. Connection conn = null;
  3. PreparedStatement pre = null;
  4. String sql = "insert into user(id,name,age) values(?,?,?)";
  5. try
  6. {
  7.        Class.forName("yourDBDriver");
  8.        conn = Driver.getConnection();
  9.        pre = conn.prepareStatement(sql);
  10.        pre.setInt(1,user.getId());
  11.        pre.setString(2,user.getName());
  12.        pre.setInt(3,user.getAge());
  13.        pre.executeUpdate();
  14. }
  15. catch(SQLException e)
  16. {
  17.        e.printStackTrace();
  18. }
  19. finally
  20. {
  21.        if(conn != null)
  22.        {
  23.               try
  24.               {
  25.                      conn.close();
  26.               }
  27.               catch(SQLException e)
  28.               {
  29.                      e.printStackTrace();
  30.               }
  31.        }
  32.        if(pre != null)
  33.        {
  34.               try
  35.               {
  36.                      pre.close();
  37.               }
  38.               catch(SQLException e)
  39.               {
  40.                      e.printStackTrace();
  41.               }
  42.        }
  43. }

  44. ...
复制代码


在这些代码中,真正与业务需求(持久化User对象)有关的,才四行代码,其它的都是一些与业务无关的辅助性代码.下面我们使用DAO模式,由于DAO组件已由持久层开发人员开发好了,所以业务开发人员只须以下两行代码就可以持久化一个User对象:
IUserDAO userDAO = (IUserDAO)getUserDAO();//IUserDAO为通用的数据访问接口
userDAO.insert(user);

其中getUserDAO()返回的就是具体的DAO组件.从中我们也可以看出,业务代码只与数据操作接口有关,而与底层实现无关,如果哪天要将应用程序由MySQL系统移植到MSSQL系统,那我们只需修改配置文件中的底层实现配置,而无须修改任何业务逻辑代码!
现在你应该可以稍微领略到DAO模式的威力了吧




看到这里,学过Hibernate的同学可能对我上面所说的不以为然,认为在持久层的操作方面,Hibernate已经帮我们封装得很好了,我们无须再开发自己的DAO组件.没错,Hibernate是一款非常优秀的ORM解决方案,事实上,您可以将其用在您认为可以用的地方.我也极力推荐您这样做.但作为开发人员,特别是JAVA开发者,我们不应极限于某种框架,对一种框架的应用,或者说学习,应是"学习其架构与设计思想"(某位牛人的语录,可惜我一直做不到..:  ) ,而不是不厌其烦的学习其API怎么用(惭愧,我也是这样..... :  ).在这里,我之所以要讲解DAO模式,并不是要您在实际开发中使用DAO(您也可以这样做),最主要的目的,是要让您了解什么是设计模式,设计模式怎么来,以及设计模式威力之所在.(当然,还有设计模式所带给开发者的乐趣. [em013] )...


又说了一些废话[em013] ,下面让我们来开发一个完整的基于DAO模式的应用程序


Let's go...



评分

3

查看全部评分

 楼主| 发表于 2007-9-12 16:14 | 显示全部楼层
DAO开发

有一个User类,具有id,name,age,email等属性.在MySQL的dao_db数据库中,有一个与其对应的user表,建表语句如下:


  1. create table user(
  2. id int primary key auto_increment,
  3. name varchar(50) not null,
  4. age int,
  5. email varchar(50));
复制代码

注意其中的id为自增量.

现在我们要对User对象进行基本的数据操作(insert,update,delete,find).
步骤一:定义User类的DAO接口,并在接口中定义所有数据操作方法.

  1. -----------------IUserDAO.java---------------------
  2. package com.cong.dao;
  3. /**
  4. * User对象在数据库中访问接口
  5. * 定义了对User对象在数据库中的几种基本操作
  6. *
  7. */
  8. import com.cong.bean.User;
  9. public interface IUserDAO {
  10.        /**
  11.         * 通过ID查找具体的User对象
  12.         * @return User实例 or null
  13.         */
  14.        public User find(int id);
  15.       
  16.        /**
  17.         * 插入User实例到数据表中
  18.         * @return 1 or 0
  19.         */
  20.        public int insert(User user);
  21.       
  22.        /**
  23.         * 更新已有的User数据
  24.         * @return 1 or 0
  25.         */
  26.        public int update(User user);
  27.       
  28.        /**
  29.         * 通过ID删除具体的User对象
  30.         * @return 1 or 0
  31.         */
  32.        public int delete(int id);
  33.       
  34. }
复制代码


步骤二:编写User类,也就是一个JAVABEAN

  1. -----------------User.java---------------------
  2. package com.cong.bean;
  3. /**
  4. * User类,对应于mysql中的表user;以及mssql中的表user_t.
  5. * 提供三种构造方法.以及各种属性的setXXX和getXXX方法
  6. * 注:id属性为自增量
  7. */
  8. public class User {
  9.        private int id;
  10.        private String name;
  11.        private int age;
  12.        private String email;
  13.        public User(){}
  14.        public User(String name,int age,String email){
  15.               this.name = name;
  16.               this.age = age;
  17.               this.email = email;
  18.        }
  19.        public User(int id,String name,int age,String email){
  20.               this.id = id;
  21.               this.name = name;
  22.               this.age = age;
  23.               this.email = email;
  24.        }
  25.        public int getAge() {
  26.               return age;
  27.        }
  28.        public void setAge(int age) {
  29.               this.age = age;
  30.        }
  31.        public int getId() {
  32.               return id;
  33.        }
  34.        public void setId(int id) {
  35.               this.id = id;
  36.        }
  37.        public String getEmail() {
  38.               return email;
  39.        }
  40.        public void setEmail(String email) {
  41.               this.email = email;
  42.        }
  43.        public String getName() {
  44.               return name;
  45.        }
  46.        public void setName(String name) {
  47.               this.name = name;
  48.        }
  49. }
复制代码


[ 本帖最后由 crazyox 于 2007-9-12 16:22 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2007-9-12 16:16 | 显示全部楼层
步骤三:编写底层的DAO实现,在这个类中,我将会用到一个能读取系统配置信息的辅助类ConfigReader,其原代码见后面


  1. -----------------UserDAO.java---------------------//mysql数据库
  2. package com.cong.dao.impl.mysql;  
  3. /**
  4. * IUserDAO的底层实现类(mysql数据库)
  5. *
  6. */
  7. import com.cong.bean.User;
  8. import com.cong.dao.IUserDAO;
  9. import com.cong.tool.ConfigReader;
  10. import java.sql.Connection;
  11. import java.sql.PreparedStatement;
  12. import java.sql.DriverManager;
  13. import java.sql.ResultSet;
  14. public class UserDAO implements IUserDAO {
  15.        private Connection conn = null;
  16.        private static  String DBDRIVER = ""; //数据库驱动名
  17.        private static  String URL = "";      //数据库URL
  18.        private static  String USER = "";     //用户名
  19.        private static  String PASSWORD = ""; //密码
  20.        public UserDAO(){
  21.               init();
  22.        }
  23.        /**
  24.         * 初始化方法
  25.         * ConfigReader为辅助工具类,通过其静态方法:read(key)可读取系统的配置信息,并返回相应的value
  26.         */
  27.        private void init(){
  28.               try{
  29.                      DBDRIVER = ConfigReader.read("DBDRIVER");
  30.                      URL = ConfigReader.read("URL");
  31.                      USER = ConfigReader.read("USER");
  32.                      PASSWORD = ConfigReader.read("PASSWORD");
  33.               }
  34.               catch(Exception e){
  35.                      e.printStackTrace();
  36.               }
  37.        }
  38.       
  39.        /**
  40.         * 获取数据库的连接
  41.         * @return Connection
  42.         */
  43.        private Connection getConnection(){
  44.               if(conn == null){
  45.                      try{
  46.                             Class.forName(DBDRIVER);                                      //加载数据库驱动程序
  47.                             conn = DriverManager.getConnection(URL,USER,PASSWORD);//获取数据库的连接
  48.                      }
  49.                      catch(Exception e){
  50.                             e.printStackTrace();
  51.                      }
  52.               }
  53.               return conn;
  54.        }
  55.       
  56.        /**
  57.         * 通过ID删除具体的User对象
  58.         * @param id
  59.         * @return 1 or 0
  60.         */
  61.        public int delete(int id) {
  62.               // TODO Auto-generated method stub
  63.               String sql = "delete from user where id='"+id+"'";
  64.               PreparedStatement pre = null;
  65.               try{
  66.                      conn = getConnection();
  67.                      pre = conn.prepareStatement(sql);
  68.                      int status = pre.executeUpdate();
  69.                      return status;
  70.               }
  71.               catch(Exception e){
  72.                      e.printStackTrace();
  73.               }
  74.               finally{
  75.                      if(conn != null){
  76.                             try{
  77.                                    conn.close();
  78.                             }
  79.                             catch(Exception e){
  80.                                    e.printStackTrace();
  81.                             }
  82.                      }
  83.                      if(pre != null){
  84.                             try{
  85.                                    pre.close();
  86.                             }
  87.                             catch(Exception e){
  88.                                    e.printStackTrace();
  89.                             }
  90.                      }
  91.               }
  92.               return 0;
  93.        }
  94.       
  95.        /**
  96.         * 通过ID查找具体的User对象
  97.         * @param id
  98.         * @return User实例 or null
  99.         */
  100.        public User find(int id) {
  101.               // TODO Auto-generated method stub
  102.               
  103.               String sql = "select * from user where id='"+id+"'";
  104.               //User user = null;
  105.               PreparedStatement pre = null;
  106.               ResultSet re = null;
  107.               try{
  108.                      conn = getConnection();
  109.                      pre = conn.prepareStatement(sql);
  110.                      re = pre.executeQuery();
  111.                      User user = new User();
  112.                      while(re.next()){                            //将查询结果封装为User实例
  113.                             user.setId(re.getInt("id"));
  114.                             user.setName(re.getString("name"));
  115.                             user.setAge(re.getInt("age"));
  116.                             user.setEmail(re.getString("email"));
  117.                      }
  118.                      return user;
  119.               }
  120.               catch(Exception e){
  121.                      e.printStackTrace();
  122.               }
  123.               finally{
  124.                      if(conn != null){
  125.                             try{
  126.                                    conn.close();
  127.                             }
  128.                             catch(Exception e){
  129.                                    e.printStackTrace();
  130.                             }
  131.                      }
  132.                      if(pre != null){
  133.                             try{
  134.                                    pre.close();
  135.                             }
  136.                             catch(Exception e){
  137.                                    e.printStackTrace();
  138.                             }
  139.                      }
  140.                      if(re != null){
  141.                             try{
  142.                                    re.close();
  143.                             }
  144.                             catch(Exception e){
  145.                                    e.printStackTrace();
  146.                             }
  147.                      }
  148.               }
  149.               return null;
  150.        }
  151.        /**
  152.         * 插入User实例到数据表中
  153.         * @param user
  154.         * @return 1 or 0
  155.         */
  156.        public int insert(User user) {
  157.               // TODO Auto-generated method stub
  158.               if(user != null){
  159.                      String sql = "insert into user(name,age,email) values(?,?,?) ";
  160.                      PreparedStatement pre = null;
  161.                      try{
  162.                             conn = getConnection();
  163.                             pre = conn.prepareStatement(sql);
  164.                             pre.setString(1,user.getName());
  165.                             pre.setInt(2,user.getAge());
  166.                             pre.setString(3,user.getEmail());
  167.                             int status = pre.executeUpdate();
  168.                             return status;
  169.                      }
  170.                      catch(Exception e){
  171.                             e.printStackTrace();
  172.                      }
  173.                      finally{
  174.                             if(conn != null){
  175.                                    try{
  176.                                           conn.close();
  177.                                    }
  178.                                    catch(Exception e){
  179.                                           e.printStackTrace();
  180.                                    }
  181.                             }
  182.                             if(pre != null){
  183.                                    try{
  184.                                           pre.close();
  185.                                    }
  186.                                    catch(Exception e){
  187.                                           e.printStackTrace();
  188.                                    }
  189.                             }
  190.                      }
  191.               }
  192.               
  193.               return 0;
  194.        }
  195.        /**
  196.         * 更新已有的User数据
  197.         * @param user
  198.         * @return 1 or 0
  199.         */
  200.        public int update(User user) {
  201.               // TODO Auto-generated method stub
  202.               if(user != null){
  203.                      String sql = "update user set name=?,age=?,email=? where id='"+user.getId()+"'";
  204.                      PreparedStatement pre = null;
  205.                      try{
  206.                             conn = getConnection();
  207.                             pre = conn.prepareStatement(sql);
  208.                             pre.setString(1,user.getName());
  209.                             pre.setInt(2,user.getAge());
  210.                             pre.setString(3,user.getEmail());
  211.                             int status = pre.executeUpdate();
  212.                             return status;
  213.                      }
  214.                      catch(Exception e){
  215.                             e.printStackTrace();
  216.                      }
  217.                      finally{
  218.                             if(conn != null){
  219.                                    try{
  220.                                           conn.close();
  221.                                    }
  222.                                    catch(Exception e){
  223.                                           e.printStackTrace();
  224.                                    }
  225.                             }
  226.                             if(pre != null){
  227.                                    try{
  228.                                           pre.close();
  229.                                    }
  230.                                    catch(Exception e){
  231.                                           e.printStackTrace();
  232.                                    }
  233.                             }
  234.                      }
  235.               }
  236.               return 0;
  237.        }
  238. }
复制代码

  1. -----------------ConfigReader.java---------------------
  2. package com.cong.tool;
  3. /**
  4. * 辅助工具类,可读取系统的配置信息
  5. */
  6. import java.util.Properties;
  7. import java.io.FileInputStream;
  8. public class ConfigReader {
  9.        //private String value;
  10.        private static Properties p = null;
  11.        static{
  12.               try{
  13.                      p = new Properties();
  14.                      p.load(new FileInputStream("src/config.properties"));//加载配置信息
  15.               }
  16.               catch(Exception e){
  17.                      e.printStackTrace();
  18.               }
  19.        }
  20.       
  21.        public ConfigReader(){}
  22.        /**
  23.         * 静态方法,根据KEY获取对应的VALUE
  24.         * @param key
  25.         * @return String
  26.         * @throws Exception
  27.         */
  28.        public static String read(String key) throws Exception{
  29.               return p.getProperty(key);
  30.        }
  31. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2007-9-12 16:18 | 显示全部楼层
完成了以上三步后,我们就可以在客户端使用以上定义好的DAO类了,下面我们来编写一下测试代码(在这里,我们可以将其称为应用程序,也就是逻辑代码)

系统配置信息


  1. -----------------config.properties---------------------
  2. USERDAO.CLASS.NAME = com.cong.dao.impl.mysql.UserDAO
  3. DBDRIVER = com.mysql.jdbc.Driver
  4. URL = jdbc:mysql://localhost/dao_db
  5. USER = root
  6. PASSWORD = 123
复制代码

  1. -----------------DaoDemoTest.java---------------------
  2. package com.cong.test;
  3. import com.cong.bean.User;
  4. import com.cong.dao.IUserDAO;
  5. import com.cong.tool.ConfigReader;
  6. public class DaoDemoTest {
  7.        private IUserDAO userDAO;
  8.        public DaoDemoTest(){
  9.               init();
  10.        }
  11.        /**
  12.         * 初始化方法,根据配置信息产生具体的UserDAO实例
  13.         *
  14.         */
  15.        private void init(){
  16.               try{
  17.                      userDAO = (IUserDAO)Class.forName(ConfigReader.read("USERDAO.CLASS.NAME")).newInstance();
  18.               }
  19.               catch(Exception e){
  20.                      e.printStackTrace();
  21.               }
  22.        }
  23.        private IUserDAO getUserDAO(){
  24.               return userDAO;
  25.        }
  26.        public void find(){
  27.               IUserDAO userDAO = getUserDAO();
  28.               User user = userDAO.find(1);
  29.               if(user != null){
  30.                      System.out.println("以下是你要查找的ID为"+user.getId()+"的客户的信息:");
  31.                      System.out.println("ID : "+user.getId());
  32.                      System.out.println("姓名: "+user.getName());
  33.                      System.out.println("年龄: "+user.getAge());
  34.                      System.out.println("邮箱: "+user.getEmail());
  35.               }
  36.               else{
  37.                      System.out.println("没有你要查找的客户信息");
  38.               }
  39.        }
  40.        public void insert(){
  41.               IUserDAO userDAO = getUserDAO();
  42.               User user = new User("cong",20,"[email protected]");
  43.               int status = userDAO.insert(user);
  44.               if(status > 0){
  45.                      System.out.println("恭喜!注册成功!!");
  46.               }
  47.               else{
  48.                      System.out.println("注册打败!!");
  49.               }
  50.        }
  51.        public void delete(){
  52.               IUserDAO userDAO = getUserDAO();
  53.               int status = userDAO.delete(2);
  54.               if(status > 0){
  55.                      System.out.println("恭喜!!注销成功!!");
  56.               }
  57.               else{
  58.                      System.out.println("注销失败!!");
  59.               }
  60.        }
  61.        public void update(){
  62.               IUserDAO useDAO = getUserDAO();
  63.               User user = new User(1,"kawen",17,"[email protected]");
  64.               int status = useDAO.update(user);
  65.               if(status > 0){
  66.                      System.out.println("恭喜!!更新成功!!");
  67.               }
  68.               else{
  69.                      System.out.println("更新失败!!");
  70.               }
  71.        }
  72.       
  73.        public static void main(String[] args){
  74.               DaoDemoTest demo = new DaoDemoTest();
  75.               demo.insert();
  76.               //demo.update();
  77.               //demo.find();
  78.               //demo.delete();
  79.        }
  80. }
复制代码


系统配置信息运行的时候请别忘了将MySQL的驱动程序加入到您的classpath中...
回复

使用道具 举报

 楼主| 发表于 2007-9-12 16:20 | 显示全部楼层
从上面的例子中,我们可以看出,应用程序(DaoDemoTest.java)与DAO组件(UserDAO.java)是完全独立的,事实上,应用程序根本感觉不到DAO组件的存在,它只依赖于通用的DAO接口(IUserDAO.java).如果我们要将应用程序移植到MSSQL数据库中,那我们只须修改配置信息就可以了(假设您已有了MSSQL数据库的DAO实现),而不用修改任何业务代码.
下面我们就来编写MSSQL数据库中的DAO实现.

(因为在MSSQL系统中,user为关键字,所以在这里我们须将表名改为user_t.同里从这点您也可以看出,不管底层数据库怎么变,我们的业务代码都不用做一丝的改变  )


  1. -----------------UserDAO.java---------------------//sql2000数据库
  2. package com.cong.dao.impl.mssql;
  3. /**
  4. * IUserDAO的底层实现类(mysql数据库)
  5. *
  6. */
  7. import com.cong.bean.User;
  8. import com.cong.dao.IUserDAO;
  9. import com.cong.tool.ConfigReader;
  10. import java.sql.Connection;
  11. import java.sql.PreparedStatement;
  12. import java.sql.DriverManager;
  13. import java.sql.ResultSet;
  14. public class UserDAO implements IUserDAO {
  15.        private Connection conn = null;
  16.        private static  String DBDRIVER = ""; //数据库驱动名
  17.        private static  String URL = "";      //数据库URL
  18.        private static  String USER = "";     //用户名
  19.        private static  String PASSWORD = ""; //密码
  20.        public UserDAO(){
  21.               init();
  22.        }
  23.        /**
  24.         * 初始化方法
  25.         * ConfigReader为辅助工具类,通过其静态方法:read(key)可读取系统的配置信息,并返回相应的value
  26.         */
  27.        private void init(){
  28.               try{
  29.                      DBDRIVER = ConfigReader.read("DBDRIVER");
  30.                      URL = ConfigReader.read("URL");
  31.                      USER = ConfigReader.read("USER");
  32.                      PASSWORD = ConfigReader.read("PASSWORD");
  33.               }
  34.               catch(Exception e){
  35.                      e.printStackTrace();
  36.               }
  37.        }
  38.       
  39.        /**
  40.         * 获取数据库的连接
  41.         * @return Connection
  42.         */
  43.        private Connection getConnection(){
  44.               if(conn == null){
  45.                      try{
  46.                             Class.forName(DBDRIVER);                                      //加载数据库驱动程序
  47.                             conn = DriverManager.getConnection(URL,USER,PASSWORD);//获取数据库的连接
  48.                      }
  49.                      catch(Exception e){
  50.                             e.printStackTrace();
  51.                      }
  52.               }
  53.               return conn;
  54.        }
  55.       
  56.        /**
  57.         * 通过ID删除具体的User对象
  58.         * @param id
  59.         * @return 1 or 0
  60.         */
  61.        public int delete(int id) {
  62.               // TODO Auto-generated method stub
  63.               String sql = "delete from user_t where id='"+id+"'";
  64.               PreparedStatement pre = null;
  65.               try{
  66.                      conn = getConnection();
  67.                      pre = conn.prepareStatement(sql);
  68.                      int status = pre.executeUpdate();
  69.                      return status;
  70.               }
  71.               catch(Exception e){
  72.                      e.printStackTrace();
  73.               }
  74.               finally{
  75.                      if(conn != null){
  76.                             try{
  77.                                    conn.close();
  78.                             }
  79.                             catch(Exception e){
  80.                                    e.printStackTrace();
  81.                             }
  82.                      }
  83.                      if(pre != null){
  84.                             try{
  85.                                    pre.close();
  86.                             }
  87.                             catch(Exception e){
  88.                                    e.printStackTrace();
  89.                             }
  90.                      }
  91.               }
  92.               return 0;
  93.        }
  94.       
  95.        /**
  96.         * 通过ID查找具体的User对象
  97.         * @param id
  98.         * @return User实例 or null
  99.         */
  100.        public User find(int id) {
  101.               // TODO Auto-generated method stub
  102.               
  103.               String sql = "select * from user_t where id='"+id+"'";
  104.               //User user = null;
  105.               PreparedStatement pre = null;
  106.               ResultSet re = null;
  107.               try{
  108.                      conn = getConnection();
  109.                      pre = conn.prepareStatement(sql);
  110.                      re = pre.executeQuery();
  111.                      User user = new User();
  112.                      while(re.next()){                            //将查询结果封装为User实例
  113.                             user.setId(re.getInt("id"));
  114.                             user.setName(re.getString("name"));
  115.                             user.setAge(re.getInt("age"));
  116.                             user.setEmail(re.getString("email"));
  117.                      }
  118.                      return user;
  119.               }
  120.               catch(Exception e){
  121.                      e.printStackTrace();
  122.               }
  123.               finally{
  124.                      if(conn != null){
  125.                             try{
  126.                                    conn.close();
  127.                             }
  128.                             catch(Exception e){
  129.                                    e.printStackTrace();
  130.                             }
  131.                      }
  132.                      if(pre != null){
  133.                             try{
  134.                                    pre.close();
  135.                             }
  136.                             catch(Exception e){
  137.                                    e.printStackTrace();
  138.                             }
  139.                      }
  140.                      if(re != null){
  141.                             try{
  142.                                    re.close();
  143.                             }
  144.                             catch(Exception e){
  145.                                    e.printStackTrace();
  146.                             }
  147.                      }
  148.               }
  149.               return null;
  150.        }
  151.        /**
  152.         * 插入User实例到数据表中
  153.         * @param user
  154.         * @return 1 or 0
  155.         */
  156.        public int insert(User user) {
  157.               // TODO Auto-generated method stub
  158.               if(user != null){
  159.                      String sql = "insert into user_t(name,age,email) values(?,?,?) ";
  160.                      PreparedStatement pre = null;
  161.                      try{
  162.                             conn = getConnection();
  163.                             pre = conn.prepareStatement(sql);
  164.                             pre.setString(1,user.getName());
  165.                             pre.setInt(2,user.getAge());
  166.                             pre.setString(3,user.getEmail());
  167.                             int status = pre.executeUpdate();
  168.                             return status;
  169.                      }
  170.                      catch(Exception e){
  171.                             e.printStackTrace();
  172.                      }
  173.                      finally{
  174.                             if(conn != null){
  175.                                    try{
  176.                                           conn.close();
  177.                                    }
  178.                                    catch(Exception e){
  179.                                           e.printStackTrace();
  180.                                    }
  181.                             }
  182.                             if(pre != null){
  183.                                    try{
  184.                                           pre.close();
  185.                                    }
  186.                                    catch(Exception e){
  187.                                           e.printStackTrace();
  188.                                    }
  189.                             }
  190.                      }
  191.               }
  192.               
  193.               return 0;
  194.        }
  195.        /**
  196.         * 更新已有的User数据
  197.         * @param user
  198.         * @return 1 or 0
  199.         */
  200.        public int update(User user) {
  201.               // TODO Auto-generated method stub
  202.               if(user != null){
  203.                      String sql = "update user_t set name=?,age=?,email=? where id='"+user.getId()+"'";
  204.                      PreparedStatement pre = null;
  205.                      try{
  206.                             conn = getConnection();
  207.                             pre = conn.prepareStatement(sql);
  208.                             pre.setString(1,user.getName());
  209.                             pre.setInt(2,user.getAge());
  210.                             pre.setString(3,user.getEmail());
  211.                             int status = pre.executeUpdate();
  212.                             return status;
  213.                      }
  214.                      catch(Exception e){
  215.                             e.printStackTrace();
  216.                      }
  217.                      finally{
  218.                             if(conn != null){
  219.                                    try{
  220.                                           conn.close();
  221.                                    }
  222.                                    catch(Exception e){
  223.                                           e.printStackTrace();
  224.                                    }
  225.                             }
  226.                             if(pre != null){
  227.                                    try{
  228.                                           pre.close();
  229.                                    }
  230.                                    catch(Exception e){
  231.                                           e.printStackTrace();
  232.                                    }
  233.                             }
  234.                      }
  235.               }
  236.               return 0;
  237.        }
  238. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2007-9-12 16:21 | 显示全部楼层
然后修改配置信息


  1. -----------------config.properties---------------------
  2. USERDAO.CLASS.NAME = com.cong.dao.impl.mssql.UserDAO
  3. DBDRIVER = com.microsoft.jdbc.sqlserver.SQLServerDriver
  4. URL = jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dao_db
  5. USER = sa
  6. PASSWORD = 123
复制代码


(注意运行时请将相关的驱动程序加入到您的CLASSPATH中)

关于基本的DAO模式就先讲到这里吧,下次我还会说说高级一点的DAO模式(工厂模式),以及JDBC模板...

如果上面有错的地方,请给我留言好吗?谢谢啦...

一口气写了这么多,累...呵呵
回复

使用道具 举报

发表于 2007-9-12 19:13 | 显示全部楼层
谢谢分享,very good!

如果把DAO类执行SQL语句的地方进行封装(包装)会更好
回复

使用道具 举报

 楼主| 发表于 2007-9-12 22:43 | 显示全部楼层
呵呵...
回LS,在下一主题中,我会对其进行封装的,也就是JDBC模板以及工厂模式啦...
在这里只是想尽可能简单的说明DAO模式,所以就没有封装咯...
回复

使用道具 举报

发表于 2007-9-13 00:14 | 显示全部楼层
原帖由 crazyox 于 2007-9-12 22:43 发表
呵呵...
回LS,在下一主题中,我会对其进行封装的,也就是JDBC模板以及工厂模式啦...
在这里只是想尽可能简单的说明DAO模式,所以就没有封装咯...


期待。。。
回复

使用道具 举报

发表于 2007-9-14 02:12 | 显示全部楼层
不错。支持一下。

期待更多分享。。。
回复

使用道具 举报

发表于 2007-9-28 13:44 | 显示全部楼层
我也来支持一下!
回复

使用道具 举报

发表于 2007-10-16 00:13 | 显示全部楼层
看了LZ的帖子~我好像又年轻了几岁~~

好怀念大学的学习生活~

期待LZ投入更大的热情分享自己的学习和实践经验~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 00:44

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表