Java oop第08章_JDBC01(入门)

一、    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):以字段的索引来获取对应字段的值      

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

时间: 2024-11-08 23:52:36

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

java oop第09章_JDBC02(CRUD操作)

第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应操作,本章讨论DAO中需要提供一些什么方法? 一.     Dao常用的方法 1.     增加的方法: 通常需要传入实体对象携带所有属性值,作为插入的数据:返回的是受影响的行数(int类型). 如:insertDept(Dept dept) 2.     删除的方法:通常需要传入id(指的是数据表

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基础 第一章 对象入门

第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此. 如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序化设

Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Java数据持久化层(persistencelayer)的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互. MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建.MyBatis 3 是iBATIS的全新设计,支持注解和Mapper

第四章 Hibernate入门

第四章 Hibernate入门4.1 框架技术    4.1.1 框架的概念        框架是一个提供了可重用的公共结构的半成品.    4.1.2 主流框架        4.1.2.1 Struts框架        4.1.2.2 Struts2框架        4.1.2.3 Hibernate框架            一个优秀的持久化框架,负责简化对象数据保存到数据库中,或从数据库中读取数据并封装到对象的工作.        4.1.2.4 Spring框架4.2 Hibern

第08章 泛型

1 /***************** 2 ***第08章 泛型 3 *******知识点: 4 **************1.泛型定义 5 **************2.泛型使用 6 ******************2.1 普通泛型 7 ******************2.2 类型通配符 8 ******************2.3 受限泛型 9 ******************2.4 泛型接口.类.方法 10 ******************2.5 泛型数组 11 *

转 Java操作PDF之iText详细入门

转 Java操作PDF之iText详细入门 2016年08月08日 11:06:00 阅读数:19490 iText是著名的开放项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. http://itextpdf.com/ 版本:itextpdf-5.2.1.jar 1.生成一个PDF Java代码   //Step 1-Create a Document. Document document = new