JDBC: 2.初级教程

搭建

依赖

 <dependencies><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency></dependencies>

jdbc.properties

url=jdbc:mysql://localhost:3306/phone_book_console?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username=root
pwd=root
driver=com.mysql.jdbc.Driver

封装JDBC工具类

package com.utils;import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC工具类*/
public class JdbcUtils {//成员变量,作用全局private static String url;private static String username;private static String pwd;//静态块,只初始化一次,用来初始化jdbc.properties和注册数据库驱动static {try {//实例化Properties对象Properties properties = new Properties();//获取读取properties文件的字节输入流对象InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//读取properties文件并解析properties.load(is);url = properties.getProperty("url");username = properties.getProperty("username");pwd = properties.getProperty("pwd");String driver = properties.getProperty("driver");//加载并注册数据库驱动,一次即可Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//获取数据库连接对象public static Connection getConnection() {Connection connection = null;try {connection = DriverManager.getConnection(url, username, pwd);} catch (SQLException throwables) {throwables.printStackTrace();}return connection;}//关闭连接对象public static void closeConnection(Connection connection) {try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}//提交事务public static void commit(Connection connection) {try {connection.commit();} catch (SQLException throwables) {throwables.printStackTrace();}}//事务回滚public static void rollback(Connection connection) {try {connection.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}}//关闭Statement对象public static void closeStatement(Statement statement) {try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}//关闭ResultSetpublic static void closeResultSet(ResultSet resultSet) {try {resultSet.close();} catch (SQLException throwables) {throwables.printStackTrace();}}//DML操作时关闭资源public static void closeResource(Statement statement, Connection connection) {//先关闭Statement对象closeStatement(statement);//在关闭Connection对象closeConnection(connection);}//查询时关闭资源public static void closeResource(ResultSet resultSet, Statement statement, Connection connection) {//先关闭ResultSetcloseResultSet(resultSet);//在闭Statement对象closeStatement(statement);//最后关闭Connection对象closeConnection(connection);}
}

Driver接口

Driver接口的作用是来定义数据库驱动对象应该具备的一些能力,比如与数据库建立连 接的方法的定义,该接口是提供给数据库厂商使用的,所有支持 java 语言连接的数据库都实现了该接口,实现该接口的类我们称之为数据库驱动类

DriverManager类

简介

DriverManager是驱动程序管理器,是负责管理数据库驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 DriverManager 通过实例化的数据库驱动对象,能够建立应用程序与数据库之间建立连接并返回Connection接口类型的数据库连接对象

getConnection()

getConnection(String jdbcUrl, String user, String password) 该方法通过访问数据库的 url、用户以及密码,返回对应的数据库的 Connection 对象

示例:连接mysql数据库

String url = "jdbc:mysql://localhost:3306/test?useSSL=false";

String name = "root";

String pwd = "root";

//通过反射实现数据库驱动的加载与注册

Class.forName("com.mysql.jdbc.Driver");

Connection connection = DriverManager.getConnection(url, name, pwd); System.out.println(connection);

Connection接口

简介

Connection是数据库的连接(会话)对象,对数据库的一切操作都是在这个连接基础之上进行的,我们可以通过该对象执行sql语句并返回结果

方法

createStatement():创建向数据库发送 sql 的 Statement 接口类型的对象
preparedStatement(sql):创建向数据库发送预编译 sql 的 PrepareSatement 接口类型的对象
setAutoCommit(boolean autoCommit):设置事务是否自动提交
commit():在链接上提交事务
rollback():在此链接上回滚事务

Statement

简介

用于执行静态 SQL 语句并返回它所生成结果的对象,由 createStatement 创建,用于发送简单的 SQL 语句(不支持动态绑定)

注意

由于Statement对象是一个执行静态SQL语句的对象,所以该对象存在SQL注入风险

方法

execute(String sql):执行参数中的 SQL,返回是否有结果集。

executeQuery(String sql):运行 select 语句,返回 ResultSet 结果集。 executeUpdate(String sql):运行 insert/update/delete 操作,返回更新的行数。 addBatch(String sql):把多条 sql 语句放到一个批处理中。

executeBatch():向数据库发送一批 sql 语句执行。

添加数据


/*** Statement对象的使用*/
public class StatementTest {/*** 添加用户*/public void insertUsers(String username,int userage){Connection connection = null;Statement statement = null;try{//获取Connection对象。connection = JdbcUtils.getConnection();//获取Statement对象statement = connection.createStatement();//定义需要执行的SQL语句String sql = "insert into users values(default,'"+username+"',"+userage+")";//执行SQL,返回boolean值,如果sql有结果集返回,那么返回值为true,如果没有结果集返回,则返回false。boolean execute = statement.execute(sql);System.out.println(execute);}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(statement,connection);}}
}         

修改数据

 /*** 修改用户信息*/public void updateUsers(int userid,String username,int userage){Connection connection = null;Statement statement = null;try{//获取连接对象connection = JdbcUtils.getConnection();//获取Statement对象statement = connection.createStatement();//定义sql语句String sql ="update users set username='"+username+"',userage="+userage+" where userid="+userid;//执行sql语句int i = statement.executeUpdate(sql);System.out.println(i);}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(statement,connection);}}

删除数据

/*** 根据用户ID删除用户*/public void deleteUsersById(int userid){Connection connection =null;Statement statement = null;try{//获取数据库连接connection = JdbcUtils.getConnection();//获取Statement对象statement = connection.createStatement();//定义执行删除语句String sql = "delete from users where userid="+userid;//执行sqlint i = statement.executeUpdate(sql);System.out.println(i);}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(statement,connection);}}

preparedStatement

简介

继承自Statement接口,由preparedStatement方法创建, PreparedStatement具有预编译SQL语句能力,所以PreparedStatement对象比 Statement 对象的效率更高, 由于实现了动态的参数绑定,所以可以防止SQL注入,所以我们一般都使用PreparedStatement

特点

1.PreparedStatement 接口继承 Statement 接口
2.PreparedStatement 效率高于 Statement
3.PreparedStatement 支持动态绑定参数
4.PreparedStatement 具备 SQL 语句预编译能力
5.使用 PreparedStatement 可防止出现 SQL 注入问题

方法

addBatch():把当前 sql 语句加入到一个批处理中
execute():执行当前 SQL,返回个 boolean 值
executeUpdate():运行 insert/update/delete 操作,返回更新的行数。
executeQuery():执行当前的查询,返回一个结果集对象
setDate(int parameterIndex, Date x):向当前SQL语句中的指定位置绑定一个java.sql.Date值
setDouble(int parameterIndex, double x): 向当前 SQL 语句中的指定位置绑定一个 double值
setFloat(int parameterIndex, float x): 向当前 SQL 语句中的指定位置绑定一个 float 值
setInt(int parameterIndex, int x): 向当前 SQL 语句中的指定位置绑定一个 int 值
setString(int parameterIndex, String x):向当前 SQL 语句中的指定位置绑定一个 String 值

添加数据

 /*** PreparedStatement使用的测试类*/public class PreparedStatementTest {/*** 添加用户*/public void insertUsers(String username,int userage){Connection connection = null;PreparedStatement ps = null;try{//获取数据库连接connection = JdbcUtils.getConnection();//定义Sql。?是PreparedStatement对象中的绑定参数的占位符。问号的位置是从1开始计数的String sql = "insert into users values(default,?,?)";//创建PreparedStatement对象ps = connection.prepareStatement(sql);//完成参数的绑定ps.setString(1,username);ps.setInt(2,userage);int i = ps.executeUpdate();System.out.println(i);}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(ps,connection);}}}

更新数据

/*** 根据用户ID修改用户姓名与年龄*/public void updateUsersById(int userid,String username,int userage){Connection connection = null;PreparedStatement ps = null;try{//获取数据库连接对象connection = JdbcUtils.getConnection();//创建PreparedStatement对象ps = connection.prepareStatement("update users set username = ?,userage=? where userid = ?");//参数绑定ps.setString(1,username);ps.setInt(2,userage);ps.setInt(3,userid);int i = ps.executeUpdate();System.out.println(i);}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(ps,connection);}}

删除数据

  /*** 根据用户ID删除指定用户*/public void deleteUsersById(int userid){Connection conn = null;PreparedStatement ps = null;try{//获取数据库连接对象conn = JdbcUtils.getConnection();//创建PreparedStatement对象ps = conn.prepareStatement("delete from users where userid = ? ");//绑定参数ps.setInt(1,userid);int i = ps.executeUpdate();System.out.println(i);}catch (Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(ps,conn);}}

ResultSet

简介

ResultSet用来存放数据库查询操作获得结果集,通过对ResultSet的操作可以获取查询到的结果集数据

注意

ResultSet 对象中存放的并不是我们查询到的所有的结果集,它采用分块加载的方式来载入结果集数据

特点

ResultSet对象具有指向其当前数据行的指针,最初指针被置于第一行之前,next方法将指针移动到下一行, 因为该方法在ResultSet对象中没有下一行时返回false,所以可以在 while 循环中使用它来迭代结果集, 默认的ResultSet对象仅有一个向前移动的指针,因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行, ResultSet接口提供用于获取当前行检索列值的获取方法(getBoolean、getLong 等),可以使用列的索引位置或列的名称检索值,

方法

getString(int index)、getString(String columnName):获得在数据库里是 varchar、char 等类型的数据对象。
getFloat(int index)、getFloat(String columnName):Float(int index)、getFloat(String columnName)
getDate(int index)、getDate(String columnName):获得在数据库里是 Date 类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是 Boolean 类型的数据。
getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。 

查询所有

 /*** 查询所有用户*/public void selectUsersAll(){Connection connection = null;PreparedStatement ps = null;ResultSet resultSet = null;try{//获取数据库连接connection = JdbcUtils.getConnection();//创建PreparedStatement对象ps = connection.prepareStatement("select * from users");//执行查询resultSet = ps.executeQuery();//操作ResultSet对象获取查询的结果集while(resultSet.next()){//获取列中的数据int userid = resultSet.getInt("userid");String username = resultSet.getString("username");int userage = resultSet.getInt("USERAGE");System.out.println(userid+" "+username+" "+userage);}}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(resultSet,ps,connection);}}

模糊查询

 /*** 根据用户名称模糊查找用户信息*/public List<Users> fuzzyQuery(String username){List<Users> list= new ArrayList<>();Connection conn =null;PreparedStatement ps = null;ResultSet rs = null;try{//获取数据库连接conn = JdbcUtils.getConnection();//创建PreparedStatement对象ps = conn.prepareStatement("select * from users where username like ?");//参数绑定ps.setString(1,username);//执行sql语句rs = ps.executeQuery();while(rs.next()){Users user = new Users();user.setUserid(rs.getInt("userid"));user.setUsername(rs.getString("username"));user.setUserage(rs.getInt("userage"));list.add(user);}}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(rs,ps,conn);}return list;}public static void main(String[] args) {FuzzyQueryTest ft = new FuzzyQueryTest();List<Users> users = ft.fuzzyQuery("%d%");for(Users user1:users){System.out.println(user1.getUserid()+" "+user1.getUsername()+" "+user1.getUserage());}}

动态条件查询

/*** 动态条件查询Users*/public List<Users> queryUsers(Users users){List<Users> list= new ArrayList<>();Connection conn =null;PreparedStatement ps = null;ResultSet rs = null;try{//获取数据库连接conn = JdbcUtils.getConnection();//拼接查询SQL语句String sql = this.generateSql(users);System.out.println(sql);//创建PreparedStatement对象ps = conn.prepareStatement(sql);//执行sql语句rs = ps.executeQuery();while(rs.next()){Users user = new Users();user.setUserid(rs.getInt("userid"));user.setUsername(rs.getString("username"));user.setUserage(rs.getInt("userage"));list.add(user);}}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.closeResource(rs,ps,conn);}return list;}/*** 生成动态条件查询sql*/private String generateSql(Users users){StringBuffer sb = new StringBuffer("select * from users where 1=1 ");if(users.getUserid() > 0){sb.append(" and userid = ").append(users.getUserid());}if(users.getUsername() !=null &&users.getUsername().length() > 0){sb.append(" and username = '").append(users.getUsername()).append("'");}if(users.getUserage() > 0){sb.append(" and userage = ").append(users.getUserage());}return sb.toString();}public static void main(String[] args) {DynamicConditionQueryTest dt = new DynamicConditionQueryTest();Users users = new Users();users.setUsername("Oldlu");users.setUserage(20);List<Users> list = dt.queryUsers(users);for(Users user1:list){System.out.println(user1.getUserid()+" "+user1.getUsername()+" "+user1.getUserage());}}

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

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

相关文章

第10章 启动过程组 (识别干系人)

第10章 启动过程组 10.2识别干系人&#xff0c;在第三版教材第361~362页&#xff1b; 文字图片音频方式 视频13 第一个知识点&#xff1a;主要工具与技术 1、数据收集 问卷调查 包括一对一调查、焦点小组讨论&#xff0c;或其他大规模信息收集技术 头脑风暴 头脑风暴&#xff…

本地服务怎么发布成rpc服务

目录 1.引入 2.user.proto 3.userservice.cc 1.引入 example文件夹作为我们框架项目的使用实例&#xff0c;在example文件夹下创建callee和caller两个文件夹 callee是RPC服务的提供者。在callee创建一个文件&#xff1a;userservice.cc 我们有没有这样一个框架&#xff0c;把…

代码随想录算法训练营Day49|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; dp[i]为到当前位置i为止的最长递增子序列的长度&#xff0c;所以dp[nums.size()-1]并不一定是整个数组的最长递增子序列的长度。这里需要注意&#xff0c;但这个dp[i]怎么来的&#xff0c;我确实…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4162(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、SPI配置: 2)、时钟配置: 四、软件部分: 1)、主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : mai…

牛皮的程序猿后端返回值怎么定义

在后端接口封装中&#xff0c;我们一般都会对返回的数据做一个封装&#xff0c;以防止系统出现不可预期的数据结构和类型。比如这样&#xff1a; 结构体 1 {"success": true,"code": 200,"message": "成功","data": {&quo…

MinIO下载和安装(Windows)

1、MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 2、在本地硬盘中并新建一个minio文件夹 里面再创建bin文件夹和data文件夹 bin 用于存放下载的minio.exe data 用于存放数据 logs 用于存放日志 3、 编写启动脚本start.bat echo off echo [信息] 运行MinIO文服务…

群智优化:探索BP神经网络的最优配置

群智优化&#xff1a;探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到&#xff0c;而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征&#xff1a; 鸢尾花数据集包含了150个样本&#…

赶紧收藏!2024 年最常见的操作系统面试题(三)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见的操作系统面试题&#xff08;二&#xff09;-CSDN博客 五、操作系统中的文件系统是如何工作的&#xff1f; 操作系统中的文件系统是一套用于存储、组织和检索文件的系统。它提供了一种结构化的方式来管理存储设备上…

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”&#xff0c;已经渗透到几乎所有工业领域的核心环节&#xff0c;是现代产业之“魂”&#xff0c;是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能&#xff0c;可以帮助企业显著提升生产效率和质量&#…

鸿蒙开发系统基础能力:【@ohos.hiTraceMeter (性能打点)】

性能打点 本模块提供了追踪进程轨迹&#xff0c;度量程序执行性能的打点能力。本模块打点的数据供hiTraceMeter工具分析使用。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impor…

MySQL配置数据库允许大写字母

MySQL 5.7 默认是支持大写字母的&#xff0c;MySQL 8.0则默认不支持&#xff0c;数据库名称默认都是小写&#xff0c;即使输入了大写也会变成小写&#xff0c;如果你希望数据库名称允许大写字母&#xff0c;你可以修改 MySQL 的配置文件实现此操作&#xff1a; 操作步骤 在My…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

Dolphinscheduler Docker部署全攻略

作者| 陈逸飞 Docker部署的目的是在容器中快速启动部署Apache Dolphinscheduler服务。 先决条件 docker-composedocker 使用容器单机部署Dolphinscheduler 请下载源码包apache-dolphinscheduler--src.tar.gz&#xff0c;下载地址&#xff1a;下载 首先确定服务启动所需的…

记录一个Xshell使用中Xmanager...X11转发的提示问题

希望文章能给到你启发和灵感&#xff5e; 如果觉得有帮助的话&#xff0c;点赞关注收藏支持一下博主哦&#xff5e; 阅读指南 一、环境说明1.1 硬件环境1.2 软件环境 二、问题和错误三、解决四、理解和延伸一下 一、环境说明 考虑环境因素&#xff0c;大家适当的对比自己的软硬…

黑马程序员——Spring框架——day08——maven高级

目录&#xff1a; 分模块开发与设计 分模块开发的意义 问题导入模块拆分原则分模块开发&#xff08;模块拆分&#xff09; 问题导入创建Maven模块书写模块代码通过maven指令安装模块到本地仓库&#xff08;install指令&#xff09;依赖管理 依赖传递 问题导入可选依赖 问题导入…

现在还有人想做TIKTOK吗?

近几年大家都说tiktok不好做了&#xff0c;但为何仍有人愿意投身其中&#xff0c;这背后必然隐藏着巨大的商机。 面对激烈的市场竞争和变化无常的用户需求&#xff0c;我们该如何掌控其中的关键呢&#xff1f; 深入了解目标受众&#xff1a;所谓知己知彼&#xff0c;百战不殆…

国内镜像源网址

腾讯&#xff1a;腾讯软件源 (tencent.com) 阿里&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 清华&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror

数据结构与算法—空间复杂度详解与示例(C#,C++)

文章目录 1. 数据结构概述2. 空间复杂度的定义及影响因素3. 空间复杂度的区分常数空间复杂度&#xff08;O(1)&#xff09;线性空间复杂度&#xff08;O(n)&#xff09;其他空间复杂度 4. 几种典型数据结构的优缺点分析数组&#xff08;Array&#xff09;链表&#xff08;Linke…

10 种最佳编程字体

1.Commit Mono 这是我目前最喜欢的字体。这是我用来输入这篇文章的字体。作者 Eigil Nikolajsen 于 2023 年使用Fira Code和JetBrains Mono作为灵感开发了它。 Commit Mono 清晰易读&#xff0c;可配置性强。您可以根据粗细&#xff08;我更喜欢最细的 300&#xff09;、连字、…

联发科MT6775(Helio P70)_MTK6775处理器规格参数_处理器资料

联发科MT6775(Helio P70)采用了台积电12nm工艺制程八核处理器&#xff0c;由4颗 Arm Cortex-A73 2.1GHz 4颗Arm Cortex-A53 2.0GHz组成。其GPU为ARM Mali-G72 MP3&#xff0c;运行时高达900MHz&#xff0c;比上一代Helio P60效能提升了13%。 值得注意的是&#xff0c;联发科MT…