JDBC——DAO组件、设计规范和设计分析

目录


DAO组件

跳转到目录

DAO思想和设计分析

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是一个组件(可以重复使用)

  • 分包规范

    • 域名倒写.项目模块名.组件
    • com.sunny.login.util 登录模块的工具类
    • com.sunny.login.domain 模块的模型对象
    • com.sunny.login.dao 模块的dao接口
    • com.sunny.login.dao.impl 模块的dao接口的实现类
  • 命名规范

    • dao对象: xxxDAO, 比如: employeeDAO
    • domain类 : 描述对象的,一把使用英文单词来表示:Xxx,比如:Employee.
    • DAO接 口: IXxxDAO/IXxxDao, 如:IEmployeeDAO/IEmployeeDao.
    • DAO实现类: XxxDAOImpl/XxxDaoImpl, 如:EmployeeDAOImpl,EmployeeDaoImpl. 注意:实现类一定要实现DAO接口.
    • DAO测试类: 根据DAO接口生成测试类, XxxDAOTest/XxxDaoTest,如:EmployeeDAOTest,EmplyeeDaoTest.
  • 创建DAO对象规范

    • DAO对象起名,统统叫做xxxDAO.
    • 面向接口编程,把DAO对象赋给DAO接口类型.
      IEmployeeDAO employeeDAO= new EmployeeDAOImpl();

DAO组件设计

跳转到目录
在这里插入图片描述


简单的案例

跳转到目录

  • com.sunny.smis.dao下
    IStudentDAO.java
/**
 * 学生对象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();
}
  • com.sunny.smis.dao.impl下
    StudentDAOImpl.java (未优化,优化版本请看下一博客)
/**
 * 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;
    }
}

优化请看博客:

  • com.sunny.smis.domain
    Student.java
/**
 * 描述学生对象
 * @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 +
                '}';
    }
}
  • com.sunny.smis.test
    StudentDAOTest.java
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);
    }
}
发布了149 篇原创文章 · 获赞 68 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/m0_37989980/article/details/104069666
今日推荐