当前位置: 首页 > 编程日记 > 正文

JDBC编程:2(数据库的基本操作)

数据库的基本操作

查询数据

在开始前先简单地介绍一下什么是静态SQL和动态SQL:

静态SQL,在编译阶段就可以确定数据库要做什么事情。在某种高级语言中,如果嵌入了SQL语句,而这个SQL语句的主体结构已经明确,例如在Java的一段代码中有一个待执行的SQL“select * from product where product_price>5”,在Java编译阶段,就可以将这段SQL交给数据库管理系统去分析,数据库软件可以对这段SQL进行语法解析,生成数据库方面的可执行代码,这样的SQL称为静态SQL。

动态SQL,而如果嵌入的SQL没有明确给出,如在Java中定义了一个字符串类型的变量sql:String sql;,然后采用PreparedStatement对象的execute方法去执行这个sql,该sql的值可能等于从文本框中读取的一个SQL或者从键盘输入的SQL,但具体是什么,在编译时无法确定,只有等到程序运行起来,在执行的过程中才能确定,这种SQL叫做动态SQL。
例如每一种数据库软件都有能够执行SQL语句的界面,那个界面接收的SQL就是动态SQL,因为数据库厂商在做这个界面时,并不知道用户会输入哪些SQL,只有在该界面执行后,接收了用户的实际输入,才知道SQL是什么。
另外还要注意一点,在SQL中如果某些参数没有确定,如"select * from product where product_price>? and product_price<?",这种语句是静态SQL,不是动态SQL,虽然个别参数的值不知道,但整个SQL的结构已经确定,数据库是可以将它编译的,在执行阶段只需将个别参数的值补充进来即可。

转载于:https://www.cnblogs.com/FengzZ/p/4890045.html

简单地说就是:
静态sql:语句类型在编程时候必须是确定好的,可以还有某些参数还未确定;
动态sql:语句类型可以在运行期间指定,可以在运行过程中键盘或其他途径输入SQL语句。

使用Statement实例执行静态SELECT语句查询记录

例:

package mydatabase;import java.sql.*;public class Test2 {private static final String url = "jdbc:mysql://localhost:3306/study";private static final String user = "root";private static final String password="xxx";static {try{//注册JDBC驱动程序Class.forName("com.mysql.cj.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();            //输出捕获到的异常信息}}public static void main(String[]args){try{Connection connection = DriverManager.getConnection(url,user,password);//获得数据库连接Statement statement = connection.createStatement();     //createStatement()方法创建并返回一个Statement实例String sql = "select * from product";                   //定义静态SELECT语句ResultSet resultSet = statement.executeQuery(sql);      //执行静态SELECT语句while(resultSet.next()){                                //遍历结果集,通过next()方法可以判断是否还存在符合条件的记录String name = resultSet.getString(1);   //通过列索引获得指定列的值int price = resultSet.getInt(3);        //通过列索引获得指定列的值System.out.println(name+" "+price);                 //打印表中信息}statement.close();                                      //立即释放Statement实例占用的数据库和JDBC资源connection.close();                                     //立即释放Connection实例占用的数据库和JDBC资源,即关闭数据库连接}catch (SQLException e){e.printStackTrace();}}
}

结果:
在这里插入图片描述

通过PreparedStatement实例执行动态SELECT语句查询记录

例:

package mydatabase;import java.sql.*;public class Test4 {private static final String url = "jdbc:mysql://localhost:3306/study";private static final String user = "root";private static final String password = "xxx";static {try{Class.forName("com.mysql.cj.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();}}public static void main(String[]args){try{Connection connection = DriverManager.getConnection(url,user,password);//获得数据库连接Statement statement = connection.createStatement();                     //createStatement()方法创建并返回一个Statement实例String sql = "select *from product";                                    //定义静态SELECT语句PreparedStatement preparedStatement = connection.prepareStatement(sql); //预处理动态INSERT语句ResultSet resultSet = preparedStatement.executeQuery();                 //执行动态INSERT语句ResultSetMetaData metaData = resultSet.getMetaData();                   //获得ResultSetMetaData类的实例System.out.print(metaData.getColumnName(1)+"  ");                       //通过列索引获得指定列的值System.out.print(metaData.getColumnName(2)+"  ");System.out.println(metaData.getColumnName(3));                          //通过列索引获得指定列的值while(resultSet.next()){String name = resultSet.getString(1);String type = resultSet.getString(2);int price = resultSet.getInt(3);System.out.println(name+"  "+type+"  "+price);}resultSet.close();preparedStatement.close();connection.close();}catch (SQLException e){e.printStackTrace();}}
}

结果:
在这里插入图片描述

插入数据

通过Statement实例执行静态INSERT语句添加单条记录

例:

package mydatabase;import java.sql.*;public class Test5 {private static final String url = "jdbc:mysql://localhost:3306/study";private static final String user = "root";private static final String password = "xxx";static {try{Class.forName("com.mysql.cj.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();            //输出捕获的异常信息}}public static void main(String[]args){try{Connection connection = DriverManager.getConnection(url,user,password);Statement statement = connection.createStatement();String sql = "insert into product (product_name,product_type,product_price,regist_date) " +"values('内存卡','电子用品',100,'2020-6-3'),('256G硬盘','电子用品',500,'2020-6-3')";statement.executeUpdate(sql);       //执行INSERT语句statement.close();connection.close();System.out.println("插入数据成功!");}catch (SQLException e){e.printStackTrace();}}
}

结果:
在这里插入图片描述

通过PreparedStatement实例执行动态INSERT语句批量添加记录

例:

package mydatabase;import java.sql.*;public class Test6 {private static final String url = "jdbc:mysql://localhost:3306/study";private static final String user = "root";private static final String password = "xxx";static {try{Class.forName("com.mysql.cj.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();}}public static void main(String[]args){try{Connection connection = DriverManager.getConnection(url,user,password);String [][] records = {{"雨伞","生活用品","20","2020-6-3"},{"风扇","生活用品","150","2020-6-3"}};String sql = "insert into product(product_name,product_type,product_price,regist_date) values(?,?,?,?)";//定义动态INSERT语句PreparedStatement preparedStatement = connection.prepareStatement(sql);                                 //预处理动态INSERT语句preparedStatement.clearBatch();                                             //清空Batchfor (int i=0;i<records.length;i++){preparedStatement.setString(1,records[i][0]);           //为参数赋值preparedStatement.setString(2,records[i][1]);           //为参数赋值preparedStatement.setInt(3, Integer.valueOf(records[i][2]));//为参数赋值preparedStatement.setDate(4, Date.valueOf(records[i][3]));//为参数赋值preparedStatement.addBatch();                                           //将INSERT语句添加到Batch中}preparedStatement.executeBatch();                                           //批量执行Batch中的INSERT语句preparedStatement.close();connection.close();System.out.println("插入数据成功!");}catch (SQLException e){e.printStackTrace();}}
}

结果:
在这里插入图片描述

相关文章:

[Asp.net 5] Options-配置文件(2)

很久之前写过一篇介绍Options的文章&#xff0c;2016年再打开发现很多变化。增加了新类&#xff0c;增加OptionMonitor相关的类。今天就对于这个现在所谓的新版本进行介绍。 老版本的传送门&#xff08;[Asp.net 5] Options-配置文件之后昂的配置&#xff09;。 首先上一个图&a…

android-sdk-windows版本号下载

Android SDK 4.0.3 开发环境配置及执行 近期又装了一次最新版本号的ADK环境 眼下最新版是Android SDK 4.0.3 本文的插图和文本尽管是Android2.2的 步骤都是一样的&#xff0c;假设安装的过程中遇到什么问题&#xff0c;能够留言&#xff0c;我会尽快回复&#xff01; 系统环境的…

vs code搭建Django环境

在网上找了很多博客&#xff0c;看了vs code的官方文档&#xff0c;最终拼凑起来&#xff0c;终于搭建起来了djangode开发虚拟环境&#xff08;win10下&#xff09; 一、新建项目文件夹 F:\Python\temp\django_demo&#xff08;例子&#xff09; 二、在项目文件夹创建虚拟pytho…

Marvelous Designer衣袖设计教程

大小解压后&#xff1a;2.96G 持续时间3h 28m 包含项目文件 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 标题:技能分享——卓越设计师大师班(袖子) 信息: 在我的课程中&#xff0c;精彩设计师大师班(袖子)。在本课程中&…

Mybatis入门:1(Mybatis框架的环境搭建)

Mybatis框架的环境搭建 一.创建maven工程并导入坐标 导入坐标&#xff1a; <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><d…

html表单的创建和css的构成

产品参数 <h2>LIFAair LA500参数表</h2><table><tr><td>测试数目</td><td>单位</td><td>数据</td></tr><tr><td>颗粒物CADR</td><td>m<sup>3</sup>/h</td><t…

Gartner2014年魔力象限(商业智能和分析平台)

转载于:https://www.cnblogs.com/crsn/p/4271377.html

@SupperssWarnings注解

SupperssWarnings注解&#xff1a;压制、控制警告 SuppressWarnings(“rawtypes”) 是什么含义 SuppressWarnings压制警告&#xff0c;即去除警告 rawtypes是说传参时也要传递带泛型的参数 SuppressWarnings(“unchecked”) unchecked 执行了未检查的转换时的警告 SuppressWarn…

虚幻引擎C++编程游戏开发基础

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:23.8 GB |时长:44h 59m 学习C编程和游戏开发基础和虚幻引擎 你会学到什么 通过简单的例子和插…

Mybatis入门:3(动态sql)

动态sql语句 if标签 基本使用 一.在ProductDao接口中创建一个查询方法findByType import com.domain.Product;import java.util.List;public interface ProductDao {/*** 根据类型来查找* param product* return*/Product findByType(Product product); }二.在映射配置文件…

javaweb学习总结(二十三)——jsp自定义标签开发入门

一、自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码。 二、自定义标签开发和使用 2.1、自定义标签开发步骤 1、编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag;2 3 import java.io.IOException;4 5 import javax.servlet.http.HttpServle…

Java数组的三种声明方式

具体的细节大家可以不用先去了解,这涉及到很多知识,只要记住输出的时候,先导包,然后再利用Arrays.toString(arr)输出就行了。如:先定义好一个长度为4的新数组,此时数组为空,使用arr[ ]数组下标来进行逐个赋值。那我们定义好数组之后,就理所应当的对声明好的数组进行赋值。那么对于未涉及过编程的小伙伴,看到这可能会蒙了。原因就是我们sout(arr)时,输出的是这个数据的内存地址,而不是真实的数据。使用数组: 只需要一个变量,然后数组中存很多的数据, 其实可以把数组想成 一个容器。

Math: Math.atan() 与 Math.atan2() 计算两点间连线的夹角

Math.atan2()函数返回点(x,y)和原点(0,0)之间直线的倾斜角.那么如何计算任意两点间直线的倾斜角呢?只需要将两点x,y坐标分别相减得到一个新的点(x2-x1,y2-y1).然后利用他求出角度就可以了.使用下面的一个转换可以实现计算出两点间连线的夹角.然而,Math.atan()只能返回一个角度值,因此确定他的角度非常的复杂,而且,90度和270度的正切是无穷大,因为除数为零,我们也是比较难以处理的~!angel为一个角度的弧度值,slope为直线的斜率,是一个数字,这个数字可以是负的。

@RequiredArgsConstructor详解&@AllArgsConstructor和@RequiredArgsConstructor区别

RequiredArgsConstructor是Lombok的一个注解,简化了我们对@Autowired书写,我们在写Controller层或者Service层的时候,总是需要注入很多mapper接口或者service接口,如果每个接口都写上@Autowired,这样看起来就会很繁琐,@RequiredArgsConstructor注解可以代替@Autowired注解。

RDIFramework.NET ━ 9.8 用户权限管理 ━ Web部分

RDIFramework.NET ━ .NET快速信息化系统开发框架 9.8 用户权限管理 -Web部分 在实际应用中我们会发现&#xff0c;权限控制会经常变动&#xff0c;如&#xff1a;需要调整角色的分配&#xff0c;需要收回与授予某些角色、用户可访问的模块&#xff08;菜单&#xff09;与相应…

python并发

python并发 &#xff08;这部分还需要改&#xff0c;先将就着看&#xff09; Python 的 threading 模块引入了锁&#xff08;Lock&#xff09;。threading 模块提供了 Lock 和 RLock 两个类&#xff0c;它们都提供了如下两个方法来加锁和释放锁&#xff1a; acquire(blockingTr…

学会在Unity中创建一个Match-3益智游戏 Learn To Create a Match-3 Puzzle Game in Unity

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:48场讲座(6h 38m) |大小解压后:2.8 GB 含课程文件 游戏开发变得容易了。使用Unity学习C#并创建自…

Mybatis入门:2(xml形式的增删改查)

xml形式的增删改查 这里感觉没啥好讲的&#xff0c;照着代码自己敲一遍、认真再看看应该都懂的。 Maven工程坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http:/…

NSDate见解

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { // NSDate *date [NSDate date]; // // NSDateFormatter *formatter [[NSDateFormatter alloc] init];// yyyy 年// MM 月// dd 日// HH 24小时 hh 12小时// mm 分钟// ss 秒钟…

秒杀系统架构设计

秒杀活动的技术挑战 1. 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动&#xff0c;这个活动具有时间短&#xff0c;并发访问量大的特点&#xff0c;如果和网站原有应用部署在一起&#xff0c;必须会对现有业务造成冲击&#xff0c;稍有不慎可能导致整个网站瘫痪。…

SpringBoot 2.x 使用 JWT(JSON Web Token)

一、跨域认证遇到的问题 由于多终端的出现&#xff0c;很多的站点通过 web api restful 的形式对外提供服务&#xff0c;采用了前后端分离模式进行开发&#xff0c;因而在身份验证的方式上可能与传统的基于 cookie 的 Session Id 的做法有所不同&#xff0c;除了面临跨域提交 c…

在Unity中制作4种不同的游戏

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:8.6 GB 含课程素材 |时长:15h 3m Unity 制作4款无代码手机游戏 Make 4 games in Unity with …

Spring学习笔记:1(初步认识概念)

Spring的三大主要特征 spring主要特征有三个&#xff1a;控制反转&#xff08;IOC&#xff09;&#xff0c;依赖注入&#xff08;DI&#xff09;和面向切面&#xff08;AOP&#xff09;。 IoC&#xff1a;Inverse of Control&#xff08;控制反转&#xff09; 1.对控制反转的…

shell example01

条件判断 if [[ -e ${1} ]]; thenecho "$(tput setaf 2) found ${1} $(tput sgr0)"cat ${1} elseecho "$(tput setaf 1) not found ${1} $(tput sgr0)"exit 1 fi//简化[[ -e ${1} && -e ${2} ]] && cat ${1} > ${2}//判断取反txt4.txti…

gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第一篇:安装配置gradle...

一个bug 一个脚印的叫你们用gradle。 1介于网络上的很多资料都是老的 不适用与现在的新版本gradle 尤其是有些gradle方法改名了老的用不了 2介于网上都是粘贴复制并且零碎我很蛋疼啊&#xff0c;走了很多歪路才弄出来&#xff0c;所以我弄一个完全完整的版本 3我不但会写gradle…

java的static关键字

java的static关键字 静态变量和静态方法 static关键字最基本的用法是&#xff1a; 1、被static修饰的变量属于类变量&#xff0c;可以通过类名.变量名直接引用&#xff0c;而不需要new出一个类来 2、被static修饰的方法属于类方法&#xff0c;可以通过类名.方法名直接引用&…

Spring学习笔记:2(IOC装配Bean之xml方式)

xml配置方式装配Bean 本文借鉴于&#xff1a;https://www.cnblogs.com/qdhxhz/p/6511887.html Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数&#xff0c;用的最多)静态工厂实例化实例工厂实例化 代码如下&#xff1a; Bean1类(构造方法…

学习RPG Maker MZ开发创建并发布PC和移动端游戏

Complete RPG Maker MZ: Create and Publish for PC and Mobile 完整的RPG制造商MZ:为个人电脑和移动设备创建和发布 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确…

CSS选择器总结

总结几种自己比较容易混淆的&#xff1a; 1. 后代选择器&#xff0c;写法是 E1 E2&#xff0c;如 ul li&#xff0c;选择的是所有后代&#xff0c;包括子后代、孙后代…; 2. 子选择器&#xff0c;写法 E1 > E2&#xff0c;只选择子后代&#xff0c;不包括孙后代元素&#xf…

OSChina 周六乱弹 —— 小明和网关超经典的故事~

2019独角兽企业重金招聘Python工程师标准>>> 周六&#xff0c;又到了瞎扯淡的时间了。周末&#xff0c;约会&#xff0c;男男女女&#xff0c;还有那啥那啥&#xff0c;你们懂得&#xff5e; 男人和女人明显不同&#xff0c;这样才导致了异性相吸吗&#xff1f; 1. …