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

二、 JDBC的入门案例/JDBC的开发流程:
  1. 创建一个Java project/web project:JDBC
  2. 添加链接数据库的jar包:Mysql的jar包。
  步骤:
    1) 在项目的根目录下创建一个存放jar包的文件夹:lib
    2) 将MySQL的jar包复制到lib下。
    3) 在MySQL的jar包上右键build path Add to build path,将jar文件加入到当前项目中,自动添加到Reference Libraries库中。
  3. 创建项目需要的包:
    1)Com.oop.entity:放置实体(和数据库向对应)
    2)Com.oop.dao:放置DAO接口,(Data Access Object)数据访问对象,专门与数据库打交道的对象,其中会提供一些针对数据库的CRUD方法
    3)com.oop.dao.impl:放置DAO实现类中实现DAO接口中定义的方法。
    4)com.oop.service:放置service接口,业务/服务层,通常用于编写与项目相关的一些业务代码,向下会调用DAO层的方法,并返回给上一层(controller层,控制器层)
    5)com.oop.service.impl:放置service实现类,实现service接口中定义的方法。
    6)com.oop.controller:放置控制器层的类,由Servlet程序作为控制器。
    7)com.oop.util:工具包,放置一些项目中需要使用的通用工具类。
    8)com.oop.test:测试包,放置针对项目代码测试的一些测试类。
  4. 在com.oop.dao.impl层编写JDBC的实现类:
    tb_dept表对应的实体类Dept
package com.oop.entity;

import java.io.Serializable;

/**
* 练习封装tb_dept表对应的实体类Dept 八种基本数据类型对应的有八种引用数据类型(包装数据类型),
* byte short int long loat double char boolean
* Byte Short Integer Long Float Double Character
* Boolean
*
*/
public class Dept implements Serializable {
private static final long serialVersionUID = 1L;
private Integer deptNo; // 部门编号
private String dName; // 部门名称
private String loc; // 部门所在地 //setter、getter方法的区域:
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public Integer getDeptNo() {
return deptNo;
} public void setDName(String dName) {
this.dName = dName;
}
public String getDName() {
return dName;
} public void setLoc(String loc) {
this.loc = loc;
}
public String getloc() {
return loc;
} //构造方法的区域:
//默认的构造方法,当手动写了一个带参的构造方法,默认的就会失效
public Dept() { }
//有参的构造方法
public Dept(Integer deptNo) {
this.deptNo = deptNo;
}
public Dept(String dName,String loc) {
this.dName = dName;
this.loc = loc;
}
public String method1() {
return null;
} //重写toString方法
@Override
public String toString() {
return "Dept [deptNo=" + deptNo + ", dName=" + dName + ", loc=" + loc + "]";
}
}
   DeptDaoImpl实现类:
   EmpDaoImpl实现类:
    1) 加载(注册)驱动:指定需要链接的是哪种数据库管理系统
    2) 获取与数据库链接:需要指定URL(jdbc:mysql://127.0.0.1:3306/数据库名)、user、password。
    3) 通过获取到的与数据库的链接connection向数据库发送SQL语句,返回PreparedStatement接口实现类的对象。
    4) 通过PreparedStatement接口实现类的对象调用与数据类型相关的各种setter方法对“占位符”赋值。
    5) 再通过PreparedStatement接口实现类的对象调用executeQuery()、executeUpdate()方法执行查询、增删改操作,并返回ResultSet接口类型 、int的结果
    6) 对结果进行处理。
    7) 关闭打开的资源:connection、PreparedStatement、ResultSet。关闭资源的顺序应采用倒叙的方式来关闭:先开的后关,后开的先关
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;
/**
* 通过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.setDName(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;
}
}
  5.    编写测试类:测试com.oop.dao.impl中实现类的方法是否正确,保证调用者使用这些方法是没有问题的。
package com.oop.test;

import java.util.List;
import org.junit.Test;
import com.oop.dao.impl.DeptDaoImpl;
import com.oop.entity.Dept; /*
* 测试类:测试DeptDaoImpl实现类中的方法是否正确
*/
public class DeptDaoImplTest { @Test
public void testSelectDeptById() {
//实例化DeptDaoImpl类
DeptDaoImpl deptDaoImpl = new DeptDaoImpl();
//定义Dept类型的返回值对象接收selectDeptById(20)方法的返回值,并传入参数
Dept dept = deptDaoImpl.selectDeptById(20);
//输出dept
System.out.println(dept);
} @Test
public void testSelectDeptAll() {
//实例化DeptDaoImpl类
DeptDaoImpl deptDaoImpl = new DeptDaoImpl();
//定义dept接收selectDeptAll()方法的返回值
List<Dept> dept = deptDaoImpl.selectDeptAll();
//遍历list集合
for (Dept de : dept) {
System.out.println(de);
}
} }
运行结果:

三、 JDBC的API总结:
  JDBC(Java Database Connectivity)java数据库链接,Sun公司定义了一些标准(接口、抽象类、实现类),再由数据管理系统的厂商实现对应的方法。
  API(Application Programming Interface):应用程序开发接口,为完成某些特定功能而设计、开发的标准,如JDBC专门与数据库打交道的标准。
API由两个部分构成:标准的程序本身、由程序中的文档注释到处的手册称为API手册。
  1、 Class.forName("com.mysql.jdbc.Driver"):获取Driver类在Class中注册的对象,通过该对象可以利用“反射机制”获取到Driver类中的所有信息。
  2、 DriverManager.getConnection("jdbc:mysql://127.0.0.1/数据库名", "数据库用户名", "数据库密码"):获取与数据库的链接:需要用URL地址指定要链接哪个服务器、哪个端口、哪个数据库。
  3、 Connection 接口:与数据库建立连接并可发送sql语句的接口。
      Ct.prepareStatement(String sql): 向数据库发送带参数(占位符)的SQL语句,返回PreparedStatement接口实现类的对象
  4、 PreparedStatement接口:预编译的SQL语句,其中提供了两类方法,一类是与数据类型相关的set方法,用于给SQL语句占位符赋值;另一类是执行操作的方法:
    1) executeQuery()执行查询的方法,返回值是查询到的数据通过(ResultSet)结果集保存,再通过结果集就可以获取到查询的结果;
    2) executeUpdate()执行增删改的方法,返回值是受影响的行数(int),通过它判断执行是否成功。
  5、 ResultSet接口:保存执行1) executeQuery()方法得到的结果,其中两类方法:
    1) ResultSet.next()方法:将指针下移一个单位;判断是否还有下一个元素
        另一个getter方法与数据类型相关,指定获取哪个字段,通常将获取到值放置到对象属性的属性值
    2) ResultSet.getxxx(int columnIndex):以字段的索引来获取对应字段的值(从1开始)
        ResultSet.getxxx(int columnLabel):以字段的索引来获取对应字段的值

Java oop第08章_JDBC01(入门)的更多相关文章

  1. Java oop 第13章_多线程

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

  2. java oop第09章_JDBC02(CRUD操作)

    第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应 ...

  3. Java OOP——第五章 异常

    1. 尝试通过if-else来解决异常问题: Eg: public class Test2 {       public static void main(String[] args) {       ...

  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第11章_反射、BaseDao的进一步改造

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

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

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

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

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

随机推荐

  1. 1、Monkey环境搭建

    步骤: 1.下载adb压缩包: 32位计算机,用这个包:64位计算机,用这个包: 2.把对应的adb压缩包在本地解压,然后把解压后的文件里面的文件夹拷贝到D盘(当然随便你放在哪个目录)根目录,注意路径 ...

  2. PAT_A1055#The World's Richest

    Source: PAT A1055 The World's Richest (25 分) Description: Forbes magazine publishes every year its l ...

  3. PAT_A1062#Talent and Virtue

    Source: PAT A1062 Talent and Virtue (25 分) Description: About 900 years ago, a Chinese philosopher S ...

  4. ThreeJS模型展示为黑色,模型出不来

    选取gltf格式时,出现模型为黑色,模型出不来 原因: 我们设计部可能是用maya或者3dmax去做:在模型导出时,没有gltf格式:如果maya或者3dmax导出obj然后导进blender,再导出 ...

  5. Invalidate() InvalidateRect() 与 UpdateWindow()

    按引:Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区.而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最 ...

  6. Dubbo面试20问!这些题你都遇到过吗?

    作者:Dean Wang https://deanwang1943.github.io/bugs/2018/10/05/面试/饿了么/dubbo 面试题/ 1.dubbo是什么 dubbo是一个分布式 ...

  7. C# WinfForm 控件之dev报表 XtraReport(三) 动态数据绑定

    代码还用上一节的,把reportFrx的dataSource去掉.各cell绑定的字段也去掉,有了第二节的基础,现在看这个ms就不难了 无非就是 传到reportFrx一个数据集 在把这个数据集 绑到 ...

  8. 微信小程序之模板消息推送

    最近在用sanic框架写微信小程序,其中写了一个微信消息推送,还挺有意思的,写了个小demo 具体见官方文档:https://developers.weixin.qq.com/miniprogram/ ...

  9. Django 框架之前

    返回主目录:Django框架 内容目录: 一.Django框架之前的内容 1.1 web应用程序的架构 1.2 HTTP协议 1.3 纯手写简单web框架 一.Django框架之前d的内容 1.1 w ...

  10. 网络编程之 OSI七层协议

    内容目录: 1.软件开发架构 2.OSI七层协议 3.每层协议介绍 1.软件开发架构 c/s架构: c:客户端 s:服务端 b/s架构: b:浏览器 s:服务器 本质:b/s其实也是c/s 2.OSI ...