跳转到目录
DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑
与数据库资源
中间。
DAO中的主要操作: 增删改查(CRUD)
上图存在的问题:
在DAO层中设置save和get方法时
void save(String name,Integer age
);
问题:
如果需要保存的学生有多个信息,此时参数就有N多.
设计方法时,参数最好不要超过5,6个.
问题如何解决?
String
get(Long id):根据学生的主键来查询学生信息
此时因为需要返回学生的多个信息,此时的返回类型设计是不合理的.
问题如何解决?
解决方案:
使用封装思想,把学生的多个信息封装成一个对象.
保存操作:
void save(Student stu
);
查询操作:
Student
get(Long id)
跳转到目录
DAO是一个组件(可以重复使用)
分包规范
命名规范
创建DAO对象规范
跳转到目录
/**
* 学生对象CRUD操作
* @author ZYGui
*/
public interface IStudentDAO {
/**
* 保存指定的学生对象
* @param stu 需要保存的学生对象
*/
void save(Student stu);
/**
* 删除指定id的学生对象
* @param id 需要被删除的学生的id
*/
void delete(Long id);
/**
* 更新指定id的学生对象
* @param newStu 新的Student对象数据(该对象包含id)
*/
void update(Student newStu);
/**
* 查询指定id的学生对象
* @param id 需要查询的学生id
* @return 如果该id的学生存在,则返回,不存在返回null
*/
Student get(Long id);
/**
* 查询所有的学生对象
* @return 返回所有学生对象集合,如果没有学生对象,返回一个空集
*/
List<Student> list();
}
/**
* StudentDAOImpl的优化版本
* 使用PreparedStatement
* @author ZYGui
*/
public class StudentDAOImpl_bak2 implements IStudentDAO {
@Override
public void save(Student stu) {
// INSERT INTO student (name, age) VALUES ("XXX", 23)
String sql = "INSERT INTO student(name, age) VALUES(?,?)";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, stu.getName());
ps.setInt(2, stu.getAge());
int count= ps.executeUpdate();
System.out.println("操作成功"+ count + "条数据!");
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(ps, conn);
}
}
@Override
public void delete(Long id) {
String sql = "DELETE FROM student WHERE id = ?";
Connection conn = null;
Statement st = null;
try {
conn = JDBCUtils.getConnection();
st = conn.createStatement();
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(st, conn);
}
}
@Override
public void update(Student newStu) {
// UPDATE student SET name = "XX", age=XX WHERE id = 1;
String sql = "UPDATE student SET name = ?, age = ? WHERE id = ?";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, newStu.getName());
ps.setInt(2, newStu.getAge());
ps.setLong(3, newStu.getId());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(ps, conn);
}
}
@Override
public Student get(Long id) {
String sql = "SELECT * FROM student where id = ?";
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
//3. 获取语句对象
st = conn.createStatement();
//4. 执行sql
rs = st.executeQuery(sql);
if (rs.next()) {
Student stu = new Student();
Long sid = rs.getLong("id");
String name = rs.getString("name");
Integer age = rs.getInt("age");
stu.setId(sid);
stu.setName(name);
stu.setAge(age);
return stu;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, st, conn);
}
return null;
}
@Override
public List<Student> list() {
String sql = "SELECT * FROM student";
List<Student> list = new ArrayList<>();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
//3. 获取语句对象
st = conn.createStatement();
//4. 执行sql
rs = st.executeQuery(sql);
while (rs.next()) {
Student stu = new Student();
list.add(stu);
Long id = rs.getLong("id");
String name = rs.getString("name");
Integer age = rs.getInt("age");
stu.setId(id);
stu.setName(name);
stu.setAge(age);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, st, conn);
}
return list;
}
}
优化请看博客:
/**
* 描述学生对象
* @author ZYGui
*/
public class Student {
private Long id; // 唯一标识
private String name; // 学生姓名
private Integer age; // 学生年龄
public Student(){
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class StudentDAOTest {
// 创建DAO对象
private IStudentDAO studentDAO = new StudentDAOImpl();
@Test
public void testSave() {
studentDAO.save(new Student("张三", 43));
}
@Test
public void testDelete() {
studentDAO.delete(8L);
}
@Test
public void testUpdate() {
Student newStu = new Student("大头", 19);
newStu.setId(3L);
studentDAO.update(newStu);
}
@Test
public void testGet() {
Student student = studentDAO.get(2L);
System.out.println(student);
}
@Test
public void testList() {
List<Student> list = studentDAO.list();
for (Student s : list) {
System.out.println(s);
}
}
// 查询student表中有多少条数据
/*
* +-----------+
| count(id) |
+-----------+
| 3 |
+-----------+
* */
@Test
public void testGetTotalCount(){
String sql = "SELECT COUNT(id) FROM student";
Long totalCount = JdbcTemplate.query(sql, new IResultSetHandler<Long>() {
@Override
public Long handle(ResultSet rs) throws Exception {
if (rs.next()){
return rs.getLong(1); // 只有一列
}
return 0L;
}
});
System.out.println(totalCount);
}
}