JDBC技术-1

JDBC: Java Database Connectivity         Java连接数据库技术

通俗点说,在Java代码中,使用JDBC提供的方法,可以发送字符串类型的SQL语句到数据库管理软件(Mysql,Oracle等),并且获取语句执行结果!进而实现数据库数据CRUD操作的技术!

  • jdbc 由 java 语言的规范(接口)和各个数据库厂商的实现驱动(jar)组成
  • jdbc 是一种典型的面向接口编程

一、 java获取数据库信息步骤:

Statement :(静态sql)

  1. 注册驱动
  2. 获取连接
  3. 创建发送 sql 语句对象
  4. 发送 sql 语句,并获取返回结果
  5. 结果集解析
  6. 资源关闭

PreparedStatement :(防止sql注入)

  1. 注册驱动
  2. 获取连接
  3. 编写sql
  4. 创建PreparedStatement 并且传入sql语句结构
  5. 占位符赋值
  6. 发送sql语句,并且获取结果
  7. 结果集解析
  8. 关闭资源
import java.sql.*;public class StatementQueryPart {public static void main(String[] args) throws SQLException, ClassNotFoundException {//1.注册驱动Class.forName("con.mysql.jc.jdbc.Driver");//2.获取连接String url="jdbc:mysql://localhost:3306/atguigudb";String user="root";String psd="123456";Connection connection = DriverManager.getConnection(url,user,psd);//3.创建statementStatement statement = connection.createStatement();//4.发送SQL语句String sql = "select * from t_user;";ResultSet resultSet = statement.executeQuery(sql);//5.结果集解析while(resultSet.next()){int id = resultSet.getInt("id");String account = resultSet.getString("account");String password = resultSet.getString("password");String nickname = resultSet.getString("nickname");System.out.println(id+"::"+account+"::"+password+"::"+nickname);}//6.关闭资源resultSet.close();statement.close();connection.close();}
}
1、获取数据库连接

getConnection(url,user,password) 方法介绍:

核心参数:

1.数据库软件所在的主机的ip地址:localhost | 127.0.0.1

2.数据库软件所在的主机的端口号:3306

3.连接的具体的库:atguigudb

4.连接的账号:root

5.连接的密码:123456

6.可选的信息 没有

String url:语法:jdbc:数据库管理软件名称[mysql,oracle]://ip地址|主机名:port端口号/数据库名?key=value&key=value 可选信息具体:jdbc:mysql://127.0.0.1:3306/atguigudbjdbc:mysql://localhost:3306/atguigudb本机的省略写法:如果你的数据库软件安装到本机,可以进一步省略jdbc:mysql://127.0.0.1:3306/atguigudb = jdbc:mysql:///atguigudb省略了[本机地址]和[3306默认端口号]强调:必须是本机,并且端口号使用3306方可省略 使用 ///String user: 数据库的账号    root
String password:数据库的密码    123456
2、获取返回结果,并处理结果集
SQL分类: DDL(容器创建,修改,删除)DML(插入,修改,删除)DQL(查询)DCL(权限控制)TPL(事务控制语言)参数:sql 非DQL返回:intDML 返回影响的行数参数:sql DQL    返回:resultSet 结果集封装对象
查询结果集解析  ResultSet
1、游标移动问题resultSet内部包含一个游标,指定当前行数据!默认游标指定的是第一行数据之前!我们可以调用next方法向后移动一行游标如果我们有很多行数据,我们可以使用 while(next){获取每一行数据}boolean = next() true:有更多数据,并且向下移动一行2、获取列的数据问题(获取光标指定的行的列的数据)resultSet.get(String columnLabel | int columnIndex); columnLabel:列名 如果有别名 写别名columnIndex:列的下角标获取 从左向右 从1 开始

示例: 

//5.结果集解析while(resultSet.next()){int id = resultSet.getInt(1);String account = resultSet.getString("account");String password = resultSet.getString(3);String nickname = resultSet.getString("nickname");System.out.println(id+"::"+account+"::"+password+"::"+nickname);}输出:
1::root::123456::经理
2::admin::666666::管理员
3、Statement 和 PrepareStatement

Statement 的缺点

不能防止SQL注入

PreparedStatement1、编写SQL语句结果 不包含动态值部分的语句,动态值部分使用占位符 ? 替代 注意:?只能替代动态值2、创建PreparedStatement,并且传入动态值3、动态值 占位符 赋值 ? 单独赋值即可4、发送SQL语句即可,并获取返回结果
//3、编写sqlString sql = "select * from t_user where account = ? and password = ?;";
//4、创建预备通道PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5、给预备通道 占位符赋值参数1:index 占位符的位置 从左向右数 从1开始参数2:Object 占位符的值 可以设置任何类型的数据,避免了我们拼接和类型更加丰富preparedStatement.setObject(1,user);preparedStatement.setObject(2,password);
//6.发送sqlResultSet resultSet = preparedStatement.executeQuery();

 4、自动遍历结果集
//5、处理结果集List<Map> result = new ArrayList<>();while(resultSet.next()){Map map = new HashMap();map.put("id",resultSet.getInt("id"));map.put("account",resultSet.getString("account"));map.put("password",resultSet.getString("password"));map.put("nickname",resultSet.getString("nickname"));result.add(map);}

可以看出我们在获取数据库信息时,需要知道数据库表的列名,假如换了一张表呢?

有没有那种智能一点的获取方法呢。

        //获取列的信息对象//TODO: metaData 装的当前结果集列的信息对象!(它可以获取列的名称根据下角标,可以获取列的数量)ResultSetMetaData metaData = resultSet.getMetaData();//有了它以后,我们可以水平遍历列int columnCount = metaData.getColumnCount();while(resultSet.next()){Map map = new HashMap();for (int i = 1; i <= columnCount; i++) {//获取指定列下角标的值!Object value = resultSet.getObject(i);//获取指定列下角标的名称!//getColumnLabel:会获取别名,如果没有写别名才是列的名称 //不要使用 getColumnName:只会获取列的名称String columnLabel = metaData.getColumnLabel(i);map.put(columnLabel,value);}result.add(map);}
5、自增长主键回显实现

功能需求:

1、java 程序获取插入数据时 mysql 自增长维护的主键 id 值,这就是主键回显

2、作用:在多表关联插入数据时,一般主表的主键是自动生成的,所以在插入数据之前无法知道这个条数据的主键,但是从表需要在插入数据之前就绑定主表的主键,这是可以使用主键回显技术

import org.junit.Test;import java.sql.*;public class PSOtherPart {/*** TODO:*      t_user插入一条数据!并且获取数据库自增长的主键!* TODO:使用总结*      1、创建prepareStatement的时候,告知,携带回数据库自增长的主键(sql,Statement.RETURN_GENERATED_KEYS)*      2、获取司机(preparedstatement)装主键值的解果集对象,
一行一列,获取对应的数据即可*      ResultSet resultSet = statement.getGenerateKeys();**/@Testpublic void returnPrimaryKey() throws Exception{//1、注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2、获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigudb", "root", "123456");//3、编写SQL语句String sql = "insert into t_user(account,password,nickname) values(?,?,?)";//4、创建statementPreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);//5、占位符赋值statement.setObject(1,"test3");statement.setObject(2,"123456");statement.setObject(3,"懒洋洋");//6、发送sql语句,并且获取结果int i = statement.executeUpdate();//7、结果解析if(i > 0){System.out.println("数据插入成功!");//可以获取回显主键//获取司机装主键的结果集对象,一行 一列 id = 值ResultSet resultSet = statement.getGeneratedKeys();resultSet.next();//移动一下光标int id = resultSet.getInt(1);System.out.println("id = " + id);}else{System.out.println("数据插入失败!");}}
}输出:
数据插入成功!
id = 1
使用总结
1、创建prepareStatement的时候,告知,携带回数据库自增长的主键(sql,Statement.RETURN_GENERATED_KEYS)
2、获取司机(preparedstatement)装主键值的解果集对象,一行一列,获取对应的数据即可
ResultSet resultSet = statement.getGenerateKeys();

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

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

相关文章

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

Linux-笔记 uboot修改设备树

1. FDT介绍 扁平设备树&#xff08;Flattened Device Tree&#xff0c;FDT&#xff09;&#xff0c;也叫平坦设备树&#xff0c;是设备树的一种二进制表示形式&#xff0c;提高了在嵌入式系统中的传输和解析效率&#xff1b; 2. 在U-Boot中使用FDT 2.1. 进入U-Boot 开发板上…

基于无监督学习算法的滑坡易发性评价的实施(k聚类、谱聚类、Hier聚类)

基于无监督学习算法的滑坡易发性评价的实施 1. k均值聚类2. 谱聚类3. Hier聚类4. 基于上述聚类方法的易发性实施本研究中的数据集和代码可从以下链接下载: 数据集实施代码1. k均值聚类 K-Means 聚类是一种矢量量化方法,最初来自信号处理,旨在将 N 个观测值划分为 K 个聚类,…

如何把逻辑地址转换为物理地址

​ 使用系统架构设计师真题说明&#xff08;2021年&#xff09;某计算机系统页面大小为 4K&#xff0c;进程 P1 的页面变换表如下图示&#xff0c;看 P1 要访问数据的逻辑地址为十六进制 1B1AH&#xff0c;那么该逻辑地址经过变换后&#xff0c;其对应的物理地址应为十六进制&…

【记录42】centos 7.6安装nginx教程详细教程

环境&#xff1a;腾讯云centos7.6 需求&#xff1a;安装nginx-1.24.0 1. 切入home文件 cd home 2. 创建nginx文件 mkdir nginx 3. 切入nginx文件 cd nginx 4. 下载nginx安装包 wget https://nginx.org/download/nginx-1.24.0.tar.gz 5. 解压安装包 tar -zxvf nginx-1.24.0.…

使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画 引言准备工作效果展示代码结构代码解析第一部分&#xff1a;导入库和设置基本参数第二部分&#xff1a;流体类定义MyFluidDataConfig 类详解MyFluidData 类详解my_update 方法详解流体类定义完整代码 第三部分&#xff1a;太…

c++11 lambda 捕获,匿名,返回类型后置

lambda就是即写即用的匿名函数&#xff0c;可以用于解决匹配函数参数的问题 int main(int argc,char *argv[]) {vector<int> v{1,2,3,4,5,6,7,8};for_each(v.begin(),v.end(),[](int a){cout<<a;});return 0; } for_each是固定函数&#xff0c;我们需要他但是又没…

如何使用IdeaJ2023创建一个JavaWeb项目

开篇 简单整理一下创建JavaWeb项目的步骤&#xff0c;希望能对您有所帮助。 步骤图解 步骤一: 创建项目 此时得到的项目是如图所示的普通Java项目&#xff1a; 步骤二: 在项目中增加web文件夹 点击File -> Project Structure 点击Project Setting -> Modules -> …

Android 10.0 Launcher3定制folder文件夹2x2布局之一xml文件配置和解析相关属性

1.前言 在10.0的系统rom产品定制化开发中,在对Launcher3的folder文件夹功能定制中,要求folder文件夹跨行显示,就是 2x2布局显示,默认的都是占1格的,现在要求占4格显示,系统默认是不支持显示4格的,所以接下来需要分析相关的 功能,然后来实现这个功能 2.Launcher3定制fo…

PMP考试不用报班可以自学?

随着近年来PMP证书在国内越来越受欢迎&#xff0c;越来越多的人开始报考PMP考试&#xff0c;甚至不少企业还会通过各种奖励政策来鼓励内部项目骨干去考取PMP证书。许多第一次参加PMP考试的人会有这样的疑问&#xff0c;那就是考PMP证书是否必须参加培训班呢&#xff1f;还是说可…

C程序内存分布及static变量

C程序内存分布及static变量 C语言中程序的内存分布 [&#x1f517;1](https://www.cnblogs.com/miaoxiong/p/11021827.html)[&#x1f517;2](https://blog.csdn.net/chen1083376511/article/details/54930191)c/c编译连接后二进制文件的存储动静态存储方式和存储区动态存储方式…

proteus使用问题

1、无法和视频里面一样新建工程 2、实验效果和视频不也一样 自己的电路图(灯不亮)&#xff1a;