博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb实训第四天上午——JDBC入门
阅读量:2070 次
发布时间:2019-04-29

本文共 9319 字,大约阅读时间需要 31 分钟。

JDBC入门

1.课程介绍

1.介绍JDBC;(理解)

2.使用JDBC完成CRUD(掌握)
3.DAO层介绍(Dao层)(掌握)
4.DAO层实现;(掌握)
5.代码重构;(掌握)

2.什么是JDBC

2.1 JDBC引入

现在目前所学的知识,很散,很乱,很多,但是其实是有条线把所学的知识连接起来。

   ①HTML,CSS,JS – 前端页面,静态网页;
   ②Java加强 – 反射,单例,读取资源文件(解除硬编码),测试(JUtil),XML;
      1,处理数据
      2,执行流程
      3,面向对象
   ③MySQL数据库;

后面所要学习

JSP+Servlet(会使用反射,单例,注解,XML(存放数据,读取数据,修改数据,删除数据))

Java代码操作数据库的唯一技术:-- JDBC

这两天学习内容:JDBC (会使用单例,读取资源文件,测试)

在这里插入图片描述

2.2 持久化介绍

学习JDBC之前,需要了解一个概念----- 持久化

做软件需要保存很多数据,而数据保存到什么地方去?

①保存内存;(问题:一断电就没有了)

②保存到磁盘;(一直都存在,永久)

什么是持久化(persistence):

持久化(persistence):把数据保存到可掉电式存储设备(断电之后,数据还在,比如硬盘,U盘)中以供之后使用。

大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,
而持久化的实现过程大多通过各种关系数据库来完成。 mysql oracle

哪些可以做持久化?

记事本(通过流保存到记事本里面,但是记事本里面删除数据不容易,很少使用),
XML(把数据存在XML,但是XML查找,删除,修改 也是比较麻烦),
数据库(把数据存在数据库,可以直接通过SQL取到,比较容易)

结论:持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中,只是比较麻烦。

要把数据保存到数据库—通过JAVA代码去操作数据库(通过JDBC访问数据库)


在Java中,数据库存取技术只能通过JDBC访问数据库:

JDBC访问数据库的形式主要有两种:

  1).直接使用JDBC的API去访问数据库服务器(MySQL/Oracle).
  2).间接地使用JDBC的API去访问数据库服务器.(以后学习框架去替换JDBC)
第三方O/R Mapping工具,如Hibernate, MyBatis等.(底层依然是JDBC)
JDBC是java访问数据库的基石,其他技术都是对jdbc的封装.

持久化到数据库的技术,唯一的只有JDBC 其他的所有的实现都是基于jdbc

2.3 JDBC规范介绍

为什么要使用JDBC?
  因为把要数据持久化,持久化数据的最好方式就是把数据保存到数据库,而Java要数据保存到数据,就需要使用JDBC;

什么是JDBC?

  JDBC(Java DataBase Connectivity(Java数据库的连接)):
  是一种用于执行SQL语句(DML,DDL,DQL)的Java API,可以为多种关系数据库(oracle,mysql,SQL server)提供统一访问它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序.

图示解释:

①JAVA 通过 JDBC 访问数据库

②数据库有很多 Mysql,Oracle,SqlServer等 – 不同的数据库由不同的公司开发,所以数据库的内部结构不同,由于内部结构不同,其他的程序操作数据库的方式都不一样,比如操作mysql,需要mysql的方式操作,而操作oracle,需要使用oracle的方式操作;

③JDBC都可以操作这些数据库–怎么做到的?

JDBC是接口,基准,工具-- 说明Java做了一组规范,它本身不实现这组规范。
为什么不去实现规范?
  原因:如果需要实现, 则需要写一套Mysql,写一套Oracle,写一套SqlServer,
  并且你需要访问MySql,Oracle,SqlServer的源码;
所以它不去实现规范,而且让各大厂商去实现这组规范;

④各大厂商怎么实现这组规范?–写Java代码,这些Java代码JDK中没有,所以它们准备自己的Jar包,所以每种数据库厂商 都需要提供Jar包,这样才能Java代码通过jar包就能访问对应的数据库.

在这里插入图片描述

结论:以后我们不管使用哪一种数据库,都需要去导入这个数据库给我们提供的jdbc实现的jar包;

2.3.1 JDBC版本介绍

JDBC的版本:

JDBC隶属于JavaSE的范畴,伴随着JavaSE的版本升级.
Java分成3块 -JavaSE(基础),JavaME,JavaEE

为什么不直接学习JaveEE?

不管学习JavaME还是JavaEE,都必须先学习JavaSE;

JDBC的API在哪里?

  ①JDK的API中. java.sql包装的就是JDBC的API.
  ②各大数据库厂商就会对JDBC的API提供实现类.—>(jar包)驱动包
在这里插入图片描述在这里插入图片描述

2.4小结

1.什么是JDBC

JDBC是接口 是规范,本身sun公司没有实现 需要各大数据库厂商实现;
2.持久化概念
把数据保存到可掉电的设备里面存储;
3.JDBC版本认识

3.使用JDBC完成CRUD

3.1 获取数据库连接

3.1.1 第一步:导包

导入mysql的jar包(千万不要导入zip包)

在这里插入图片描述

3.1.2 第二步:注册驱动

知道驱动的单词Driver 就可以开始了

操作数据库之前,第一步:注册驱动

什么是驱动:操作系统要用电脑上面的硬件(声卡,显卡,网卡),必须安装注册驱动,

现在很多操作系统,自动集成了各种万能驱动,简单理解,一个东西操作另外一个东西,需要驱动,就比如说 进入一个门,需要钥匙一样;
因此,Java要操作数据库,也需要注册驱动,这样才能建立联系

结论:必须注册驱动,Java才能和数据库建立联系;

怎么注册驱动?

==通过Driver – DriverManager(驱动管理) ==

能通过new DriverManger() 注册一个驱动吗?

new DriverManger()没有用,因为DriverManger 里面的方法全是静态的;

通过registerDriver(Driver driver)方法 向DriverManger注册给定驱动程序

代码:

//创建一个mysql驱动  Driver driver = new com.mysql.jdbc.Driver();  //注册mysql驱动  DriverManger.registerDriver(driver)

已经注册了驱动

②建驱动
②注册驱动
方式二:注册驱动:
在这里插入图片描述
Class.forName(“com.mysql.jdbc.Driver”) 使用反射注册mysql驱动;
拿到类的方法 – 注册驱动

源码: – static 静态代码块,只有类加载的时候,就执行,并且只执行一次;

@Test	public void testCreate() throws Exception {
// 注册驱动 //Class.forName("com.mysql.jdbc.Driver"); Driver driver=new com.mysql.jdbc.Driver(); DriverManager.registerDriver(driver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); // System.out.println(connection); Statement statement = connection.createStatement(); String sql = "create table employee (id int(8) ,name varchar(20),sex int(2))"; statement.executeUpdate(sql); // 事:关闭事物 statement.close(); connection.close(); }

在这里插入图片描述

在这里插入图片描述

3.1.3 拿到连接(贾琏)

注册驱动成功之后,接着拿到链接;(贾琏是一个人名字)

贾:加载驱动;

链:建立连接;
在这里插入图片描述

注册驱动之后,怎么建立连接?

通过DriverManger 驱动管理建立连接:

Static Connction getConnection(String url,String user,String password);Url :连接协议(固定的协议格式,大家能找到即可 详见:JDBC连接主流数据库.txt)User:用户名Password:密码

jdbc:mysql://localhost:3306/mydb

jdbc:mysql://ip地址:端口号/数据库名称
jdbc:mysql:///数据库名称

代码:

DriverManager.getConnction(“jdbc:msql://localhost:3306/test0303”,”root”,”admin”);

在这里插入图片描述

(了解)验证已经获取连接:可以在MySQL控制台,使用命令:show processlist( 查看MySQL运行进程.)


在这里插入图片描述

在这里插入图片描述

其他的连接:打开工具,也需要建立连接;

(了解)如果把 Class.forName(“com.mysql.jdbc.Driver”);注释,查看能否拿到连接?

从Java6(JDBC4.0)开始,可以不再加载注册驱动.

为啥不再需要加载注册驱动了?

从Java6开始,规范要求每一个JDBC驱动的包,都必须带有META-INF/services/java.sql.Driver文件.
在这里插入图片描述

开发建议:依然还是建议手动的加载注册驱动. 如此,可以兼容之前的JDK版本.

注意点:常见的错:

没有导包

  1类的全限定名写错了
  2 没有导入包
使用的字符串写错 com.mysql.jdbc.Driver3
数据库,用户名,密码写错(用户名密码错误 都提示密码错误)
在这里插入图片描述

3.2 使用JDBC执行DDL

整个连接已经拿到,接着使用JDBC执行DDL语句–

创建一张表

步骤:①准备sql 发送到数据库,去执行

② 执行JDBC,牢记口诀--==贾琏欲执事==
贾:加载驱动  链:创建并连接  欲:获得语句对象 Statement(语句对象)(需要SQL语句)  执:执行SQL语句  事:释放资源(用完之后,需要释放,不然会一直占用内存)

欲: 获得语句对象:下句代码和上面句代码都有关系的,拿到连接之后,才能拿到语句对象,因此从连接里面拿到语句对象

    connction.createStatement() 创建一个Statement对象(也就是语句对象)来将SQL语句发送到数据库;

执: 执行sql语句 Statement(语句对象)里面的方法

在这里插入图片描述

释:释放资源 (我们需要关闭哪些资源,这些资源的顺序是怎样的

① 关闭对象; 一个statement(语句对象)一个connection(链接对象))
② 顺序,从里到外,先语句对象,然后连接对象(比如出门一样,先关闭卧室,然后在外面的)
总结:记住口诀 “贾琏欲执事”–重点

3.3 添加一条数据

刚才已经完成“贾琏欲执事”,并且完成创建了一张表,接下来完成增 删,改的功能;

接下来这段代码,会用正确的方式来完成;

刚才的方式错误的 —》可能连接出错的时候,也无法关闭资源
在这里插入图片描述

那怎样 一定让 资源关闭呢?

写到finally里面

在这里插入图片描述在这里插入图片描述

3.4 修改数据

在这里插入图片描述

3.5 删除数据(标准格式)

在这里插入图片描述

3.6 查询对象(返回一条数据)

增,删,改已经完成,接下来完成查询,在完成查询之前,需要了解一个查询对象

代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

拿到结果集:statement.executeQuery(String sql) 结果集:ResultSet

移动ResultSet的光标(指到光标的每一行) resultSet.getXxx(int/String); 拿到这一行的这一列的数据

3.7 返回多条数据

在这里插入图片描述

3.8小结

1.使用JDBC完成CRUD

2. 贾(加载注册驱动) Class.forName(“com.mysql.jdbc.Driver”)
 琏(获取连接) DriverManager.getConnection(url,username,password)
 欲(获取语句对象) Statement st = conn.createStatement();
 执(执行) st.executeUpdate/executeQuery(sql)
 事(释放资源) st.close()/rs.close()/conn.close()

4 .DAO层的实现-实现登录

4.1 DAO层介绍(Data Access Object)

接下来 完成DAO层,什么是DAO层?

以后做开发,我们会把我们代码分成很多层,比较经典的是三层(也可能5层,7层)

哪三层: 界面层 — 业务层 – 数据层(DAO层

DAO : 主要是用来做数据库的操作
   模块化,分工明确,解耦(责任分离)

4.2 Domain的认识

刚才已经说到要分层,各层之间相互调用,现在数据层 调用 数据库,需要传什么内容?

比如 要添加一个用户,怎么添加?

界面层:收集数据; name,password,age…等等 需要传递很多东西;

业务层:界面层收集之后,传到业务层;

一般会把传过去的东西封装成对象,这个对象叫做域对象(domain)

在这里插入图片描述

4.3 完善DAO层结构

完善DAO层:

步骤:
分层的目的:解耦,方便维护,责任分离;
分层需要一个媒介来进行传输:它就是domain(域对象)

  1. 先创建一个domain包 ,在包里面创建相应的实体类

    这个包: == cn.itsource.domain==
    这里面写域对象(Student)

  2. 在domain包的同一级,建一个dao包,这个包里面写接口:

    cn.itsource.dao
    接口名称: IXxxDAO / IXxxDao

  3. 在dao这个包里面再建一个包: impl 包 cn.itsource.dao.impl

    这个包里面实现dao包里面的接口,这个impl包在dao包里面一层
    这个包类的名称:XxxDAOImpl/XxxDaoImpl

4.4 完成dao的crud

添加功能(create)

保存代码:
在这里插入图片描述

测试保存代码

在这里插入图片描述

修改代码(update):

在这里插入图片描述

删除代码:

在这里插入图片描述

查询代码:

在这里插入图片描述

查询多条数据:

在这里插入图片描述

4.5小结

1.DAO层介绍

2.Domain认识
3.完成DAO层
4.完成DAO层CRUD操作

5.重构

现在已经完成CRUD的功能,但是有些东西很不爽:

   ① try -catch 关闭资源;
   ② 驱动名称,url,username,password 每次都要写;–(万一数据库修改了)
最好把这些东西抽取出来;
   ③ class.forName 和 拿到连接都一样。 --抽取
   ④ 硬编码问题.

1 对于连接数据的一些参数,我们可以抽取(以后进行修改的时候方法,只需要改上面的参数就可以了)

在这里插入图片描述

2 将参数抽取到一个单独的类里面(好处,其它类要使用只需修改这一份)

在这里插入图片描述

3 每次操作都需要去注册驱动,得到连接

public class JDBCUtil {
private static String driverName = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/mydb"; private static String userName = "root"; private static String password = "admin"; private static JDBCUtil instance= null; Connection connection ; static{
try {
//注册驱动 Class.forName(driverName); instance = new JDBCUtil(); } catch (Exception e) {
e.printStackTrace(); } } private JDBCUtil(){
} public static JDBCUtil getInstance(){
return instance; } /** * 拿到连接对象 * @return */ public Connection getConn(){
try {
return DriverManager.getConnection(url, userName, password); } catch (SQLException e) {
e.printStackTrace(); } return null; } }

4 每次都要关闭资源(这代码没技术含量) JDBCUtil中添加关闭资源的方法

在这里插入图片描述

5 参数是硬编码在代码中(我们要把它放到资源文件中去)

/** * 操作数据库的工具类 * @author Administrator * */public class JDBCUtil {
private static JDBCUtil instance= null; //用作读取资源文件 private static Properties prop = null; static{
try {
prop = new Properties(); //去加载资源文件 prop.load(Thread.currentThread().getContextClassLoader() .getResourceAsStream("jdbc.properties")); //注册驱动Class.forName(prop.getProperty("driverName")); instance = new JDBCUtil(); } catch (Exception e) {
e.printStackTrace(); } } private JDBCUtil(){
} public static JDBCUtil getInstance(){
return instance; } /** * 拿到连接对象 * @return */ public Connection getConn(){
try {
return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("userName"), prop.getProperty("password")); } catch (SQLException e) {
e.printStackTrace(); } return null; } /** * 用来关闭资源 */ public void close(ResultSet rs,Statement st,Connection conn){
try {
if(rs!=null)rs.close(); } catch (Exception e) {
e.printStackTrace(); }finally{
try {
if(st!=null)st.close(); } catch (Exception e) {
e.printStackTrace(); }finally{
try {
if(conn!=null)conn.close(); } catch (Exception e) {
e.printStackTrace(); } } } }}

6.课程总结

6.1重点

  1. JDBC的理解(接口或者规范 自己没有实现,由各地数据库厂商实现)
  2. 熟练的使用JDBC完成数据库的CRUD贾琏欲执事
  3. 理解DAO层,能够熟练把代码抽成DAO层
  4. 先创建一个domain包 ,在包里面创建相应的实体类
    这个包: cn.itsource.domain
    这里面写域对象(Student)
    在domain包的同一级,建一个dao包,这个包里面写接口:
    cn.itsource.dao
    接口名称: IXxxDAO / IXxxDao

在dao这个包里面再建一个包: impl 包 cn.itsource.dao.impl

这个包里面实现dao包里面的接口,这个impl包在dao包里面一层
这个包类的名称:XxxDAOImpl/XxxDaoImpl

6.2难点

1.基本没有多大的难点;回去了的时候多去敲代码实现

6.3如何掌握

1.多去敲上课老师的代码

把练习题做完

6.4 排错技巧

1.通过错误提示排除问题

2.把自己报错的信息在百度上面进行搜索

7.课后练习

1.第一题: 创建一个数据库(名称为jdbcwork)

要求:在数据库中创建一张表student(如下):

id bigint

username varchar 用户名
password varchar 密码
age int 年龄
sex boolean(bit) 性别
intro varchar 简介

2.第二题:在程序中完成对上面的数据库的CRUD

要求:实现dao层,将配置抽取出来(db.properties)
每一步实现都要有相应的注释

作业做完后注意

每一步操作一定要非常清楚,包括对于dao层的抽取,希望大家下来多理解,如果Dao暂时更理解不了的话,这部分一定要多写几次,在真实开发过程中我们对数据库的操作都会抽出一个dao层。
一定要把今天上课老师写的代码都自己多写写

8.面试题

9.扩展知识或课外阅读推荐

转载地址:http://brcmf.baihongyu.com/

你可能感兴趣的文章
R in Action 学习笔记-边学边查
查看>>
边听边记-创业分子-互联网颠覆医疗
查看>>
边听边记-财经郎眼-国企改革 大风已起 151026
查看>>
【LEETCODE】ADD DIGITS
查看>>
【LEETCODE】104-Maximum Depth of Binary Tree
查看>>
数据结构-树-学习笔记
查看>>
【LEETCODE】100-Same Tree
查看>>
【LEETCODE】226-Invert Binary Tree
查看>>
【LEETCODE】111-Minimum Depth of Binary Tree
查看>>
【LEETCODE】235-Lowest Common Ancestor of a Binary Search Tree
查看>>
【LEETCODE】110-Balanced Binary Tree
查看>>
【LEETCODE】101-Symmetric Tree
查看>>
【LEETCODE】257-Binary Tree Paths
查看>>
【LEETCODE】102-Binary Tree Level Order Traversal
查看>>
【LEETCODE】107-Binary Tree Level Order Traversal II
查看>>
数据结构-stack-学习笔记
查看>>
【LEETCODE】145-Binary Tree Postorder Traversal
查看>>
【LEETCODE】144-Binary Tree Preorder Traversal
查看>>
【LEETCODE】94-Binary Tree Inorder Traversal
查看>>
【LEETCODE】96-Unique Binary Search Trees
查看>>