什么是Dao设计模式? 其实Dao就是数据访问层,用于访问数据库并实现数据的持久化。下面是一个使用Dao设计模式的小Demo。使用的数据库是SQLServer。

这里就以一个管理学生信息的小demo为例。

1.数据库和表编写

--创建数据库
create database TestDB
go

use TestDB
go

create table stuInfo(
    stuId int primary key identity,
    stuName varchar(20) not null,
    stuAge int not null
)
go

2.编写实体类

package com.entity;

public class StuInfo {
    private int stuID;
    private String stuName;
    private int stuAge;
    /**
     * 有参数的构造方法
     * @param stuID
     * @param stuName
     * @param stuAge
     */
    public StuInfo(int stuID, String stuName, int stuAge) {
        super();
        this.stuID = stuID;
        this.stuName = stuName;
        this.stuAge = stuAge;
    }
    public StuInfo(String stuName, int stuAge) {
        super();
        this.stuName = stuName;
        this.stuAge = stuAge;
    }
    public StuInfo() {
        super();
        // TODO Auto-generated constructor stub
    }
    public int getStuID() {
        return stuID;
    }
    public void setStuID(int stuID) {
        this.stuID = stuID;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public int getStuAge() {
        return stuAge;
    }
    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }
}

注:这里的实体类多建立了一个有参数的构造方法,但是没有把学生的id放进去,因为后面添加数据的时候,在数据表里的的学生id是自增长的。

3.编写工具类用于连接数据库和关闭数据库

package com.util;

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

public class DBUtil {
    //静态语句块加载驱动
    static{
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 连接数据库的方法
     * @return
     */
    public static Connection getConn(){
        Connection conn=null;
        try {
            conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;database=HR","sa","123456");

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 断开连接的方法
     */
    public static void getOver(ResultSet rs,PreparedStatement ptmt,Connection conn){
        try {
            if(rs!=null){
                rs.close();
            }
            if(ptmt!=null){
                ptmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

4.访问数据层的编写

package com.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.entity.StuInfo;
import com.util.DBUtil;
/**
 * 数据库操作类
 * 实现 增删改查
 * @author Administrator
 *
 */
public class StuInfoDao {
    //定义常用的数据库接口
    PreparedStatement ptmt=null;
    Connection conn=null;
    ResultSet rs=null;
    /**
     * 插入数据的方法
     */
    public boolean insert(StuInfo stuInfo){
        boolean flag=false;
        try {
            //获得连接
            conn=DBUtil.getConn();
            //导入SQL语句
            ptmt=conn.prepareStatement("insert into stuInfo values(?,?)");
            //获取用户输入的值 写入操作对象
            ptmt.setString(1,stuInfo.getStuName());
            ptmt.setInt(2,stuInfo.getStuAge());
            int row=ptmt.executeUpdate();
            //判断是否有返回值
            if(row>0){
                flag=true;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            DBUtil.getOver(null, ptmt, conn);
        }
        return flag;
    }
    /**
     * 删除数据的方法
     */
    public boolean delete(int stuId){
        boolean flag=false;
        try {
            //获得连接
            conn=DBUtil.getConn();
            ptmt=conn.prepareStatement("delete from stuInfo where stuId=?");
            ptmt.setInt(1,stuId);
            int row=ptmt.executeUpdate();
            if(row>0){
                flag=true;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            DBUtil.getOver(null, ptmt, conn);
        }
        return flag;
    }
    /**
     * 修改数据的方法
     * @param stuId
     * @param stuName
     * @return
     */
    public boolean change(int stuId,String stuName){
        boolean flag=false;
        try {
            //获得连接
            conn=DBUtil.getConn();
            ptmt=conn.prepareStatement("update stuInfo set stuName=? where stuId=?");
            ptmt.setString(1, stuName);
            ptmt.setInt(2, stuId);
            int row=ptmt.executeUpdate();
            //判断是否有返回值
            if(row>0){
                flag=true;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            DBUtil.getOver(rs, ptmt, conn);
        }
        return flag;
    }
    /**
     * 查询的方法
     * @return
     */
    public ArrayList<StuInfo> selectAll(){
        ArrayList<StuInfo> list=new ArrayList<StuInfo>();
        try {
            //获取连接
            conn=DBUtil.getConn();
            ptmt=conn.prepareStatement("select * from stuInfo");
            ResultSet rs=ptmt.executeQuery();
            //循环遍历
            while(rs.next()){
                StuInfo si=new StuInfo(rs.getInt("stuId"),rs.getString("stuName"),rs.getInt("stuAge"));
                list.add(si);
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally{
            DBUtil.getOver(rs, ptmt, conn);
        }
        return list;
    }
}

注:这个数据访问层就是Dao设计模式的精华所在

5.编写测试类

package com.demo;

import java.util.Scanner;

import com.dao.StuInfoDao;
import com.entity.StuInfo;


public class StuTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建一个扫描器
        Scanner sc=new Scanner(System.in);
        //创建dao类对象
        StuInfoDao dao = new StuInfoDao();
        do{
            System.out.println("1、添加数据");
            System.out.println("2、修改数据");
            System.out.println("3、删除数据");
            System.out.println("4、显示数据");
            System.out.println("请选择:");
            int option = Integer.parseInt(sc.nextLine());
            switch(option){
                case 1:
                    System.out.println("请输入姓名:");
                    String name=sc.nextLine();
                    System.out.println("请输入年龄:");
                    int age=Integer.parseInt(sc.nextLine());
                    StuInfo stuInfo=new StuInfo(name,age);
                    boolean flag=dao.insert(stuInfo);
                    //判断
                    if(flag){
                        System.out.println("添加成功");
                    }else{
                        System.out.println("添加失败");
                    }
                    break;
                case 2:
                    //修改
                    System.out.println("请输入需要修改的用户的ID:");
                    int stuId=Integer.parseInt(sc.nextLine());
                    System.out.println("请输入修改后的姓名:");
                    String stuName=sc.nextLine();
                    boolean flag1 =dao.change(stuId, stuName);
                    if(flag1){
                        System.out.println("修改成功");
                    }else{
                        System.out.println("修改失败");
                    }
                    break;
                case 3:
                    //删除
                    System.out.println("请输入需要删除的用户ID:");
                    int delId=Integer.parseInt(sc.nextLine());
                    boolean flag2=dao.delete(delId);
                    if(flag2){
                        System.out.println("删除成功");
                    }else{
                        System.out.println("删除失败");
                    }
                    break;
                case 4:
                    //显示
                    for(StuInfo all:dao.selectAll()){
                        System.out.println(all.getStuID()+"\t"+all.getStuName()+"\t"+all.getStuAge());
                    }
                    break;
            }
            System.out.println("请按回车键返回主菜单!");
            sc.nextLine();
        }while(true);
    }
}

好了,这就是一个使用Dao设计模式做的一个小Demo,初学Java对的同学可以看看。

2017-02-23 23:25:04 星期四