java oop第09章_JDBC02(CRUD操作)

第09章_JDBC02(CRUD操作)

CRUD(CREATE 、 RETIVE 、 UPDATE 、 DELETE)增删改查。

DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应操作,本章讨论DAO中需要提供一些什么方法?

一、     Dao常用的方法

1、     增加的方法:

  通常需要传入实体对象携带所有属性值,作为插入的数据;返回的是受影响的行数(int类型)。

  如:insertDept(Dept dept)

2、     删除的方法:通常需要传入id(指的是数据表中的主键对应的属性)返回的是受影响的行数(int类型)。

  如:deleteDeptById(int deptNo)

3、     修改的方法:

  通常需要传入实体对象携带所有属性值,id作为修改的条件,id以外的属性作为修改的数据;返回的是受影响的行数(int类型)。

  如:updateDeptById(Dept dept)

4、     查询的方法:

  1)   查询所有对象的方法:

    不需要传参数,返回的是对象集合

    如selectDeptAll()

  2)   通过Id查询对象的方法:

    传入id作为查询的条件;返回的是查询到的实体对象,最多只可能查询到一个对象

    如selectDeptBYId(Integer deptNo)

  3)   模糊查询的方法:

    传入查询的关键字,返回对象集合

    如selectDeptLike(String keywords)

 

  4)   通过外键查询对象集合的方法:

    传入外键值作为查询的条件,返回的是对象集合。

    如:selectDeptByForeignKey(T foreignName)

package com.oop.dao.impl;

import java.sql.*;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import com.oop.entity.Dept;

/**
 * 针对Dept实体操作的Dao实现类: 其中会提供一些针对Dept实体对应的数据表tb_dept的CRUD方法。
 */
public class DeptDaoImpl {
    Connection ct = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    Dept dept = null;
    List<Dept> deptList = new ArrayList<Dept>();
    // 定义一个变量,接收返回的受影响的行数
    Integer var = 0;

    /**
     * 通过Id(deptNo)查询Dept对象的Dao层方法。
     *
     * @param deptNo:部门编号,作为查询的条件,返回查询到的Dept对象
     * @return
     */

    public Dept selectDeptById(Integer deptNo) {
        try {
            // 1---加载(注册)驱动:指定需要链接的是哪种数据库管理系统
            /*
             * 用Class类直接调用forName(String className)方法
             * 获取Driver类在Class中注册的对象,通过该对象可以利用“反射机制”获取到Driver类中的所有信息。
             */
            Class.forName("com.mysql.jdbc.Driver");

            // 2---获取与数据库链接:需要指定URL(jdbc:mysql://127.0.0.1:3306/数据库名)、user、password。
            // 返回值需要用一个connection接口实现类的对象ct接收
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");

            // 3---通过获取到的与数据库的链接connection向数据库发送带参数(占位符‘?’)的SQL语句,返回PreparedStatement接口实现类的对象pst。
            String sql = "SELECT * FROM tb_dept WHERE deptno = ?";
            pst = ct.prepareStatement(sql);

            // 4、通过PreparedStatement接口实现类的对象pst调用与数据类型相关的各种setter方法对“占位符”赋值,
            // setxxx(int 参数的索引(占位符)所在的位置, T ?占位符的值)。从1开始
            pst.setInt(1, deptNo);

            // 5、再通过PreparedStatement接口实现类的对象调用executeQuery()、executeUpdate()方法执行查询、增删改等操作,
            // 并返回ResultSet接口类型 、int的结果
            rs = pst.executeQuery();

            // 6、对结果进行处理。
            /*
             * next():将指针向下移动一个单位;判断是否还有下一个记录(对象) rs.getxxx():与数据类型相关的方法,获取相应类型的值
             * rs.getxxx(int columnIndex):以字段的索引来获取对应字段的值(从1开始) rs.getxxx(int
             * columnLabel):以字段的标签(指定列的值)来获取对应字段的值
             */

            while (rs.next()) {
                dept = new Dept();
                // 调用dept的各种setter方法,并将从数据库中得到相应的值作为参数传给dept的setter方法
                dept.setDeptNo(rs.getInt("deptno"));
                dept.setDName(rs.getString("dname"));
                dept.setDName(rs.getString("loc"));
            }
        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {
            // 7、关闭打开的资源:connection、PreparedStatement、ResultSet。
            // 关闭资源的顺序应采用倒叙的方式来关闭:先开的后关,后开的先关
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 返回值,返回Dept的对象dept
        return dept;
    }

    /**
     * 查询所有Dept对象的Dao层方法。
     *
     * @return:返回查询到的Dept对象集合
     */
    public List<Dept> selectDeptAll() {
        // 创建一个List对象deptlist,因为查询整个数据表中的数据,所以需要一个容器来装
        //List<Dept> deptList = new ArrayList<Dept>();

        try {
            Class.forName("com.mysql.jdbc.Driver");
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");
            String sql = "SELECT * FROM tb_dept";
            pst = ct.prepareStatement(sql);
            rs = pst.executeQuery();

            Dept dept = null;
            while (rs.next()) {
                dept = new Dept();
                dept.setDeptNo(rs.getInt("deptno"));
                dept.setDName(rs.getString("dname"));
                dept.setLoc(rs.getString("loc"));
                // 将dept对象放入deptList集合中,每次循环就放入一个对象。否则就只会出现最后一个对象(记录)
                deptList.add(dept);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return deptList;
    }

    /**
     * 通过Id(deptNo)增加Dept对象的Dao层方法。
     *
     * @param dept:Dept对象
     * @return:返回int类型受影响的行数
     */

    public int insertDept(Dept dept) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");
            String sql = "INSERT INTO tb_dept VALUES (‘50‘, ‘ACCOUNTING‘, ‘KUN MING‘)";
            pst = ct.prepareStatement(sql);
            // var接收受影响的行数
            var = pst.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return var;
    }

    /**
     * 通过Id(deptNo)删除Dept对象的Dao层方法。
     *
     * @param deptNo:通过部门编号删除记录
     * @return
     */
    public int deleteDeptById(int deptNo) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");
            String sql = "DELETE FROM tb_dept WHERE deptno = ?";
            pst = ct.prepareStatement(sql);
            pst.setInt(1, deptNo);
            var = pst.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return var;

    }
    /**
     * 通过Id(deptNo)修改Dept对象的Dao层方法。
     * @param deptNo
     * @return
     */
    public int updateDeptById(int deptNo) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");
            String sql = "UPDATE tb_dept SET loc = ‘成都‘  where deptno = ?";
            pst = ct.prepareStatement(sql);
            pst.setInt(1, deptNo);
            var = pst.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return var;
    }

    /**
     * 通过Id(deptNo)模糊查询Dept对象的Dao层方法。
     * @param deptNo
     * @return
     */
    public List<Dept> selectDeptLike(String keywords) {
        try {
            /*Class.forName("com.mysql.jdbc.Driver");
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");*/       ct = getConnection();
            String sql = "SELECT * FROM tb_dept WHERE dname LIKE ?";
            pst = ct.prepareStatement(sql);
            pst.setString(1, keywords);
            rs = pst.executeQuery();
            Dept dept = null;
            while (rs.next()) {
                dept = new Dept();
                dept.setDeptNo(rs.getInt("deptno"));
                dept.setDName(rs.getString("dname"));
                dept.setLoc(rs.getString("loc"));
                deptList.add(dept);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {        closeAll();
            /*try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }*/
        }
        return deptList;

    }
}

二、     封装一个Dao的基础类BaseDao

  1. 1.    设计思想:

    BaseDao类定义三个属性(Connection、PreparedStatement、ResultSet类型)和两个方法:获取连接的方法getConnection()、关闭资源的方法closeAll。

  1. 2.    如何使用BaseDao帮助我们提高效率:

    1)     常规方式:创建BaseDao的对象,通过对象调用属性和方法。

    2)     静态处理:将属性和方法都定义为静态(static),调用时直接通过“类名.属性名”、“类名.方法名()”,会有线程安全的问题。

    3)     继承方式:在BaseDao中将属性和方法定义为protected访问范围,以后的Dao实现类中只要继承BaseDao就能自动拥有三个属性和两个方法。

package com.oop.util;

/*
 * BaseDao类定义三个属性(Connection、PreparedStatement、ResultSet类型)和
 * 两个方法:获取连接的方法getConnection()、关闭资源的方法closeAll。
 */
import java.sql.*;

public class BaseDao {
    // 三个属性
    protected Connection ct = null;
    protected PreparedStatement pst = null;
    protected ResultSet rs = null;

    // 获取连接
    protected Connection getConnection() {
        try {
            // 1---加载(注册)驱动:指定需要链接的是哪种数据库管理系统
            /*
             * 用Class类直接调用forName(String className)方法
             * 获取Driver类在Class中注册的对象,通过该对象可以利用“反射机制”获取到Driver类中的所有信息。
             */
            Class.forName("com.mysql.jdbc.Driver");

            // 2---获取与数据库链接:需要指定URL(jdbc:mysql://127.0.0.1:3306/数据库名)、user、password。
            // 返回值需要用一个connection接口实现类的对象ct接收
            ct = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myschool39", "root", "root");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return ct;

    }

    //关闭资源
    protected void closeAll() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            if (ct != null) {
                ct.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

之前代码中的相关内容就可以通过以上方法进行替换,使代码更加简洁

原文地址:https://www.cnblogs.com/zhangzimuzjq/p/11743602.html

时间: 2024-10-28 15:59:50

java oop第09章_JDBC02(CRUD操作)的相关文章

Java oop第08章_JDBC01(入门)

一. JDBC的概念: JDBC(Java Database Connectivity)java数据库链接,是SUN公司为了方便我们Java程序员使用Java程序操作各种数据库管理系统制定的一套标准(规范), 其中定义一些接口.抽象类和抽象方法,再由各个数据库管理系统厂商实现这些抽象方法,我们程序员只要学习一套JDBC规范就可以操作各种数据库管理系统. JDBC也是一个注册商标. 二. JDBC的入门案例/JDBC的开发流程: 1. 创建一个Java project/web project:JD

java oop第12章_IO、序列化和反序列化

引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,Java针对文件系统的操作提供了一套规范,即IO,针对计算机内存而言,输入的称为输入流,输出的称为输出流. 一.      IO的分类:     从传递方向划分:输入流(InputXxx).输出流(OutPutXxx).     从数据格式划分:字节流(XxxStream).字符流(XxxReader.XxxWriter).     从数据中转的节点划分:节点流.过滤流 图源:http://test.processo

java OOP第03章_继承、抽象类和抽象方法

一. 为什么需要继承: 若多个类中都需要一些属性和方法,那么就可以将属性和方法抽取到一个父类中,需要的子类可以通过extends关键字去继承这个父类后拥有相应的属性和方法. 类.数组.方法----引用数据类型 二. 继承的流程: 1. 编写父类:Animal 2. 编写子类:Dog.Cat.Pig 3. 在子类中通过extends关键字去继承父类: 三. 继承的注意事项: 1. 父类中的属性和方法只有使用protected.public修饰的才能被子类继承. 2. 当编写一个类时,若使用了ext

Java oop第05章_多态、接口

一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可以实现多个接口. 二. 接口的定义和使用: 1. 定义接口:使用interface关键字. 2. 实现接口:在一个抽象类或实现类中可以通过implements关键字. 三. 接口的注意事项: 1. 接口是比抽象类更加抽象的“类”,接口中所有的方法都是抽象方法(不管是否使用abstract关键字修饰)

Java Script 第09章 Ajax应用

MongoDB对图片进行CRUD操作——与JAVA结合

上几篇博客简单对MongoDB进行了简单介绍和如何安装,以及在dos下是如何操作MongoDB和在安装MongoDB中,出现了什么错误,是如何解决的.当然这些都还不够,我们还要用到实际当中去.我用MyEclipse+JDK1.7做了一个简单的demo,来展示下MongoDB怎么运用到实际中去. MongoDB作为一个NoSql数据库的代表,存取多媒体数据,应该是强项吧?那么,在MongoDB中是如何对图片进行CRUD操作的. 上几篇博客中已经提到,MongoDB的文档结构是BSON格式,BSON

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

JAVA实现DAO基本层CRUD操作

随着shh2各种操作方便框架.越来越多JAVA WEB效率,可是,假设在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成非常多不是必需的资源浪费. 在项目开发中.对数据库的CRUD操作我们一般都是无法避免的操作,尽管hibernate封装的非常完美,可是.因为本人对这个框架的底层原理不是非常了解,每次使用的时候心里总认为没底.代码一旦出现异常,非常多时候都没法高速有效地解决.因此,为了让代码异常处理风险控制在自己的可控范围内,还是决定先将数据的CR

JAVA实现DAO层基本CRUD操作

随着shh2框架各种操作的便利性,越来越多的JAVA WEB开发人员选择通过加入这些框架以提高开发效率,但是,如果在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成很多没必要的资源浪费. 在项目开发中,对数据库的CRUD操作我们一般都是无法避免的操作,虽然hibernate封装的很完美,但是,由于本人对这个框架的底层原理不是很了解,每次使用的时候心里总觉得没底,代码一旦出现异常,很多时候都没法快速有效地解决,因此,为了让代码异常处理风险控制在自己的