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;
}
}