导图社区 数据库操作
什么是数据库:数据库是一种存储结构,它允许使用各种格式输入、处理和检索数据,不必在每次需要数据时重新输入。例如,当需要某人的电话号码时,需要查看电话簿,按照姓名来查阅,这个电话簿就是一个数据库。数据库具有以下主要特点。
编辑于2023-04-17 17:53:52 贵州微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
社区模板帮助中心,点此进入>>
微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
数据库操作
数据库系统由数据库、数据库管理系统和应用系统、数据库管理员构成。数据库管理系统简称DBMS,是数据库系统的关键组成部分,包括数据库定义、数据查询、数据维护等。JDBC技术是连接数据库与应用程序的纽带,学习Java语言,必须学习JDBC技术。开发一款应用程序,需要使用数据库来保存数据,使用JDBC技术可以快速地访问和操作数据库,如查找满足条件的记录,向数据库中添加、修改、删除数据等。
一、 数据库基础知识
数据库在应用程序开发中占据着非常重要的地位。从原来的Sybase数据库,发展到今天的SQL Server、MySQL、Oracle等高级数据库,整个技术已经相当成熟了。
1. 什么是数据库:数据库是一种存储结构,它允许使用各种格式输入、处理和检索数据,不必在每次需要数据时重新输入。例如,当需要某人的电话号码时,需要查看电话簿,按照姓名来查阅,这个电话簿就是一个数据库。数据库具有以下主要特点。
1||| 实现数据共享。数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
2||| 减少数据的冗余度。同文件系统相比,数据库实现了数据共享,从而避免了用户各自建立应用文件,减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
3||| 数据的独立性。数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。
4||| 数据实现集中控制。文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
5||| 数据的一致性和可维护性,以确保数据的安全性和可靠性。主要包括:
(1) 安全性控制,以防止数据丢失、错误更新和越权使用。
(2) 完整性控制,保证数据的正确性、有效性和相容性。
(3) 并发控制,使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用。
(4) 故障的发现和恢复。
从发展的历史来看,数据库是数据管理的高级阶段,是由文件管理系统发展起来的。数据库的基本结构分为3个层次。
(1) 物理数据层:它是数据库的最内层,是物理存储设备上实际存储的数据集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的字符和字组成。
(2) 概念数据层:它是数据库的中间一层,是数据库的整体逻辑表示,指出了每个数据的逻辑定义及数据间的逻辑联系,是存储记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。
(3) 逻辑数据层:它是用户所看到和使用的数据库,是一个或一些特定用户使用的数据集合,即逻辑记录的集合。
2. 数据库的种类和功能:数据库系统一般基于某种数据模型,可以分为层次型、网状型、关系型及面向对象型等
1||| 层次型数据库:层次型数据库类似于树结构,是一组通过链接而相互联系在一起的记录。层次模型的特点是记录之间的联系通过指针实现。由于层次模型层次顺序严格而且复杂,因此对数据进行各项操作都很困难。层次数据库如图1所示
图1
2||| 网状型数据库:网络模型是使用网络结构表示实体类型、实体间联系的数据模型。网络模型容易实现多对多的联系。但在编写应用程序时,程序员必须熟悉数据库的逻辑结构,网状数据库如图2所示
图2
3||| 面向对象型数据库:建立在面向对象模型基础上。
4||| 关系型数据库:关系型数据库是目前最流行的数据库,是基于关系模型建立的数据库,关系模型是由一系列表格组成的。
在当前比较流行的数据库中,MySQL数据库是开发源代码的软件,具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,同时也是具有客户机/服务器体系结构的分布式数据库管理系统。MySQL是完全网络化的跨平台关系型数据库系统,它还支持多种平台,在UNIX/Linux系统上MySQL支持多线程运行方式,从而能获得相当好的性能。对于不使用UNIX系统的用户,可以在Windows NT系统上以系统服务方式运行,或者在Windows 95/98系统上以普通进程方式运行。 从JDK 6开始,在JDK的安装目录中,除了传统的bin、jre等目录,还新增了一个名为db的目录,这便是Java DB。这是一个纯Java实现的、开源的数据库管理系统(DBMS),源于Apache软件基金会(ASF)名下的项目Derby。它只有2MB大小,但这并不妨碍Derby功能齐备、支持几乎大部分的数据库应用所需要的特性。更难能可贵的是,作为内嵌的数据库,Derby得到了包括IBM和Sun等大公司以及全世界优秀程序员们的支持。这就好像为JDK注入了一股全新的活力,Java程序员不再需要耗费大量精力安装和配置数据库,就能进行安全、易用、标准且免费的数据库编程了。
3. SQL语言:SQL(Structure Query Language,结构化查询语言)被广泛地应用于大多数数据库中,使用SQL语言可以方便地查询、操作、定义和控制数据库中的数据。SQL语言主要由以下几部分组成。
1||| 数据定义语言(Data Definition Language,DDL),如create、alter、drop等。
2||| 数据操纵语言(Data Manipulation Language,DML),如select、insert、update、delete等。
3||| 数据控制语言(Data Control Language,DCL),如grant、revoke等。
4||| 事务控制语言(Transaction Control Language),如commit、rollback等。
在应用程序中使用最多的就是数据操纵语言,它也是最常用的核心SQL语言。
(1) select语句:select语句用于从数据表中检索数据。 语法如下: SELECT 所选字段列表 FROM 数据表名 WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式(指定分组的条件) ORDER BY 字段名[ASC|DESC]
假设数据表名是tb_test,要检索出表中所有女员工的姓名、年龄,并按年龄升序排列,代码如下: select name,age form tb_test where sex="女" order by age;
(2) insert语句:insert用于向表中插入新数据。 语法如下: insert into 表名[(字段名1,字段名2...)] values(属性值1,属性值2...)
假设要向数据表tb_test(包含字段id、name、sex、department)中插入数据, 代码如下: insert into tb_test values(1,'kunkun','女','表演部');
(3) update语法:update语句用于更新数据表中的某些记录。 语法如下: UPDATE 数据表名 SET 字段名=新的字段值 WHERE 条件表达式
假设要将数据表tb_test中2号员工的年龄修改为24,代码如下所示: update tb_test set age=24 where id=2;
(4) delete语句:delete语句用于删除数据。 语句如下: delete form 数据表名 where 条件表达式
假设要删除数据表tb_test中编号为1024的员工, 代码如下: delete from tb_test where id=1024;
二、 JDBC概述
JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口),是连接数据库和Java应用程序的纽带。
1. JDBC-ODBC桥:JDBC-ODBC桥是一个JDBC驱动程序,完成了从JDBC操作到ODBC操作之间的转换工作,允许JDBC驱动程序被用作ODBC的驱动程序。使用JDBC-ODBC桥连接数据库的步骤如下
1||| 首先加载JDBC-ODBC桥的驱动程序。代码如下:Class.forName("sun:jdbc.odbc.JdbcOdbcDriver");
Class类是java.lang包中的一个类,通过该类的静态方法forName()可加载sun.jdbc.odbc包中的JdbcOdbcDriver类来建立JDBC-ODBC桥连接器。
2||| 使用java.sql包中的Connection接口,并通过DriverManager类的静态方法getConnection()创建连接对象。代码如下: Connection con=DriverManager.getConnection("jdbc.odbc:数据源名字","user name","password"); 数据源必须给出一个简短的描述名。假设没有设置user name和password,则要与数据源tom交换数据。建立Connection对象的代码如下: Connection con=DriverManager.getConnection("jdbc.odbc:tom","","");
3||| 向数据库发送SQL语句。使用Statement接口声明一个SQL语句对象,并通过刚才创建的连接数据库对象conn的createStatement()方法创建这个SQL对象。代码如下: Statement sql=con.createStatement();
JDBC-ODBC桥作为连接数据库的过渡性技术,现在已经不被Java广泛应用了,现在被广泛应用的是JDBC技术。但这并不表示JDBC-ODBC桥技术已经被淘汰,由于ODBC技术被广泛地使用,使得Java可以利用JDBC-ODBC桥访问几乎所有的数据库。JDBC-ODBC桥作为sun.jdbc.odbc包与JDK一起自动安装,不需要特殊配置。
2. JDBC技术:JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口。JDBC是一种底层的API,因此访问数据库时需要在业务逻辑层中嵌入SQL语句。SQL语句是面向关系的,依赖于关系模型,所以通过JDBC技术访问数据库也是面向关系的。JDBC技术主要完成以下几个任务
1||| 与数据库建立一个连接。
2||| 向数据库发送SQL语句。
3||| 处理从数据库返回的结果。
需要注意的是,JDBC并不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序。下面详细介绍JDBC驱动程序的分类。
3. JDBC驱动程序的类型:JDBC的总体结构由4个组件—应用程序、驱动程序管理器、驱动程序和数据源组成。JDBC驱动基本上分为以下4种。
1||| JDBC-ODBC桥:依靠ODBC驱动器和数据库通信。这种连接方式必须将ODBC二进制代码加载到使用该驱动程序的每台客户机上。这种类型的驱动程序最适合于企业网或者用Java编写的三层结构的应用程序服务器代码。
2||| 本地API一部分用Java编写的驱动程序:这类驱动程序把客户机的API上的JDBC调用转换为Oracle、DB2、Sybase或其他DBMS的调用。这种驱动程序也需要将某些二进制代码加载到每台客户机上。
3||| JDBC网络驱动:这种驱动程序将JDBC转换为与DBMS无关的网络协议,又被某个服务器转换为一种DBMS协议,是一种利用Java编写的JDBC驱动程序,也是最为灵活的JDBC驱动程序。这种方案的提供者提供了适合于企业内部互联网(Intranet)用的产品。为使这种产品支持Internet访问,需要处理Web提出的安全性、通过防火墙的访问等额外的要求。
4||| 本地协议驱动:这是一种纯Java的驱动程序。这种驱动程序将JDBC调用直接转换为DBMS所使用的网络协议,允许从客户机上直接调用DBMS服务器,是一种很实用的访问Intranet的解决方法。
JDBC网络驱动和本地协议驱动是JDBC访问数据库的首选,这两类驱动程序提供了Java的所有优点。
三、 JDBC中常用的类和接口
在Java语言中提供了丰富的类和接口用于数据库编程,利用这些类和接口可以方便地进行数据访问和处理。这些类或接口都在java.sql包中。
1. Connection接口:Connection接口代表与特定的数据库的连接,在连接上下文中执行SQL语句并返回结果。Connection接口的常用方法如右所示。
1||| createStatement():创建Statement对象
2||| createStatement(int resultSetType,int resultSetConcurrency):创建一个Statement对象,该对象将生成具有给定类型、并发性和可保存性的ResultSet对象
3||| preparedStatement():创建预处理对象preparedStatement
4||| isReadOnly():查看当前Connection对象的读取模式是否为只读形式
5||| setReadOnly():设置当前Connection对象的读写模式,默认是非只读模式
6||| commit():使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象当前持有的所有数据库锁
7||| roolback():取消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁
8||| close():立即释放此Connection对象的数据库和JDBC资源,而不是等待它们被自动释放
2. Statement接口:Statement接口用于在已经建立连接的基础上向数据库发送SQL语句。在JDBC中有3种Statement对象,分别是Statement、PreparedStatement和CallableStatement。Statement对象用于执行不带参数的简单的SQL语句;PreparedStatement继承了Statement,用来执行动态的SQL语句;CallableStatement继承了PreparedStatement,用于执行对数据库的存储过程的调用。Statement接口的常用方法如右所示
1||| execute(String sql):执行静态的SELECT语句,该语句可能返回多个结果集
2||| executeQuery(String sql):执行给定的SQL语句,该语句返回单个ResultSet对象
3||| cleanBatch():清空此Statement对象当前SQL命令列表
4||| executeBatch():将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。数组元素的排序与SQL语句的添加顺序对应
5||| addBatch(String sql):将给定的SQL命令添加到此Statement对象的当前命令中。如果驱动程序不支持批量处理,将抛出异常
6||| close():释放Statement实例占用的数据库和JDBC资源
3. PreparedStatement:PreparedStatement接口用来动态地执行SQL语句。通过PreparedStatement实例执行的动态SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以反复地执行该SQL语句。PreparedStatement接口的常用方法如右所示。
1||| setInt(int index,int k):将指定位置的参数设置为int值
2||| setFloat(int index,float f):将指定位置的参数设置为float值
3||| setLong(int index,long l):将指定位置的参数设置为long值
4||| setDouble(int index,Double d):将指定位置的参数设置为double值
5||| setBoolean(int index,Boolean b):将指定位置的参数设置为boolean值
6||| setDate(int index,date date):将指定位置的参数设置为对应的date值
7||| setString(int index,String s):将指定位置的参数设置为对应的String值
8||| setNull(int index,intsqlType):将指定位置的参数设置为SQL NULL
9||| executeQuery():在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象
10||| executeUpdate():执行前面包含参数的动态INSERT、UPDATE或DELETE语句
11||| clearParameters():清除当前所有参数的值
4. DriverManager类:DriverManager类用来管理数据库中的所有驱动程序。它是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立连接。如果通过getConnection()方法可以建立连接,则经连接返回,否则抛出SQLException异常。DriverManager类的常用方法如右所示。
1||| getConnection(String url,String user,String password):指定3个入口参数,依次是数据库的链接、用户名、密码,用于获取数据库的连接
2||| setLoginTimeout():获取驱动程序试图登陆到某一数据库时可以等待的最长时间,以秒为单位
3||| println(String message):将一条消息打印到当前JDBC日志流中
5. ResultSet接口:ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录的前面,通过next()方法可将指针向下移。 在JDBC 2.0(JDK 1.2)之后,该接口添加了一组更新方法updateXXX(),该方法有两个重载方法,可根据列的索引号和列的名称来更新指定列。但该方法并没有将对数据进行的操作同步到数据库中,需要执行updateRow()或insertRow()方法更新数据库。ResultSet接口的常用方法如右所示。
1||| getInt():以int形式获取此ResultSet对象的当前行的指定列值,如果列是NULL,则返回值是0
2||| getFloat():以float形式获取此ResultSet对象的当前行的指定列值,如果列是NULL,则返回值是0
3||| getDate():以date形式获取此ResultSet对象的当前行的指定列值,如果列是NULL,则返回值是null
4||| getBoolean():以boolean形式获取此ResultSet对象的当前行的指定列值,如果列是NULL,则返回值是null
5||| getString():以String形式获取此ResultSet对象的当前行的指定列值,如果列是NULL,则返回值是null
6||| getObject():以object形式获取此ResultSet对象的当前行的指定列值,如果列是NULL,则返回值是null
7||| first():将指针移到当前记录的第一行
8||| last():将指针移动到当前记录的最后一行
9||| next():将指针向下移一行
10||| beforeFirst():将指针移动到集合的开头(第一行位置)
11||| afterLast():将指针移动到集合的尾部(最后一行的位置)
12||| absolute(int index):将指针移动到Result给定编号的行
13||| isFirst():判断指针是否位于当前ResultSet集合的第一行。如果是返回true,否则返回false
14||| isLast():判断指针是否位于当前ResultSet集合的最后一行。如果是返回true,否则返回false
15||| updateInt():用int更新指定列
16||| updateFloat():用float值更新指定列
17||| updateLong():用long值更新指定列
18||| updateString():用String值更新指定列
19||| updateObject():用Object值更新指定列
20||| updateNull():将指定列的值修改为null
21||| updateDate():用date值更新指定列
22||| updateDouble():用Double值更新指定列
23||| getrow():查看当前行的索引号
24||| insertRow():将插入行的内容插入到数据库
25||| updateRow():将当前行的内容同步到数据表
26||| deleteRow():删除当前行,但并不同步到数据库中,而是在执行close()方法后同步到数据库中
四、 数据库操作
要对数据表中的数据进行操作,首先应该建立与数据库的连接。通过JDBC API中提供的各种类,可对数据表中的数据进行查找、添加、修改、删除等操作。
1. 连接数据库:要访问数据库,首先要加载数据库的驱动程序(只需要在第一次访问数据库时加载一次),然后每次访问数据时创建一个Connection对象,接着执行操作数据库的SQL语句,最后在完成数据库操作后销毁前面创建的Connection对象,释放与数据库的连接。
实例代码: package com.MySQL; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionTest { Connection con; //声明Connection对象 public Connection getCon() { //建立返回值为Connection的方法 try{ Class.forName("com.mysql.cj.jdbc.Driver"); //加载数据库驱动 System.out.println("数据库驱动加载成功"); }catch(ClassNotFoundException e) { e.printStackTrace(); } try{ //获取数据库连接对象 con= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","19971101"); System.out.println("数据库连接成功"); }catch(SQLException e) { e.printStackTrace(); } return con; } public static void main(String[] args) { ConnectionTest c=new ConnectionTest(); c.getCon(); } }
本实例使用MySQL数据库8.0.32
运行结果:
2. 向数据库发送SQL语句:getConnection()方法只是获取与数据库的连接,要执行SQL语句首先要获得Statement类对象。通过上述实例创建的连接数据库对象con的createStatement()方法可获得Statement对象。
创建Statement类对象sql。代码如下: try{ Statement sql=con.createStatement(); }catch(SQLException e){ e.printStackTrace(); }
3. 处理查询结果集:有了Statement对象以后,可调用相应的方法实现对数据库的查询和修改,并将查询的结果集存放在ResultSet类的对象中。
获取查询结果集:代码如下: ResultSet res=sql.excuteQuery("select * from test");
运行结果为返回一个ResultSet对象,ResultSet对象一次只可以看到结果集中的一行数据,使用该类的next()方法可将光标从当前位置移向下一行
4. 顺序查询:ResultSet类的next()方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false。
实例代码: package com.MySQL; import java.sql.*; public class SQL_Test { static Connection con; //声明Connection对象 static Statement sql; //声明Statement对象 static ResultSet res; //声明ResultSet对象 public Connection getConnection() { //获取数据库连接 try{ Class.forName("com.mysql.cj.jdbc.Driver"); //加载驱动 System.out.println("驱动加载完成"); }catch (ClassNotFoundException e) { e.printStackTrace(); } try { con= DriverManager.getConnection("jdbc:mysql://localhost:3306/tb_test","root","19971101"); System.out.println("数据库连接成功"); }catch(SQLException e) { e.printStackTrace(); } return con; //返回Connection对象 } public static void main(String[] args) { SQL_Test sqlTest=new SQL_Test(); //创建本类对象 con=sqlTest.getConnection(); //与数据库建立连接 try { sql=con.createStatement(); //实例化Statment对象 res=sql.executeQuery("select * from tb_t"); while(res.next()) { String id=res.getString("id"); String name=res.getString("name"); String sex=res.getString("sex"); String birthday=res.getString("birthday"); System.out.println("编号"+id); System.out.println("姓名"+name); System.out.println("性别"+sex); System.out.println("生日"+birthday); } }catch(SQLException e) { e.printStackTrace(); } } }
运行结果:
5. 模糊查询:SQL语句中提供了LIKE操作符用于模糊查询,可使用“%”来代替0个或多个字符,使用下画线“_”来代替一个字符。例如,在查询某同学的信息时,可使用以下SQL语句: select * from tb_test where name like '某%'
实例代码: package com.MySQL; import java.sql.*; public class SQL_train { static Connection con; static Statement sql; static ResultSet res; public Connection getCon() { try{ Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("驱动加载完成"); }catch(ClassNotFoundException e) { e.printStackTrace(); } try { con=DriverManager.getConnection("jdbc:mysql://localhost:3306/tb_test","root","19971101"); System.out.println("数据库连接成功"); }catch(SQLException e) { e.printStackTrace(); } return con; } public static void main(String[] args) { SQL_train t=new SQL_train(); con=t.getCon(); try{ sql=con.createStatement(); res=sql.executeQuery("select * from tb_t where name like '小%'"); while(res.next()) { String id=res.getString("id"); String name=res.getString("name"); String sex=res.getString("sex"); String birthday=res.getString("birthday"); System.out.println("编号"+id); System.out.println("姓名"+name); System.out.println("性别"+sex); System.out.println("生日"+birthday); } }catch(SQLException e) { e.printStackTrace(); } } }
运行结果:
6. 预处理语句:向数据库发送一个SQL语句,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令,完成相关的数据操作。如果不断地向数据库提交SQL语句,肯定会增加数据库中SQL解释器的负担,影响执行的速度。 对于JDBC,可以通过Connection对象的preparedStatement(String sql)方法对SQL语句进行预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement对象中。通过调用该对象的相应方法,可执行底层数据库命令。也就是说,应用程序能针对连接的数据库,将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令。这样可以减轻数据库的负担,提高访问数据库的速度。 对SQL进行预处理时可以使用通配符“?”来代替任何的字段值。例如: sql = con.prepareStatement("select * from tb_stu where id = ?"); 在执行预处理语句前,必须用相应方法来设置通配符所表示的值。例如: sql.setInt(1,2); 上述语句中的1表示从左向右的第1个通配符,2表示设置的通配符的值。将通配符的值设置为2后,功能等同于:sql = con.prepareStatement("select * from tb_stu where id = 2"); 书写两条语句看似麻烦了一些,但使用预处理语句可使应用程序动态地改变SQL语句中关于字段值条件的设定。
通过setXXX()方法为SQL语句中的参数赋值时,建议使用与参数匹配的方法,也可以使用setObject()方法为各种类型的参数赋值。例如: sql.setObject(2,'李丽');
实例代码: package com.MySQL; import javax.xml.transform.Result; import java.sql.*; public class SQL_Prepa { static Connection connection; static PreparedStatement sql; static ResultSet res; public Connection getConnection() { try { Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("驱动加载完成"); }catch(ClassNotFoundException e) { e.printStackTrace(); } try { connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/tb_test","root","19971101"); System.out.println("数据库连接成功"); }catch(SQLException e) { e.printStackTrace(); } return connection; } public static void main(String[] args) { SQL_Prepa s=new SQL_Prepa(); s.getConnection(); try{ sql=connection.prepareStatement("select * from tb_t where id=?"); sql.setInt(1,1); //设置参数 res=sql.executeQuery(); //执行预处理语句 while(res.next()) { String id=res.getString("id"); String name=res.getString("name"); String sex=res.getString("sex"); String birthday=res.getString("birthday"); System.out.println("编号"+id); System.out.println("姓名"+name); System.out.println("性别"+sex); System.out.println("生日"+birthday); } }catch(SQLException e) { e.printStackTrace(); } } }
运行结果:
7. 添加、修改、删除:通过SQL语句可以对数据执行添加、修改和删除操作。可通过PreparedStatement类的指定参数,动态地对数据表中原有数据进行修改操作,并通过executeUpdate()方法执行更新语句操作。
实例代码: package com.MySQL; import java.sql.*; public class SQL_All { static Connection connection; static PreparedStatement sql; static ResultSet res; public Connection getConnection() { try{ Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("驱动加载完毕"); }catch(ClassNotFoundException e) { e.printStackTrace(); } try{ connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/tb_test","root","19971101"); System.out.println("数据库连接成功"); }catch(SQLException e) { e.printStackTrace(); } return connection; } public static void main(String[] args) { SQL_All s=new SQL_All(); connection=s.getConnection(); try{ sql=connection.prepareStatement("select * from tb_t"); res=sql.executeQuery(); System.out.println("执行修改前数据:"); while(res.next()) { String id=res.getString("id"); String name=res.getString("name"); String sex=res.getString("sex"); String birthday=res.getString("birthday"); System.out.println("编号"+id); System.out.println("姓名"+name); System.out.println("性别"+sex); System.out.println("生日"+birthday); } sql=connection.prepareStatement("insert into tb_t(name,sex,birthday) values(?,?,?)"); sql.setString(1,"张三"); sql.setString(2,"男"); sql.setString(3,"2000-11-16"); sql.executeUpdate(); //预处理添加数据 sql=connection.prepareStatement("update tb_t set birthday=? where id=?"); sql.setString(1,"2012-12-12"); sql.setInt(2,1); sql.executeUpdate(); //更新数据 Statement stmt=connection.createStatement(); stmt.executeUpdate("delete from tb_t where id=1"); //删除数据 sql=connection.prepareStatement("select * from tb_t"); res=sql.executeQuery(); System.out.println("执行修改后的数据:"); while(res.next()) { String id=res.getString("id"); String name=res.getString("name"); String sex=res.getString("sex"); String birthday=res.getString("birthday"); System.out.println("编号"+id); System.out.println("姓名"+name); System.out.println("性别"+sex); System.out.println("生日"+birthday); } }catch(SQLException e) { e.printStackTrace(); } } }
运行结果: 驱动加载完毕 数据库连接成功 执行修改前数据: 编号1 姓名小明 性别男 生日1888-8-8 编号2 姓名小红 性别女 生日1988-9-8 编号3 姓名小李 性别男 生日1996-6-6 执行修改后的数据: 编号2 姓名小红 性别女 生日1988-9-8 编号3 姓名小李 性别男 生日1996-6-6 编号7 姓名张三 性别男 生日2000-11-16