JDBC以及实现第一个JDBC程序

Jdbc 概述:
JDBC的全称是Java数据库连接(Java Dalabase Connectivity),它是一套用于执行soL语句的Java API应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、更新、新增和删除的操作。
不同种类的数据库(如MySQL、Oracle 等)在其内部处理数据的方式是不同的。如果直接使用数据库厂商提供的访问接口操作数据库,应用程序的可移植性就会变得很差。例如,用户当前在程序中使用的是MySQL提供的接口操作数据库,如果换成Oracle数据库,则需要重新使用Oracle数据库提供的接口,这样代码的改动量会非常大。有了JDBC后,这种情况就不复存在了,因为它要求各个数据库厂商按照统一的规范来提供数据库驱动,而在程序中是由JDBC 和具体的数据库驱动联系,所以用户就不必直接与底层的数据库交互,这使得代码的通用性更强。
JDBC在应用程序与数据库之间起到了一个桥梁作用。当应用程序使用,JDBC访问特定的数据库时,需要通过不同数据库驱动与不同的数据库进行连接,连接后即可对该数据库进行相应的操作作。

2.JDBC常用的API
在开发JDBC程序前,该包定义了一系列访问数据库的接口和关。常 用的API。JDBC API主要位于 java.sql包中,该包定义了一系列数据库的接口和类。

(1) Driver 接口
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。锅要注意的是,在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指MySQL驱动JAR包)。
(2) DriverManager 类
DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的静态方法。

3) Connection 接口
Connecion接按口代表Java程序和数据库的连接,只有获得该连接对象后才能访问数据库,并操作数据表。在Connection接口中,定义了一系列方法

4)Statement 接口
Statement接口用于执行静态的SQL语句,并返回一个结果对象,该接口的对象通过Connection实例的createStatement()方法获得。利用该对象把静态的SQL语句发送到数据库编译执行,然后返回数据库的处理结果。在Statement接口中,提供了3个常用的执行SQL语句的方法

5)PreparedStatement 接口
Statement接口封装了JDBC执行SQL语句的方法,可以完成Java程序执行SQL语句的操作。然而,在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件,而使用Statement接口操作这些SQL语句会过于繁琐,并且存在安全方面的问题。针对这-问题,JDBCAPI提供了扩展的PreparedStatement接口。

PreparedStatement 是Statement的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。在PreparedStatement接口中,提供了一些常用方法,具体如下表所示。

需要注意的是,表中的setDate()方法可以设置日期内容,但参数Date 的类型是javasal.Date,而不是javautil.Date.

(6) ResultSet 接口
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在-一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet 对象初始化时,游标在表格的第1行之前,调用nex()方法可将游标移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next(方法作为WHILE循环的条件来迭代ResultSet结果集。

ResultSet 接口中定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。例如,数据表的第1列字段名为id,字段类型为int,那么既可以使用getin(1)字段索引的方式获取该列的值,也可以使用gltln(id)字段名称的方式获取该列的值。

实现第一个JDBC程序
JDBC的使用可以按照以下几个步骤进行。
(1)加载并注册数据库驱动
注册数据库驱动的具体方式如下。

DriverManager . registerDriver (Driver driver);

Class. forName (“DriverName”);

(2 )通过DriverManager获取数据库连接
获取数据库连接的具体方式如下。

Connection conn= Dr iverManager . getConnection(Stringurl, Stringuser, Stringpwd);

从上述代码可以看出, getConnection(方法中有3个参数,它们分别表示连接数据库的URL地址、登录数据库的用户名和密码。以MySQL数据库为例,其URL地址的书写格式如下。

jdbc:mysql://hos tname:port/databasename

上面代码中,jdbc:mysql:是固定的写法,mysql 指的是MySQL数据库。hostname 指的是主机的名称(如果数据库在本机中,hostname可以为localhost或127.0.0.1; 如果要连接的数据库在其他电脑上hostname为所要连接电脑的IP ), port 指的是连接数据库的端口号(MySQL端口号默认为306),而dabsenane指的是MySQL中相应数据库的名称。
(3) 通过Connection对象获取Statement对象
Connection 创建Statement的方式有如下3种。

cealetatement): 创建基本的Slatement对象。

prepareStatement():PreparedStatement 对象。

prepareCall(:创建allableStatement对象。

以创建基本的Salement对象为例,创建方式如下。

. Statement stmt一conn. createStatement();

(4)使用Statement执行SQL语
所有的Stalement都有如下3种执行SQL语句的方法。

execule(): 可以执行任何SQL语句。

exctueuery):通常执行查询语句,执行后返回代表结果集的ResulSet对象。. execueupate): 主要用于执行DML和DDL语句。执行DML语句,如INSERT、UPDATE或DELETE时,返回受SQL语句影响的行数,执行DDL语句返回0。

以executeQuery()方法为例,其使用方式如下。

//执行SQL语句,获取结果集ResultSet
ResultSet rs = stmt. executeQuery(sq1);

(5)操作ResultSet结果集
如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet 对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。

(6)关闭连接,释放资源
每次操作数据库结束后都要关闭数据库连接,释放资源,包括关闭ResultSet、 Statement和Connection等资源。
至此,JDBC程序的大致实现步骤已经讲解完成。接下来,依照上面所讲解的步骤来演示JDBC的使用。该程序从users表中读取数据,并将结果打印在控制台。具体操作如下:
①搭建数据库环境
在MySQL中创建一一个名称为jdbc 的数据库,然后在该数据库中创建一一个users数据库和表的SQL语句

②搭建项目环境
在Eclipse中新建一一个名称为chapter09的Web项目,将下载好的MySQL的数据库驱动文件mysql-connector-java-5.0.8- bnjan复制到项目的ib目录中,并发布到类路径下(MsSQL驱动文件可以在其官网地址: ht:/:/v.mysal.om/downloadsco.e.cor/页面中下载在浏览器中输入该地址后即可进入下载页面,单击页面Generally Available (GA) Releases窗口中的Looking for previous GA versions超链接后,在显示出的下拉框中下载所需的驱动版本即可)

③编写JDBC程序
a.注册驱动
b.释放资源
在项目chapter09的srC目录下,新建一一个名称为cn.itcast.jdbc.example的包,在该包中创建类Example01,该类用于读取数据库中的users表,并将结果输出到控制台,如下图所示。
Example01.java

package cn.itcast.jdbc.example;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;

public class Example01 {

public static void main(String[] args) throws SQLException {Statement stmt  = null;ResultSet rs = null;Connection conn = null;try {//1.注册数据库驱动Class.forName("com.mysql.jdbc.Driver");//2.通过DriverManager获取数据库连接String url = "jdbc:mysql://localhost:3306/jdbc";String username = "root";String password = "123456";//3.通过Connection对象获取Statement对象//4.使用Statement执行SQL语句String sql = "select * from users";rs = stmt.executeQuery(sql);//5.操作ResultSet结果集System.out.println("id|name|password|email|brithday");while(rs.next()) {int id = rs.getInt("id");String name = rs.getString("username");String paw = rs.getString("password");String email = rs.getString("email");Date birthday = rs.getDate("birthday");System.out.println(id+"|"+name+"|"+paw+"|"+email+"|"+birthday);}}catch (ClassNotFoundException e) {e.printStackTrace();}finally {//回收数据库资源if(rs!=null) {try {rs.close();}catch (Exception e) {e.printStackTrace();}rs=null;}if(stmt!=null) {try {stmt.close();}catch (Exception e) {e.printStackTrace();}stmt=null;}if(conn!=null) {try {conn.close();}catch (Exception e) {e.printStackTrace();}conn=null;}}}

}

4.PreparedStatement 对象
在chapter09项目中的cn.itcast.jdbc.example包中创建一个名称为Example02的类,在该类中使用PreparedStatement 对象对数据库进行插入数据的操作:

package cn.itcast.jdbc.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Example02 {

public static void main(String[] args) throws SQLException{Connection conn = null;PreparedStatement prestmt = null;try {//加载数据库驱动Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/jdbc";String username = "root";String password = "123456";//创建应用程序与数据库连接的connection对象conn = DriverManager.getConnection(url, username, password);//执行的SQL语句String sql = "insert into users(name,password,email,birthday) values(?,?,?,?)";//创建用来执行SQL语句的PreparedStatement对象prestmt = conn.prepareStatement(sql);prestmt.setString(1, "zzz");prestmt.setString(2, "123456");prestmt.setString(3, "zzz@sina.com");prestmt.setString(4, "1798-05-06");//执行SQLprestmt.executeUpdate();}catch (ClassNotFoundException e) {e.printStackTrace();}finally {//回收数据库资源if(prestmt!=null) {try {prestmt.close();}catch (Exception e) {e.printStackTrace();}prestmt=null;}if(conn!=null) {try {conn.close();}catch (Exception e) {e.printStackTrace();}conn=null;}}}

}

5.ResultSet 对象
ResultSet主要用于存储结果集,可以通过nex()方法由前向后逐个获取结果集中的数据。如果想获取结果集中任意位置的数据,则需要在创建Statement对象时,设置两个ResultSet定义的常量,具体设置方式如下。
Statement st = conn.createStatement (ResultSet .TYPE_SCROLL_INSENITIVE, ResultSet.
CONCUR_READ_ONLY);
ResultSet rs = st.excuteQuery(sql);

在上述方式中,常量“ResultSet.TYPE SCROLL INSENITIVE" 表示结果集可滚动,常量"ResultSet. CONCUR READ _ONLY"表示以只读形式打开结果集。
为了使读者更好地学习ResultSet 对象的使用,接下来,通过一个案例来演示如何使用ResultSet对象滚动读取结果集中的数据。
在chapter09项目的cn.itcastjabc.example包中创建一个名称为example03test的类,该类中使用ResultSet对象取出指定数据的信息,如下所示。
package cn.itcast.jdbc.example;

import java.sql.DriverManager;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;

public class example03test {
public static void main(String[] args) {
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try {
//1.注册驱动
Class.forName(“com.mysq1.jdbc.Driver”);
//2.链接数据库http:/ /
con=(Connection) DriverManager.getConnection(“jdbc:mysql://localhost:3306/jdbc”,“root”,“123456”);//3.获取查询数据库
stmt = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//4.执行查询语句
rs=(ResultSet) stmt.executeQuery(“select *from users”);
rs.absolute(2);
System.out.println(“第二行的数据”+rs.getString(“name”));
rs.beforeFirst();
rs.next();
System.out.println(“第一行的数据”+rs.getString(“name”));
rs.afterLast();
rs.previous();
System.out.println(“最后一行”+rs.getString(“name”));
}catch(Exception e) {
throw new RuntimeException(e);
}finally {
//6.关闭连接,释放资源
System.out.println(“资源会被关闭吗”);
if(rs!=null) {
}
}}}

1.创建JavaBean
package cn.itcast.jdbc.example.domain;

import java.util.Date;
public class User {
private int id;
private String username;
private String password;
private String email;
private Date birthday;
public int getId() {
return id;
}

public String getEmail() {return email;
}public void setEmail(String email) {this.email = email;
}public void setId(int id) {this.id = id;
}
public String getUsername() {return username;
}
public void setUsername(String username) {this.username = username;
}
public String getPassword() {return password;
}
public void setPassword(String password) {this.password = password;
}
public Date getBirthday() {return birthday;
}
public void setBirthday(Date birthday) {this.birthday = birthday;
}

}

2.创建工具类

package cn.itcast.jdbc.example.utils;

import java.sql.DriverManager;
import java.sql.SQLException;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;

public class JDBCUtils {
public static Connection getConnection() throws Exception {

            //1、注册JDBC驱动Class.forName("com.mysql.jdbc.Driver");/* 2、获取数据库连接 */Connection       connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","123456");return connection;}/*关闭结果集、数据库操作对象、数据库连接*/public static void release1(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {if(resultSet!=null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}resultSet=null;}if(preparedStatement!=null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}preparedStatement=null;}if(connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}connection=null;}

}
}

3.创建DAO

package cn.itcast.jdbc.example.dao;

public class UsersDao {
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import cn.itcast.jdbc.example.domain.User;
import cn.itcast.jdbc.example.utils.JDBCUtils;

 // 添加用户的操作public boolean insert(User user) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 获得数据的连接conn = JDBCUtils.getConnection();// 获得Statement对象stmt = conn.createStatement();// 发送SQL语句SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String birthday = sdf.format(user.getBirthday());String sql = "INSERT INTO users(id,name,password,email,birthday) "+"VALUES("+ user.getId()+ ",'"+ user.getUsername()+ "','"+ user.getPassword()+ "','"+ user.getEmail()+ "','"+ birthday + "')";int num = stmt.executeUpdate(sql);if (num > 0) {return true;}return false;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(rs, stmt, conn);}return false;}// 查询所有的User对象public ArrayList<User> findAll() {Connection conn = null;Statement stmt = null;ResultSet rs = null;ArrayList<User> list = new ArrayList<User>();try {// 获得数据的连接conn = JDBCUtils.getConnection();// 获得Statement对象stmt = conn.createStatement();// 发送SQL语句String sql = "SELECT * FROM users";rs = stmt.executeQuery(sql);// 处理结果集while (rs.next()) {User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("name"));user.setPassword(rs.getString("password"));user.setEmail(rs.getString("email"));user.setBirthday(rs.getDate("birthday"));list.add(user);}return list;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(rs, stmt, conn);}return null;}// 根据id查找指定的userpublic User find(int id) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 获得数据的连接conn = JDBCUtils.getConnection();// 获得Statement对象stmt = conn.createStatement();// 发送SQL语句String sql = "SELECT * FROM users WHERE id=" + id;rs = stmt.executeQuery(sql);// 处理结果集while (rs.next()) {User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("name"));user.setPassword(rs.getString("password"));user.setEmail(rs.getString("email"));user.setBirthday(rs.getDate("birthday"));return user;}return null;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(rs, stmt, conn);}return null;}// 删除用户public boolean delete(int id) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 获得数据的连接conn = JDBCUtils.getConnection();// 获得Statement对象stmt = conn.createStatement();// 发送SQL语句String sql = "DELETE FROM users WHERE id=" + id;int num = stmt.executeUpdate(sql);if (num > 0) {return true;}return false;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(rs, stmt, conn);}return false;}// 修改用户public boolean update(User user) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 获得数据的连接conn = JDBCUtils.getConnection();// 获得Statement对象stmt = conn.createStatement();// 发送SQL语句SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String birthday = sdf.format(user.getBirthday());String sql = "UPDATE users set name='" + user.getUsername()+ "',password='" + user.getPassword() + "',email='"+ user.getEmail() + "',birthday='" + birthday+ "' WHERE id=" + user.getId();int num = stmt.executeUpdate(sql);if (num > 0) {return true;}return false;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(rs, stmt, conn);}return false;}}

4.创建测试类

package cn.itcast.jdbc.example;
import java.util.Date;
import cn.itcast.jdbc.example.dao.UsersDao;
import cn.itcast.jdbc.example.domain.User;
public class JdbcInsertTest{
public static void main(String[] args) {
// 向users表插入一个用户信息
UsersDao ud = new UsersDao();
User user=new User();
user.setId(5);
user.setUsername(“yanmin”);
user.setPassword(“123”);
user.setEmail(“yanmin@sina.com”);
user.setBirthday(new Date());
boolean b=ud.insert(user);
System.out.println(b);
}
}

2020080605030

javaweb day12相关推荐

  1. 应聘对白_权力游戏对白系列调查

    应聘对白 The following is a breakdown and explanation of a recent endeavor into NLP. To see my complete ...

  2. 崔希凡JavaWeb笔记day10~day12(2016年8月22日11:59:18)

    8月份效率降低,后面几天要努力学了 笔记如下 链接:https://pan.baidu.com/s/1miq97Gc 密码:x31h

  3. javaweb——总结

    day01XML上     1.XML的作用     2.XML的基本语法     3.DTD约束     4.DTD的基本语法(看懂DTD就ok)     5.XML的解析方式:原理     6.J ...

  4. 详细目录——JavaWeb视频教程_王泽(广陵散)+崔希凡

    首先感谢一位B站博主的视频分享,需要视频的同学移步JavaWeb视频(王+崔) 因为年代原因,此教程没有讲解BootStrap.jQuery等.如果采用此教程学习web阶段,一定要自行上网查缺补漏!! ...

  5. 简述mvc和java三层框架,springMVC设计模式和javaWeb三层框架

    一.springMVC  设计模式 MVC模式是软件工程中的一种能够软件架构模式,把软件分为三个基本部分,模型(model).视图(view)和控制器(controller).使程序简化,更加直观. ...

  6. 第二阶段-javaweb

    第二阶段-javaweb 第二阶段学习内容:单元测试,xml文件操作,数据库,jdbc,反射与内省,mybatis基础,HTML,JavaScript,通信协议与Tomcat服务器,HTTP协议与Se ...

  7. javaWeb——Servlet

    Servlet 系统架构 B/S结构的系统通信原理(没有涉及到Java小程序) 关于WEB服务器软件 实现一个最基本的web应用(这个web应用中没有java小程序) 对于一个动态的web应用来说,一 ...

  8. JavaWeb笔记01

    文章目录 JavaWeb(狂神说Java) 1.基本概念 1.1前言 1.2web应用程序 1.3静态web 1.4 动态web 2.web服务器 2.1技术讲解 2.2web服务器 3.Tomcat ...

  9. 使用maven搭建ssm框架的javaweb项目

    目前主流的javaweb项目,常会用到ssm(Spring+Spring MVC+Mybatis)框架来搭建项目的主体框架,本篇介绍搭建SSM框架的maven项目的实施流程.记之共享! 一.SSM框架 ...

最新文章

  1. C++智能指针简单剖析
  2. sql server监控
  3. Python的filter方法实现筛选功能
  4. 0318互联网新闻 | Snapchat下月进军游戏平台;阿里巴巴将上线二哈智能防骚扰电话的应用程序...
  5. Oracle 中control_file_record_keep_time参数的解释
  6. mysql六:索引原理与慢查询优化
  7. leetcode474. 一和零
  8. Spring Boot Redis简介
  9. 一个透明的shader
  10. windowsCE镜像文件结构
  11. 现在为什么没有人再提“以厂为家”这样的词语啦?
  12. sja1000 CAN控制器波特率计算方法详解
  13. matlab显示 图注,Matlab图例注记乱码(2019a)
  14. 软件工程自学笔记一(基础篇)
  15. Android 阶段性开发学习知识点(自用)
  16. 欧美html游戏安卓,HTML5 Games - Rated M or for 18+ only
  17. 问卷调查的数据分析怎么做
  18. arcgis标注牵引线_ArcEngine设置有牵引线的标注
  19. C语言基础入门48篇_26_身份证号校验程序(以身份证的校验方式是实例加深对数组及函数封装的理解、字符-‘0‘得到字符对应的int类型数字)
  20. yolov3与yolov4效果对比_知识精讲 | Yolov3和Yolov4核心内容、代码梳理_创事记(5)

热门文章

  1. Could not resolve placeholder ‘‘“ in value ““
  2. 广发证券招聘linux运维的要求
  3. Luxology Modo 302 Demo at GDC 2008 (英文)
  4. WKWebView 网页缓存和刷新
  5. 【金阳光测试】Android自动化测试第一季第二讲--MonkeyRunner
  6. 长尾关键词优化 如何有效的去做长尾关键词
  7. [C++] atoi()和stoi()函数
  8. 马上跨年了,如何用代码写一个“跨年倒计时”呢?
  9. 【IVIEW定制主题】
  10. shell 整型变量定义