JDBC-原始DAO实现

简易数据表
1.创建数据库的一个User类
用于数据的设置和获取

package JDBCstudy.com.dao;

import java.sql.Date;

public class User {
	private int uid;
	private String username;
	private Date birthday;
	private String password;

	public User() {
		super();
	}

	public User(int uid, String username, Date birthday, String password) {
		super();
		this.uid = uid;
		this.username = username;
		this.birthday = birthday;
		this.password = password;
	}

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [uid=" + uid + ", username=" + username + ", birthday=" + birthday + ", password=" + password
				+ "]";
	}

}

2.创建一个对数据库进行增删改查的接口UserDAO作为规范类

package JDBCstudy.com.dao;

import java.util.List;

/**
 * 
 * <p> Title: UserDao </p>
 * @author Carl_蔡先生
 * @date 2019年8月23日下午2:37:31 
 * 描述:数据持久层的接口(规范) 
 * -->dao--data access object
 */
public interface UserDao {
	//查询所有
	List<User> queryAll();
	//添加
	int insert(User user);
	//修改
	int update(User user);
	//删除
	int delete(int uid);
	//根据id查询 
	User findById(int id);
}

3.对UserDAO的实现

package JDBCstudy.com.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
 * 
* <p>Title: UserDaoImpl</p>   
* @author Carl_蔡先生
* @date 2019年8月24日下午2:47:32
* 描述:UserDao的实现
 */
public class UserDaoImpl extends BaseDao implements UserDao{
	Connection conn=null;
	PreparedStatement ps=null;
	ResultSet rs=null;
	@Override
	public List<User> queryAll() {
		String sql="select *from user";
		return executeQuery(sql,User.class);
	}



	@Override
	public int insert(User user) {
			String sql="insert into user values(?,?,?,?)";
			Object[] params= {user.getUid(),user.getUsername(),user.getBirthday(),user.getPassword()};
			return executeUpdate(sql,params);
	}

	@Override
	public int update(User user) {
		String sql="update user set username =?,birthday=?,password=? where uid=?";
		Object[] params= {user.getUsername(),user.getBirthday(),user.getPassword(),user.getUid()};
		return executeUpdate(sql,params);
	}

	@Override
	public int delete(int uid) {
			String sql="delete from user where uid=?";
			return executeUpdate(sql,uid);
	}

	@Override
	public User findById(int uid) {
		String sql="select *from user where uid=?";
		List<User> list=executeQuery(sql,User.class,uid);
		if(!list.isEmpty()) {
			return list.get(0);
		}else {
			return null;
		}
	}


}

4.提取相同操作,封装到单独的工具类,同时将解决硬编码问题

package JDBCstudy.com.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 
* <p>Title: JdbcUtils</p>   
* @author Carl_蔡先生
* @date 2019年8月23日下午3:32:08
* 描述:代码复用
* 连接的获取和资源释放
* -->提取到方法getExtracted和close()-->在该类中复用,跨类不能复用
* -->JdbcUtils(获取连接和释放资源)-->获取连接存在硬编码,驱动加载多次
* -->驱动加载放置在静态代码块,编写properties文件配置处理硬编码
 */

public class JdbcUtils {
	static String url=null;
	static String user=null;
	static String password=null;
	static {	
		try {
			//ProPerties类继承的是Hashtable,使用的也是键值对方式进行存储
			Properties pros=new Properties();
			//通过工具类的类加载器,
			//调用类加载器中的getResourceAsStream()读取本地资源文件,
			//将其转换成流的形式,默认读取src中文件
			InputStream is=JdbcUtils.class
								.getClassLoader()
								.getResourceAsStream("jdbc.properties");
			//load(inStream)用来从流里面加载本地文件的键值对的映射
			pros.load(is);
			is.close();
			url=pros.getProperty("url");
			user=pros.getProperty("user");
			password=pros.getProperty("password");
			//注册一次
			Class.forName(pros.getProperty("driver"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static Connection getConnection(){
		try {
			return DriverManager.getConnection(url,user,password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException("获取连接失败");
		}
	}
	public static void close(Connection conn,PreparedStatement ps,ResultSet rs){

			try {
				if(rs!=null) {
					rs.close();
				}
				if(ps!=null) {
					ps.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
}

5.将相似操作封装成一个通用操作的类方法,使之更加灵活

package JDBCstudy.com.dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * <p>Title: BaseDao</p>
 * @author Carl_蔡先生
 * @date 2019年8月23日下午4:56:59 
 * 描述:通用的操作(适用于所有表的dao)
 */
public class BaseDao {
	Connection conn=null;
	PreparedStatement ps=null;
	ResultSet rs=null;
	//通用增删改
	//不知道类型Object 不知道个数可变参数
	public int executeUpdate(String sql,Object...params) {
		int rows=0;
		try {
			conn=JdbcUtils.getConnection();
			ps=conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++) {
				ps.setObject(i+1, params[i]);
			}
			rows=ps.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rows;
	}
	public<T> List<T> executeQuery(String sql,Class<T> clz,Object...params){
		List<T> lists=new ArrayList<T>();
		try {
			conn =JdbcUtils.getConnection();
			ps=conn.prepareStatement(sql);
			//参数赋值
			for(int i=0;i<params.length;i++) {
				ps.setObject(i+1, params[i]);
			}
			//维护行的游标->每一条记录
			rs=ps.executeQuery();
			//元数据
			ResultSetMetaData md=rs.getMetaData();
			//获取字段个数
			int count=md.getColumnCount();
			while(rs.next()) {//遍历每一条记录
				//创建一个对象并且添加到集合中
				T t=clz.newInstance();//通过反射获取传进的.class的对象
				for(int i=0;i<count;i++) {//获取每条记录的每个字段
					//1.获取字段的名字
					String name=md.getColumnName(i+1);
					//2.获取字段的值
					Object value=rs.getObject(name);
					//3.获取同名的属性
					Field filed=clz.getDeclaredField(name);
					//4.赋值
					filed.setAccessible(true);
					if(value!=null) {
						filed.set(t, value);
					}
				}
				lists.add(t);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JdbcUtils.close(conn, ps, rs);
		}
		return lists;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl·杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值