JavaWeb学习总结-09 JDBC 学习和使用
一 JDBC相关概念介绍
1.1 数据库驱动
这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道,如下所示:
1.2 JDBC介绍
SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。如下图所示:
JDBC全称为:JavaDataBaseConnectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:
- java.sql
- javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
二 编写JDBC程序
2.1 搭建实验环境
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
启动MySQL服务,如果是在Windows平台,按住 Win + R ,在 运行框输入: services.msc
确保mysql 服务在运行状态。
1) 在mysql中创建一个库,并创建users表和插入表的数据。SQL脚本如下。
create database jdbcStudy character set utf8 ; use jdbcStudy; create table users( id int primary key AUTO_INCREMENT, name varchar(40), password varchar(40), email varchar(60), birthday date)ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into users(id,name,password,email,birthday) values(,','zs@163.com','2016-09-01'); insert into users(id,name,password,email,birthday) values(,','lisi@163.com','2016-09-02'); insert into users(id,name,password,email,birthday) values(,','wangwu@163.com','2016-09-03');
建表中使用的数据库引擎为 InnoDB,InnoDB的好处 可以参考Mysql 存储引擎中InnoDB与Myisam的主要区别。默认字符集为utf-8,避免中文乱码。主键递增,从1开始计数。
实验:
a.插入多条记录后,使用delete命令删除记录,在插入记录,id的初始值是多少?
a.插入多条记录后,使用truncate命令删除记录,在插入记录,id的初始值是多少?
2)新建一个Java工程,并导入数据库驱动。
3)编写程序从user表中读取数据,并打印在命令行窗口中。
package com.mobile.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.log4j.Logger; public class TestJdbc1 { public Logger logger = Logger.getLogger(TestJdbc1.class); public static void main(String[] args) throws Exception { // 要连接的数据库URL String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8"; // 连接的数据库时使用的用户名 String username = "root"; // 连接的数据库时使用的密码 String password = "; // 1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取与数据库的链接 Connection conn = DriverManager.getConnection(url, username, password); // 3.获取用于向数据库发送sql语句的statement Statement st = conn.createStatement(); String sql = "select id,name,password,email,birthday from users"; // 4.向数据库发sql,并获取代表结果集的resultset ResultSet rs = st.executeQuery(sql); // 5.取出结果集的数据 while (rs.next()) { System.out.println("------ user ------------"); System.out.println("id=" + rs.getObject("id")); System.out.println("name=" + rs.getObject("name")); System.out.println("password=" + rs.getObject("password")); System.out.println("email=" + rs.getObject("email")); System.out.println("birthday=" + rs.getObject("birthday")); System.out.println(); } // 6.关闭链接,释放资源 rs.close(); st.close(); conn.close(); } }
2.2 DriverManager类
Jdbc程序中的Class.forName()设置数据库驱动,DriverManager 用于加载驱动,并 创建与数据库的链接,这个API的常用方法:
Class.forName("数据库驱动名称"); DriverManager.getConnection(url, user, password),
2.3 数据库URL
URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
常用数据库URL地址的写法:
- Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
- SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
- MySql写法:jdbc:mysql://localhost:3306/sid
也可以参考常用数据库 JDBC URL 格式
2.4、Connection类
Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :在链接上提交事务。
- rollback() :在此链接上回滚事务。
2.5 Statement类
Jdbc程序中的Statement对象用于向数据库发送SQL语句, Statement对象常用方法:
- executeQuery(String sql) :用于向数据发送查询语句。
- executeUpdate(String sql):用于向数据库发送insert、update或delete语句
- execute(String sql):用于向数据库发送任意sql语句
- addBatch(String sql) :把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
2.6、ResultSet类
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
获取任意类型的数据
- getObject(int index)
- getObject(string columnName)
获取指定类型的数据,例如:
- getString(int index)
- getString(String columnName)
2.7、释放资源
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象,特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
rs.close(); st.close(); conn.close();
2.8 获得MySQL 数据库自动生成的主键
1 测试脚本
//建立数据库 jdbcstudycreate database jdbcstudy;//使用建立的数据库 jdbcstudyuse jdbcstudy; DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCREMENT, `name` varchar() NOT NULL, `password` varchar() NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2 测试代码
1) 获得一个链接句柄 connection
// 取得一个Connction private Connection getConnection() { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://127.0.0.1:3306/jdbcstudy"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, "); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; }
2) 测试插入一条记录 record,使用表的自增主键
public void runInsertData1() { Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; conn = getConnection(); String sql = "insert into person( name, password) values( ?,?)"; try { pst = conn.prepareStatement(sql); pst.setString(, "wangwu"); pst.setString(, "); pst.executeUpdate(); // 获取数据库自动生成的主键 rs = pst.getGeneratedKeys(); String key = null; if (rs.next()) { key = rs.getString(); } System.out.println("key=" + key); } catch (SQLException e) { e.printStackTrace(); } }
3)测试插入一条记录 record,确定记录的id.
public void runInsertData2() { Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; conn = getConnection(); String sql = "insert into person( id, name, password) values( ?,?,?)"; try { pst = conn.prepareStatement(sql); Random random = new Random(); String id = random.nextInt()+""; pst.setString(, id); pst.setString(, "wangwu"); pst.setString(, "); pst.executeUpdate(); // 获取数据库自动生成的主键 rs = pst.getGeneratedKeys(); String key = null; if (rs.next()) { key = rs.getString(); } System.out.println("key=" + key); } catch (SQLException e) { e.printStackTrace(); } }
参考资料:
默认字符集为utf-8,避免中文乱码。
JavaWeb学习总结-09 JDBC 学习和使用的更多相关文章
- Javaweb学习笔记7—JDBC技术
今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的 ...
- 2045331 《Java程序设计》第09周学习总结
2045331 <Java程序设计>第09周学习总结 教材学习内容总结 第十六章 整合数据库 16.1.1JDBC简介 1.JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接 ...
- 20145219 《Java程序设计》第09周学习总结
20145219 <Java程序设计>第09周学习总结 教材学习内容总结 JDBC入门 JDBC简介 1.JDBC是java联机数据库的标准规范,它定义了一组标准类与接口,应用程序需要联机 ...
- JavaWeb学习总结-04 Servlet 学习和使用
一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...
- JDBC学习笔记(2)——Statement和ResultSet
Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(2)——Statement和ResultSet
转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- jdbc学习总结
jdbc学习总结: 一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供. 二.知识要点: 连接5要素,3 ...
随机推荐
- 你误解 .net 了吗?
我现在发现很多人对C#还存在很大的误解,例如C#是完全封闭的,C#不能跨平台,C#性能很差,C#不支持指针等等,持以上观点的人非常多,甚至最近看到的国内某机构对开发语言的统计中还写着C#不跨平台,不开 ...
- 腾讯 or 华为 =》 求职者的困惑
本文目的: 希望有老司机指点迷津 个人背景: 本人软件工程专业,硕士研究生,2017年7月毕业,个人喜欢Java开发,希望有机会从事Java分布式应用开发 故事背景一: 本人2016年4月份参加了腾讯 ...
- IT人员如何保护视力
最近感觉眼比较难受,有点干,估计是因为用上老婆淘汰的iPhone5C后屏幕太小,而我又是一个手机瘾重点患者的原因.为了保持自己5.0+的视力,做了以下工作,分享给各位朋友: Win7电脑将字体放大到1 ...
- 【JavaEE企业应用实战学习记录】logFilter
package sanglp.servlet; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import ja ...
- 深入 理解vxlan
VXLAN RFC 文档 : https://tools.ietf.org/html/rfc7348 作为网络虚拟化的重要技术,VXLAN备受关注,该协议是如何运作的?如何通过数据与控制层面的分离实现 ...
- CentOS 6.5升级Python和安装IPython(亲测可用)
python的升级(2.6------>2.7.x) 如下地址:http://note.youdao.com/share/?id=2928aeda020123bfdf2a2c76bc75e4a7 ...
- ivy,ivyde插件-eclipse
官方共享更新磁盘下载 http://www.apache.org/dist/ant/ivyde/updatesite/ http://ant.apache.org/ivy/download.cgi 简 ...
- HTTP协议学习---(十二)理解转发与重定向
解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容 ...
- JAVA对文件类型的校验
通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...
- thinkphp框架中“关联操作”的完整定义详解
在复杂的关联操作中,如果要给关联定义增加可选的属性,我们可以采用完整定义的方式. 完整定义的格式是: protected $_link = array( '关联表名1' => arr ...