JavaWeb | JSP访问数据库、JDBC操作

目录:

    • 1.JDBC简介
    • 2.Statement 和 PreparedStatement 的区别
    • 3.导入连接数据库Jar包
    • 4.JDBC操作
      • 4.1 Statement操作
        • 使用Statement“添加数据”
        • 使用Statement“删除数据”
        • 使用Statement“修改数据”
        • 使用Statement“查询数据”
      • 4.2 PreparedStatement操作
        • 使用PreparedStatement“添加数据”
        • 使用PreparedStatement“删除数据”
        • 使用PreparedStatement“修改数据”
        • 使用PreparedStatement“查询数据”

1.JDBC简介

  • JSP中可以写Java代码,很明显可以通过Java代码访问数据库

  • 在Java技术系列中访问数据库的技术”JDBC“,它提供了一系列的API,让Java语言编写的代码能连接数据库,对数据库的数据进行增加删除修改查询

  • JDBC有的API存放在java.sql宝中,主要包括以下接口

    java.sql.Connection : 负责连接数据库。

    java.sql.Statement : 负责执行数据库的sql语句不能参数化查询,一般只用其的功能)

    java.sql.PreparedStatement : 负责执行数据库sql语句 (能 参数化查询/动态查询,其的功能都常用)。

    java.sql.ResultSe : 负责存放查询结果 (存放结果集)。

2.Statement 和 PreparedStatement 的区别

  • 参数化查询 / 动态查询
    StatementPreparedStatement 都能对数据库进行,但两者又有所不同。

    PreparedStatement支持参数化查询,可避免SQL注入攻击。PreparedStatement可以将参数作为占位符传递到SQL查询中,然后通过setXXX()将参数值绑定到占位符上,这是PreparedStatement的参数化查询 / 动态查询。(先有占位符,后通过setXXX( )方法将参数与占位符替换,成功填入值)

    Statement不支持参数化查询,如果你需要动态添加数据 / 动态查询,必须使用拼接字符串的方式来创建SQL语句容易导致SQL注入攻击

    所以,一般不用Statement来完成动态查询功能,用PreparedStatement来完成动态查询功能

  • 性能 :
    一般来说 PreparedStatement的性能优于Statement
    因为PreparedStatement的sql语句在执行前已经编译过,而StatementSQL语句每次执行都需要编译,所以性能比较差。

  • 代码可读性 :
    由于PreparedStatement支持参数化参数,使的代码更加清晰易于维护,也使代码更加模块化易于理解。而StatementSQL语句中混杂着数据,代码可读性较差。

3.导入连接数据库Jar包

在JSP中连接数据库时除了要导入 mysql-connector-java.jar 包, 一般还要导入关于JSP的
jsp-api.jar包

4.JDBC操作

4.1 Statement操作

使用Statement“添加数据”
<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JSP中通过Statement"添加数据"</title>
</head>
<body>
<%//1.加载驱动Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2,获得连接数据库的Connection对象Connection conn = DriverManager.getConnection(url,"root", "root");//3.获得操作数据库的Statement对象Statement stat = conn.createStatement();//sql语句String sql = "insert into book(bno,bname,author,publishment) values('1','JavaWeb开发','zhangsan','北京出版社')";//4.执行该语句int i = stat.executeUpdate(sql);out.print("成功添加"+i+"行");//5.关闭资源stat.close();conn.close();
%>
</body>
</html>
使用Statement“删除数据”
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JSP中通过Statement"删除数据"</title>
</head>
<body>
<%//1.通过反射加载驱动Class.forName("com.mysql.jdbc.Driver");//urlString url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.通过connection对象连接数据库Connection conn = DriverManager.getConnection(url, "root", "root");//3.通过Statement对象操作数据库Statement stat = conn.createStatement();String sql = "delete from book where bno ='1'";//4.调用方法操作数据库int i = stat.executeUpdate(sql);out.print("成功删除"+i+"行数据");//关闭资源stat.close();conn.close();
%>
</body>
</html>
使用Statement“修改数据”
<%@ page import="com.mysql.jdbc.Driver" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JSP中通过Statement"修改数据"</title>
</head>
<body>
<%//1.通过反射加载驱动Class.forName("com.mysql.jdbc.Driver");//urlString url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.通过connection对象连接数据库Connection conn = DriverManager.getConnection(url, "root", "root");//3.通过Statement对象操作数据库Statement stat = conn.createStatement(); String sql = "update book set bname = 'JavaJavaJava' where bno = '1'";//4.调用方法操作数据库int i = stat.executeUpdate(sql);out.print("成功修改"+i+"行数据");//关闭资源stat.close();conn.close();
%>
</body>
</html>
使用Statement“查询数据”
<%@ page import="com.mysql.jdbc.Driver" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JSP中通过Statement"查询数据"</title>
</head>
<body>
<%//1.通过反射加载驱动Class.forName("com.mysql.jdbc.Driver");//urlString url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.通过connection对象连接数据库Connection conn = DriverManager.getConnection(url, "root", "root");//3.通过Statement对象操作数据库Statement stat = conn.createStatement(); //Statement : 不能参数化查询String sql = "select * from book where bno = 1";//4.调用方法操作数据库ResultSet rs = stat.executeQuery(sql);while (rs.next()) {out.print(rs.getString(1));out.print(rs.getString(2));out.print(rs.getString(3));out.print(rs.getString(4));}//关闭资源stat.close();conn.close();
%>
</body>
</html>

4.2 PreparedStatement操作

使用PreparedStatement“添加数据”
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>add1.jsp</title>
</head>
<body>
<%//1.通过反射连接驱动Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.获得连接数据库的Connection对象Connection conn = DriverManager.getConnection(url, "root", "root");//3.获得操作数据的PreparedStatement对象 (PreparedStatement对象可进行参数化设置)String sql = "insert into book values(?,?,?,?)";PreparedStatement ps = conn.prepareStatement(sql);//设置参数(补充占位符)ps.setString(1,"111");ps.setString(2,"诗词鉴赏");ps.setString(3,"俞平伯");ps.setString(4,"陕西师范大学出版社");int i = ps.executeUpdate();out.print("成功添加"+i+"行数据!");
%>
</body>
</html>
使用PreparedStatement“删除数据”
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>delete1.jsp</title>
</head>
<body>
<%//1.通过反射连接驱动Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.获得连接数据库的Connection对象Connection conn = DriverManager.getConnection(url, "root", "root");//3.获得操作数据的PreparedStatement对象 (PreparedStatement对象可进行参数化设置)String sql = "delete from book where bno = ?";PreparedStatement ps = conn.prepareStatement(sql);//设置参数(补充占位符)ps.setString(1,"111");//4.执行sql操作int i = ps.executeUpdate();out.print("成功删除"+i+"行数据!");
%>
</body>
</html>
使用PreparedStatement“修改数据”
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>update1.jsp</title>
</head>
<body>
<%//1.通过反射连接驱动Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.获得连接数据库的Connection对象Connection conn = DriverManager.getConnection(url, "root", "root");//3.获得操作数据的PreparedStatement对象 (PreparedStatement对象可进行参数化设置)String sql = "update book set bname = ? where bno = ?";PreparedStatement ps = conn.prepareStatement(sql);//设置参数(补充占位符)ps.setString(1,"JavaWeb");ps.setString(2,"112233");//4.执行sql语句int i = ps.executeUpdate();out.print("成功修改"+i+"行数据!");
%>
</body>
</html>
使用PreparedStatement“查询数据”
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>select1.jsp</title>
</head>
<body>
<%//1.通过反射连接驱动Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/a3?useUnicode=true&characterEncoding=UTF-8";//2.获得连接数据库的Connection对象Connection conn = DriverManager.getConnection(url, "root", "root");//3.获得操作数据的PreparedStatement对象 (PreparedStatement对象可进行参数化设置)String sql = "select * from book where bno = ?";PreparedStatement ps = conn.prepareStatement(sql);//设置参数(补充占位符)ps.setString(1,"0009999112");//4.获得结果集对象ResultSet rs = ps.executeQuery(); //返回值为结果集对象//5.解析结果集对象while (rs.next()) { //如果有数据String bno = rs.getString(1);String bname = rs.getString(2);String author = rs.getString(3);String publishment = rs.getString(4);out.print(bno+" "+bname+" "+author+" "+publishment);}
%>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开发需要用到的软件,必备软件工具一览

java开发需要用到的软件&#xff0c;必备软件工具一览 如果你对Java编程感兴趣或已经是一名Java开发者&#xff0c;你需要一些必备的软件工具来提高你的生产力和简化开发过程。在本文中&#xff0c;我们将探讨Java开发所需的关键软件工具&#xff0c;并通过具体示例来解释它们的…

最新消息:滴滴 P0 事故原因,原因出来了

最新消息滴滴P0故障原因&#xff0c;是由于k8s集群升级导致的&#xff0c;后面又进行版本回退&#xff0c;由于现在大型互联网公司基本都是基于K8s进行部署的&#xff0c;如果K8s集群一出问题&#xff0c;上面运行的业务Pod和运维系统全部都得宕机&#xff0c;导致没法回滚。 …

二叉树(判断是否为单值二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 判断二叉树上每个节点的值是否相同&#xff0c;就需要让root节点分别与左节点和右节点分别比较是否相同。 注意&#xff1a;root等于空时&#xff0c;直接可以返回true&#xff1b; 首先&#xff0c;先判断他的特殊情况&#x…

如何在安防视频监控平台EasyCVR首页增添统计设备每个小时的温度展示功能?细节如下

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

BLIoTLink软网关,一键解决OT层与IT层的通信

在工业自动化领域&#xff0c;协议转换一直是一个重要的问题。不同的设备、系统往往使用不同的通信协议&#xff0c;这给数据采集、设备接入等带来很大的困扰。为了解决这个问题&#xff0c;各种协议转换软件应运而生。其中&#xff0c;BLIoTLink作为一款功能强大的嵌入式工业协…

Unity一些常用的接口

Unity中一些常用的接口&#xff0c;系统自带的。 在这里只是整理了一下Unity中常用的接口&#xff0c;一般情况下&#xff0c;都是自己写接口&#xff0c;但是有时候也会使用到系统自带&#xff0c;在此整理一下。后续如果还有的话&#xff0c;继续在此加入。 事件相关的接口…

常使用的定时任务

常使用的定时任务 一、 linux自带的定时任务 1、crontab 有这样一个需求&#xff1a;我们使用Java写一个工具jar包在系统空闲的时候去采集已经部署在Linux系统上的项目的一 些数据&#xff0c;可以使用 linux 系统的 crontab。 运行crontab -e&#xff0c;可以编辑定时器&…

Centos7上安装nginx,并配置开机自启

1、安装前置插件 yum -y install gcc-c pcre pcre-devel openssl openssl-devel 2、下载安装包 下载地址&#xff1a;nginx: download 这里最好使用最新的安装包&#xff0c;过老的版本会有一堆系统漏洞需要修复 #进入源码放置目录 这里最好放在好找的地方&#xff0c;后…

[密码学]DES

先声明两个基本概念 代换&#xff08;substitution&#xff09;,用别的元素代替当前元素。des的s-box遵循这一设计。 abc-->def 置换&#xff08;permutation&#xff09;&#xff0c;只改变元素的排列顺序。des的p-box遵循这一设计。 abc-->bac DES最核心的算法就是…

区块链相关技术、概念以及技术实现过程中的一些关键问题 Smart Contracts and Blockchains

作者:禅与计算机程序设计艺术 1.简介 2017年底,区块链已经成为众多投资人和技术人员最关注的话题之一。随着现实世界的不断复杂化、数字货币的流行以及IoT设备的普及,加密数字货币市场正变得越来越活跃。由于区块链具有去中心化、不可篡改、透明性、高并发等特点,使其在金…

Spark分布式安装模式

Spark 分布式环境安装目前有四种模式&#xff1a; 1.Standalone&#xff1a;Spark 自带的简单群资源管理器&#xff0c;安装较为简单&#xff0c;不需要依赖 Hadoop&#xff1b; 2.Hadoop YARN:使用 YARN 作为集群资源管理&#xff0c;安装需要依赖 Hadoop&#xff1b; 3.Ap…

使用nginx代理s3服务(私有云存储)

1、背景 公司网络安全原因&#xff0c;私有部署s3服务的机器无法被直接访问&#xff0c;所以需要加一层代理&#xff0c;通过访问代理去访问s3服务器&#xff0c;这里使用nginx进行代理。使用s3服务的方式是在代码中使用官方的java s3 sdk&#xff08;本文对于其他语言的官方s…

vuejs: 解决浏览器切换页面后setInterval计时器停止执行的问题

setInterval定时器是基于当前页面的&#xff0c;如果切换到其他页面&#xff0c;定时器会被暂停。这是浏览器的一种优化措施&#xff0c;以减少不必要的性能消耗。 如果需要在切换页面后继续执行定时器&#xff0c;可以使用Web Worker&#xff0c;它是在后台运行的程序&#xf…

Linux shell命令

Linux shell命令 1、Shell简介 ​ Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 ​ Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问…

vue+jsonp编写可导出html的模版,可通过外部改json动态更新页面内容

效果 导出后文件结果如图所示&#xff0c;点击Index.html即可查看页面&#xff0c;页面所有数据由report.json控制&#xff0c;修改report.json内容即可改变index.html展示内容 具体实现 1. 编写数据存储的json文件 在index.html所在的public页面新建report.json文件&#xff…

编程语言发展史:新兴编程语言的趋势和发展

一、引言 随着计算机技术的不断发展&#xff0c;计算机编程语言也在不断更新和发展。新兴编程语言的出现不仅丰富了编程语言的种类&#xff0c;也为编程带来了更多的可能性和选择。本文将从新兴编程语言的趋势和发展入手&#xff0c;详细探讨新兴编程语言的特点、优势和发展前…

彩虹云商城搭建教程+源码程序

前言&#xff1a;域名服务器或宝塔主机商场程序在线云商城 随着电子商务的快速发展&#xff0c;越来越多的企业开始意识到开设一个自己的电子商城对于销售和品牌推广的重要性。然而&#xff0c;选择一家合适的网站搭建平台和正确地构建一个商城网站并不是一件容易的事情。本文…

PyQt基础_008_ 按钮类控件QSpinbox

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class spindemo(QWidget):def __init__(self, parentNone):super(spindemo, self).__init__(parent)self.setWindowTitle("SpinBox 例子")self.resize(300,…

数据结构与算法之递归: LeetCode 78. 子集 (Typescript版)

子集 https://leetcode.cn/problems/subsets/ 描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1 输入&#xff1a;nums [1,2,3]…

微服务链路追踪组件SkyWalking实战

概述 微服务调用存在的问题 串联调用链路&#xff0c;快速定位问题&#xff1b;理清服务之间的依赖关系&#xff1b;微服务接口性能分析&#xff1b;业务流程调用处理顺序&#xff1b; 全链路追踪&#xff1a;对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…