import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.jdbc.entity.Person;
//封装Person表的增删改查方法
public class PersonDaoImpl {
//这里的问号?是占位符,用于给将要传递的参数占位置,实现了动态SQL语句的执行
//添加一条记录的SQL语句,第一个参数由于数据表中是主键自增,这里可以用null
private static final String SQL_ADD = "insert into person values(null,?,?,?)";
//删除,指定id的记录
private static final String SQL_DEL = "delete from person where id = ?";
//修改,指定id的记录
private static final String SQL_UPD = "update person set name = ?,gender = ?,age = ? where id = ?";
//查询,指定id记录
private static final String SQL_ID = "select * from person where id = ?";
//查询,所有记录
private static final String SQL_ALL = "select * from person";
//添加一条记录
public boolean add(Person p) {
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(SQL_ADD);
//把我们传入的person对象的属性值分作为占位符的值传入,数组各值顺序对应占位符字段顺序
Object[] params = {p.getName(),p.getGender(),p.getAge()};
int len = params.length;
for(int i = 0;i < len;i++) {
//!!!这里比较特殊,很多下标都是从0开始,例如数组,
//!!!但是这个setObject方法第一个索引参数是从1开始
ps.setObject(i+1, params[i]);
}
//这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数
//之前的Statement.excute方法要传入SQL语句字符串参数,
//但是用了PreparedStatement就不用传参数了,因为在前面我们已经预定义处理了
int line = ps.executeUpdate();
if (line > 0) {
System.out.println("添加成功,受影响记录数为"+line);
return true;//结束,但是后面finally区代码会执行
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭相关对象
JdbcUtil.close(null, ps, conn);
}
System.out.println("添加失败");
return false;
}
//删除一条记录
public boolean delete(int id) {
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(SQL_DEL);
ps.setInt(1, id);
//这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数
int line = ps.executeUpdate();
if (line > 0) {
System.out.println("删除成功,受影响记录数为"+line);
return true;//结束,但是后面finally区代码会执行
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭相关对象
JdbcUtil.close(null, ps, conn);
}
System.out.println("删除失败");
return false;
}
//修改一条记录
public boolean update(Person p) {
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(SQL_UPD);
//把我们传入的person对象的属性值分作为占位符的值传入
Object[] params = {p.getName(),p.getGender(),p.getAge(),p.getId()};
int len = params.length;
for(int i = 0;i < len;i++) {
//!!!这里比较特殊,很多下标都是从0开始,例如数组,
//!!!但是这个setObject方法第一个索引参数是从1开始
ps.setObject(i+1, params[i]);
}
//这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数
int line = ps.executeUpdate();
if (line > 0) {
System.out.println("修改成功,受影响记录数为"+line);
return true;//结束,但是后面finally区代码会执行
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭相关对象
JdbcUtil.close(null, ps, conn);
}
System.out.println("修改失败");
return false;
}
//获取一条记录,这里返回的不再是布尔值,而是一个对应数据表中一条记录的Person对象
public Person findById(int id) {
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(SQL_ID);
ps.setInt(1, id);
//返回结果集,这里是查询指定id,所以结果集中应该最多只有一条记录
rs = ps.executeQuery();
if(rs.next()) {
Person p = new Person();
p.setId(id);
//这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值
p.setName(rs.getString("name"));
p.setGender(rs.getString("gender"));
p.setAge(rs.getInt("age"));
return p;//返回p对象,结束
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭相关对象
JdbcUtil.close(rs, ps, conn);
}
return null;
}
//获取所有记录,返回结果集不便操作,故封装到一个List中作为方法返回值
public List<Person> findAll() {
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<Person> list = new ArrayList<>();
try {
ps = conn.prepareStatement(SQL_ALL);
//返回结果集
rs = ps.executeQuery();
while(rs.next()) {
//创建一个Person对象
Person p = new Person();
//这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值
p.setId(rs.getInt("id"));
p.setName(rs.getString("name"));
p.setGender(rs.getString("gender"));
p.setAge(rs.getInt("age"));
list.add(p);//添加至集合
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭相关对象
JdbcUtil.close(rs, ps, conn);
}
return null;
}
}
JDBC操作数据库步骤概述如下:
1.注册加载驱动类
2.获取连接
3.创建语句对象
4.执行SQL语句(excute)
5(可选).处理结果
6.关闭相关对象(注意顺序:依次为ResultSet、Statement/PreparedStatement、Connction)
扩展