Dao设计模式

什么是Dao

DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口.现在的设计模式包括以下几步
1.VO(Value Object):用来对应数据库中的表
2.Dao(Data Access Object):定义公共数据操作方法的接口
3.DaoImpl:Dao的实现类,实现Dao定义的具体方法功能
下面,演示一个学过不久的例子
1.对照数据库,新建OV表:给大家一个小技巧,如果表中字段过多,可以使用以下方法:
(1)
第一步
(2)
第二步
(3)
第三步
(4)
第四步
(5)第五步
这样在你转存的.sql文件中可以看出表机构,把你向新建的表的字段赋值
2.User.java

package com.Test_Dao.ov;
/**
* @author 唐学俊
* @version 创建时间:2017年11月2日 下午1:15:19
* 
*/
public class User {
    /*`userid` varchar(50) NOT NULL,
      `username` varchar(20) NOT NULL,
      `password` varchar(20) NOT NULL,*/
    private String userid;
    private String username;
    private String password;
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
//ps:因为使用了最新版本的eclipse和jdk,头String方法暂时不能生成,懒得自己写

这样,对应数据库中的user表就生成了,
3.DaoBase接口

package com.Test_Dao.dao;


/**
* @author 唐学俊
* @version 创建时间:2017年11月2日 下午1:20:23
* 
*/
public interface  DaoBase {
    //数据库连接大概抽取出三种

    //1.查询(select)
    public Object QueryTang();

    //2.修改(update,insert,delete)
    public boolean UpdateTang(String sql,Object... parmas);

    //3.关闭连接
    public void close(AutoCloseable auto);

}

4.DaoBaseImpl

package com.Test_Dao.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.Test_Dao.utils.CommonUtils;
import com.Test_Dao.utils.DateBaseUtils;

/**
 * @author 唐学俊
 * @version 创建时间:2017年11月2日 下午1:26:58
 * 
 */
public class DaoImpl implements DaoBase {

    Connection conn = null;
    PreparedStatement pstmt = null;

    public DaoImpl() {
         conn = DateBaseUtils.getConnection();
    }

    @Override
    public Object QueryTang() {

        return null;
    }

    @Override
    public boolean UpdateTang(String sql,Object... params) {
        int count = 0;
        boolean flag = false;
        //调用检查参数匹配方法
        if(CommonUtils.checkParameter(sql, params)) {
            new Exception("你输入的参数和占位符数量不一致");
        }else {
            try {
                pstmt = conn.prepareStatement(sql);
                for(Object object :params) {
                    count ++;
                    pstmt.setObject(count, object);//将参数传递到数据库
                }
                flag = true;
            } catch (SQLException e) {
                e.printStackTrace();
            }
            finally {
                this.close(pstmt);
                this.close(conn);
            }
        }
        return flag;
    }


    @Override
    public void close(AutoCloseable auto) {
        try {
            auto.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4-1数据库连接

package com.Test_Dao.utils;
/**
* @author 唐学俊
* @version 创建时间:2017年11月2日 下午6:40:53
* 
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DateBaseUtils {

    // 数据库配置参数
    private static final String url = "jdbc:mysql://localhost:3306/jdbc_test";
    private static final String DataBaseUserName = "root";
    private static final String DataBaseUserPassword = "960624";

    // 获取连接
    public static  Connection getConnection() {
        Connection conn = null;
        // 加载驱动,获取连接
        try {
            Class.forName("com.mysql.jdbc.Driver");

            DriverManager.getConnection(url, DataBaseUserName, DataBaseUserPassword);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

4-2检测输入的数据与占位符个数是否匹配

package com.Test_Dao.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 唐学俊
 * @version 创建时间:2017年11月2日 下午7:00:30
 * 
 */
public class CommonUtils {
    /**
     * 校验sql占位符和用户输入的参数是否匹配
     * 
     * @param sql
     * @param params
     * @return
     */

    public static boolean checkParameter(String sql, Object[] params) {
        // 调用统计占位符方法
        int counterPlaceHolder = counterPlaceHolder(sql);
        return counterPlaceHolder==params.length?true:false;
    }

    /**
     * 统计sql占位符方法
     * @param str
     * @return
     */
    public static int counterPlaceHolder(String str) {
        int count = 0;
        String patttern = "\\?";
        Pattern compile = Pattern.compile(patttern);
        Matcher matcher = compile.matcher(str);
        if (matcher.find()) {
            count++;
        }
        return count;
    }

}

5.测试类

package com.Test_Dao.dao;
import com.Test_Dao.ov.User;
import com.Test_Dao.utils.DBSUtils;
/**
* @author 唐学俊
* @version 创建时间:2017年11月2日 下午7:47:56
* 测试类
*/
public class Test {
    public static void main(String[] args) {
        DaoImpl dao = new DaoImpl(DBSUtils.getConnection());
        String sql ="insert into user values (?,?,?)";
        User user = new User();
        user.setUsername("张三");
        user.setPassword("123");
        user.setUserid("15rs3r5se4");
        boolean updateTang = dao.UpdateTang(sql,user.getUserid(),user.getUsername(),user.getPassword());
        if(updateTang) {
            System.out.println("更新成功");
        }
    }

}

更新成功
查看数据库中是否有数据
数据库

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值