JDBC---DAO经典模式

JDBC—DAO经典模式 实现对数据库的增、删、改、查

JDBC(Java Data Base Connection)的作用是连接数据库
先看下jdbc连接SQLServer数据库的简单例子
代码实现(FirstJDBC):


package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class FirstJDBC {

    public static void main(String[] args)
    {
        //调用连接数据库的操作
        Connection con = createConnection();    


    }

    /**
     * JDBC 建立 SQL Server数据库连接
     */
    private static Connection createConnection() {

        //定义加载驱动程序
        String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

        //定义 连接 服务器 和 数据库sample
        String dbURL = "jdbc:sqlserver://localhost:1433; DataBaseName = sample1" ;

        //默认用户名,不要用windows默认身份验证
        String userName = "sa" ; 
        String userPassword = "zhichao" ;
        Connection connection = null ;
        Statement sta = null ;

        try {
            //正式加载驱动
            Class.forName(driverName);
            //开始连接
            connection = DriverManager.getConnection(dbURL, userName, userPassword);
            System.out.println("Connection Success !");

            //向数据库中执行SQL语句
            sta = connection.createStatement() ;
            ResultSet rs = sta.executeQuery("SELECT id,name,height From Table_1");
            while(rs.next())
            {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                float height = rs.getFloat("height");

                System.out.println("id = "+id+" name = "+name+" height = "+height);
            }

        } catch (Exception e) {

            System.out.println("Connection Fail !");
            e.printStackTrace() ;
        }

        /**
         * 关闭数据库
         * @param connection
         */
        finally
        {
            try {

                if (null != sta)
                {
                    sta.close() ;
                    sta = null;
                    System.out.println("Statement 关闭成功");
                }

                if (null != connection)
                {
                    connection.close() ;
                    connection = null;
                    System.out.println("Connection 关闭成功");
                }

            } catch (Exception e) {

                e.printStackTrace() ;
            }       

        }       
        return connection ;
    }
}

小结:
要写一个jdbc程序,先要加载相应数据库的驱动程序,驱动程序最好放在你建的工程里面,可以在你的工程下面建一个 lib文件夹以存储外部的jar文件,这样的话把你的工程拷贝到别的计算机运行,仍能成功执行。

jdbc代码一般步骤
1)加载外部驱动程序(jar包)
2)正式加载驱动程序 (Class.forName(driverName) )
3)获取connection连接 (在jdk中的sql包中,只提供了一个类那就是DriverManeger,通过调用它的静态方法getConnection(),可以得到以数据库的连接
4)创建sql语句的声明(Statement),执行sql语句(查询),遍历结果集
5)关闭数据库连接(一般用finally{}来处理,或者调用方法的形式来完成,关闭之前先判断你要关闭的对象连接是否为空,如果空那会抛异常,所以先判断)


使用 DAO模式 来对数据库做增删改查操作

这种模式可以大概分为三个层:1.DAO层 2.服务层 3.表现层
1)表现层 :相当于客户端用来查看,提交信息的角色
2)服务层 :是表现层和DAO层的纽带,其实也没干什么事就是通知消息的角色
3)DAO :真正要做事的角色(对数据库的某些操作)

举个生活中的例子:
就好比你去餐厅吃饭,你充当一个 (表现层)的角色,然后有美女服务员(服务层),问你需要吃什么东西,给你下一张订单,让你填。之后服务员把订单传到 厨师(DAO层)那里,具体操作厨师会搞定,一段时间后厨师把做好的食物传给服务员,服务员把食物在传给客户,这些操作就算基本完成了。

执行顺序: 表现层–>服务层–>DAO层–>返回服务层–>返回表现层

代码实现:
1.Bean文件,在这主要作用(有点像中介存储的角色):当从数据库拿出数据后,一个个set到该类里,进行赋值,然后把该对象放到集合中,之后再get出来

Student.Java


package com.myjdbc.bean;

public class Student {

    private Integer stuId;
    private String stuName ;
    private Integer stuAge;
    private String stuTel ;
    private String stuAddress ;
    private Integer groupId;

    public Integer getStuId() {
        return stuId;
    }
    public void setStuId(Integer stuId) {
        this.stuId = stuId;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public Integer getStuAge() {
        return stuAge;
    }
    public void setStuAge(Integer stuAge) {
        this.stuAge = stuAge;
    }
    public String getStuTel() {
        return stuTel;
    }
    public void setStuTel(String stuTel) {
        this.stuTel = stuTel;
    }
    public String getStuAddress() {
        return stuAddress;
    }
    public void setStuAddress(String stuAddress) {
        this.stuAddress = stuAddress;
    }
    public Integer getGroupId() {
        return groupId;
    }
    public void setGroupId(Integer groupId) {
        this.groupId = groupId;
    }

}

2.java连接数据库的基本操作及关闭,封装在一个类中

JDBCUtils.java


package com.myjdbc.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCUtils {
    /**
     * 获取连接
     * 
     */
    public static Connection getConnection()
    {
        String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

        String url = "jdbc:sqlserver://localhost:1433; DataBaseName = studentManager";
        String user = "sa" ;
        String password = "zhichao";
        Connection con = null ;
        try {

            Class.forName(driverName);
            con = DriverManager.getConnection(url, user, password);
            System.out.println("success");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return con ;

    }

    /**
     * 关闭连接
     */
    public static void free(ResultSet rs, Statement sta , Connection con)
    {
        try {
            if(null != rs)
            {
                rs.close();
                rs = null ;
            }

            if(null != sta)
            {
                sta.close();
                sta = null ;
            }

            if(null != con)
            {
                con.close();
                con = null ;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.定义一个DAO接口

StudentDAO.java


package com.myjdbc.dao;

import java.util.Set;

import com.myjdbc.bean.Student ;

public interface StudentDAO {

    public int addStudent(Student student) ;

    public int deleteStudent(String name);

    public int updateStudent(String name);

    public Student findStudent(String name);

    public Set<Student> findAll();






}

4.实现DAO接口的类,具体DAO,做重要工作的类

ConcreteStudentDao.java


package com.myjdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

import com.myjdbc.bean.Student;
import com.myjdbc.dao.StudentDAO;
import com.myjdbc.utils.JDBCUtils;

public class ConcreteStudentDao implements StudentDAO{

    //增加一个学生
    public int addStudent(Student student)
    {
        Connection con = null ;
        PreparedStatement ps = null ;
        int i = 0 ;
        try
        {
            con = JDBCUtils.getConnection();
            String sql = "insert into student(stuName,stuAge,stuTel,stuAddress,groupId) values(?,?,?,?,?)";
            ps = con.prepareStatement(sql);

            ps.setString(1, student.getStuName());
            ps.setInt(2, student.getStuAge());
            ps.setString(3, student.getStuTel());
            ps.setString(4, student.getStuAddress());
            ps.setInt(5, student.getGroupId());

            i = ps.executeUpdate() ;

        }
        catch(SQLException e)
        {
            throw new DAOException(e.getMessage(),e);
        }
        finally
        {
            JDBCUtils.free(null, ps, con);
        }
        return i;
    }

    //删除一个学生
    public int deleteStudent(String name)
    {
        Connection con = null ;
        PreparedStatement ps = null ;
        int i = 0 ;
        try
        {
            con = JDBCUtils.getConnection();
            String sql = "delete from student where stuName =?";
            ps = con.prepareStatement(sql);
            ps.setString(1, name);

            i = ps.executeUpdate() ;

        }
        catch(SQLException e)
        {
            throw new DAOException(e.getMessage(),e);
        }
        finally
        {
            JDBCUtils.free(null, ps, con);
        }

        return i;
    }

    //修改一个学生
    public int updateStudent(String name)
    {
        Connection con = null ;
        PreparedStatement ps = null ;
        int i = 0 ;
        try
        {
            con = JDBCUtils.getConnection();
            String sql = "update student set stuAge=stuAge+1  where stuName =?";
            ps = con.prepareStatement(sql);
            ps.setString(1, name);

            i = ps.executeUpdate() ;

        }
        catch(SQLException e)
        {
            throw new DAOException(e.getMessage(),e);
        }
        finally
        {
            JDBCUtils.free(null, ps, con);
        }

        return i;
    }
    //查询一行
    public Student findStudent(String name)
    {
        Connection con = null ;
        PreparedStatement ps = null ;
        Student stu = null ;
        ResultSet rs = null;
        try
        {
            con = JDBCUtils.getConnection();
            String sql = "select stuName,stuAge,stuTel,stuAddress,groupId from student where stuName =?";
            ps = con.prepareStatement(sql);
            ps.setString(1, name);

            rs = ps.executeQuery() ;
            stu = new Student();
            while(rs.next())
            {
                stu.setStuName(rs.getString(1));
                stu.setStuAge(rs.getInt(2));
                stu.setStuTel(rs.getString(3));
                stu.setStuAddress(rs.getString(4));
                stu.setGroupId(rs.getInt(5));
            }

        }
        catch(SQLException e)
        {
            throw new DAOException(e.getMessage(),e);
        }
        finally
        {
            JDBCUtils.free(rs, ps, con);
        }

        return stu;
    }

    //查询所有
    public Set<Student> findAll()
    {
        Connection con = null ;
        PreparedStatement ps = null ;
        Student stu = null ;
        ResultSet rs = null;
        Set<Student> set = null ;
        try
        {
            con = JDBCUtils.getConnection();
            String sql = "select stuName,stuAge,stuTel,stuAddress,groupId from student";
            ps = con.prepareStatement(sql);

            set = new HashSet<Student>() ;
            rs = ps.executeQuery() ;

            while(rs.next())
            {
                stu = new Student();

                stu.setStuName(rs.getString(1));
                stu.setStuAge(rs.getInt(2));
                stu.setStuTel(rs.getString(3));
                stu.setStuAddress(rs.getString(4));
                stu.setGroupId(rs.getInt(5));

                set.add(stu);
            }

        }
        catch(SQLException e)
        {
            throw new DAOException(e.getMessage(),e);
        }
        finally
        {
            JDBCUtils.free(rs, ps, con);
        }

        return set;
    }

}

5.自定义异常 继承了运行时异常,具体操作让父类实现

DAOException.java


package com.myjdbc.dao;

/**
 * 自定义异常
 * @author Administrator
 *
 */
public class DAOException extends RuntimeException {


    public DAOException()
    {
        super();
    }

    public DAOException(String messege,Throwable cause)
    {
        super(messege,cause);
    }

    public DAOException(String messege)
    {
        super(messege);
    }

    public DAOException(Throwable cause)
    {
        super(cause);
    }



}

6定义一个服务类(服务层),本来还要定义一个接口,这里简写了,客户与DAO的纽带,持有DAO对象的引用

StudentService.java


package com.myjdbc.service;

import java.util.Set;

import com.myjdbc.bean.Student;
import com.myjdbc.dao.StudentDAO;
import com.myjdbc.dao.ConcreteStudentDao;

public class StudentService {

    StudentDAO sd = new ConcreteStudentDao();

    public int add(Student student)
    {
        return this.sd.addStudent(student);
    }

    public int delete(String name)
    {
        return this.sd.deleteStudent(name);
    }

    public int update(String name)
    {
        return this.sd.updateStudent(name);
    }

    public Student find(String name)
    {
        return this.sd.findStudent(name);
    }

    public Set<Student> findAll()
    {
        return this.sd.findAll();
    }

}

7.定义一个测试类,相当于 (表现层)

Client.java


package com.myjdbc.test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import com.myjdbc.bean.Student;
import com.myjdbc.service.StudentService;

public class Client {
   public static void main(String[] args)
   {
       Student stu = new Student();
       Set<Student> set = new HashSet<Student>();
//     stu.setStuName("zhangsan");
//     stu.setStuAge(20);
//     stu.setStuTel("18779157911");
//     stu.setStuAddress("china");
//     stu.setGroupId(1);
       StudentService ss = new StudentService();
       //System.out.println(ss.add(stu));
       //System.out.println(ss.delete("aa"));
       //System.out.println(ss.update("bb"));
       //stu = ss.find("cc");
       //System.out.println(stu.getStuName() +" " +stu.getStuAge()+" "+stu.getStuTel()+" "+stu.getStuAddress()+" "+stu.getGroupId());
       set = ss.findAll() ;
       Iterator<Student> iterator = set.iterator();
       while(iterator.hasNext())
       {
          Student student =  (Student)iterator.next() ;
          System.out.println(student.getStuName() +" " +student.getStuAge()+" "+student.getStuTel()+" "+student.getStuAddress()+" "+student.getGroupId());
       }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值