第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();
}
}
}

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

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

  1. Java oop第08章_JDBC01(入门)

    一. JDBC的概念: JDBC(Java Database Connectivity)java数据库链接,是SUN公司为了方便我们Java程序员使用Java程序操作各种数据库管理系统制定的一套标准( ...

  2. java oop第10章_JDBC03(MVC分层模式)

    引言:在进行程序开发的时候,为了更加利于程序的管理我们引入了新的开发模式MVC分层模式,即按功能将程序代码分别分为M(Model模型).V(View视图).C(Controller控制器)三个组成部分 ...

  3. java oop第07章_集合框架

    一. 什么是集合: 在Java中提供了一些可以保存同一数据类型的数据集称为集合,就是规定了一些集合的规范(接口.抽象类.实现类)及方法, 方便我们程序在保存数据时进行增.删.改.查操作,编程更加高效. ...

  4. java oop第15章_Socket网络编程

    一.   TCP/IP协议(Transmission Control Protocol/Internet Protocol)传输控制协议/Internet协议,是通信领域的基础.核心协议, 其他的协议 ...

  5. java oop第14章_Swing(Java界面设计)

    一.   Swing相关的概念: 1.  GUI:(Graphical User Interface):图形化用户界面,通过图形化的方式提供与用户交互的平台,向用户展示信息.收集用户提交的数据. 2. ...

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

    引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,Java针对文件系统的操作提供了一套规范,即IO,针对计算机内存而言,输入的称为输入流,输出的称为输出流. 一.     ...

  7. Java oop 第13章_多线程

    第13章_多线程 一.   多线程相关的概念:  程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念.   进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...

  8. java oop第11章_反射、BaseDao的进一步改造

      引言:从Java5开始,Java中引用了一个新的概念反射,当程序运行时,能动态感知到程序中拥有的所以信息,这个获取信息的过程是采用反射机制来完成. 一.       Class类: Class类用 ...

  9. Java OOP——第六章 框架集合

    1.集合框架包含的主要内容及彼此之间的关系: 图1:   集合框架:是为了表示和操作集合而统一规定的一种统一的标准体系结构.               包含三大块的内容:对外的接口.接口的是实现和对 ...

随机推荐

  1. PHP面试 PHP基础知识 二(常量及数据类型)

    常量及数据类型 PHP八种数据类型 四种标量类型 字符串(string).布尔(boolean).浮点(float/double).整型(integer) 两种复合类型 数组(array).对象(ob ...

  2. 7、jmeter-定时器介绍与使用

    jmeter-定时器介绍与使用 固定定时器 Uniform Random Timer Precise Throughput Timer Constant Throughput Timer 高斯随机定时 ...

  3. 在Linux下编译带调试功能的Bochs

    在Linux下使用Bochs参考: http://wangcong.org/articles/bochs.html http://kinglaw05.blog.163.com/blog/static/ ...

  4. 2019牛客多校第三场F-Planting Trees(单调队列)

    Planting Trees 题目传送门 解题思路 枚举每一个下边界,再枚举其对应的所有上边界,求出其对应区间内的最大最小值,当下边界一样的时候,其最大最小值可以随着上边界减小逐步更新.然后将这些最大 ...

  5. 错误 1 error C4996: 'getcwd': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getcwd. See online help for details.

    解决办法: 属性>C/C++>预处理定义>编辑>添加_CRT_NONSTDC_NO_DEPRECATE>应用

  6. 20140610 PP中可以绘制表格;PPT组合之后再加效果

    PPT绘制表格(行人检测的cell和block) 动画:组合之后再加效果

  7. struts基础2

    Result配置详解 说明:在前面的许多案例中我们所用到的Action基本都继承自ActionSupport这个类,而在这个类中我们定义了五个字段:SUCCESS,NONE,ERROR,INPUT,L ...

  8. hdu6331 /// Floyd+分块DP

    题目大意: 给定单向图的n m 为点数和单向边数 接下来m行给定 u v w 为边的起点终点和长度 给定q 为询问个数 接下来q行给定 x y k 求从x到y至少经过k条边的最短路长度 https:/ ...

  9. JS点击2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 2019-3-1-win10-uwp-在-VisualStudio-部署失败,找不到-Windows-Phone-可能的原因

    title author date CreateTime categories win10 uwp 在 VisualStudio 部署失败,找不到 Windows Phone 可能的原因 lindex ...