文章目录

  • 一、JDBC编写步骤
  • 二、数据库连接——Connection
    • 2.1 连接要素
      • 2.1.1 Driver接口实现类
      • 2.1.2 URL
      • 2.1.3 用户名和密码
    • 2.2 建立连接
      • 2.2.1 改进
  • 三、数据库操作——Statement
    • 3.1 Statement简介
    • 3.2 使用Statement进行数据更新
      • 3.2.1 简单更新
      • 3.2.2 通用更新操作的实现
    • 3.3 ResultSet获取查询结果
      • 3.3.1 简单查询
      • 3.3.2 通用查询操作的实现

一、JDBC编写步骤

ODBC(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的。使用者在程序中只需要调用ODBC,由ODBC驱动程序将调用转换成对特定数据库的调用请求

二、数据库连接——Connection

2.1 连接要素

2.1.1 Driver接口实现类

在pom.xml中maven导入依赖:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version>
</dependency>

MySQL5↓:用com.mysql.jdbc.Driver的Driver实现类

MySQL5↑:用com.mysql.cj.jdbc.Driver的Driver实现类

2.1.2 URL

驱动程序管理器通过URL选择正确的驱动程序以建立数据库连接

通常为:协议:子协议:子名称【例:jdbc:mysql://localhost:3306/database1】

  • 协议:JDBC的URL就是jdbc
  • 子协议:用于标识数据库驱动程序
  • 子名称:用于标识数据库的方法。用于定位数据库,其中包含主机名(服务端的ip地址),端口号数据库名

MySQL8.0连接时需要指定时区以及是否进行SSL连接,例:jdbc:mysql://localhost:3306/zlr?serverTimezone=GMT&useSSL=false

2.1.3 用户名和密码

数据库的用户名和密码,可以封装在Properties中

2.2 建立连接

// 加载Driver
Driver driver = new com.mysql.cj.jdbc.Driver();
// 基本信息:URL
String url = "jdbc:mysql://localhost:3306/zlr?serverTimezone=GMT";
// 基本信息:用户名,密码
Properties properties = new Properties();
properties.setProperty("user","root");
properties.setProperty("password","password");
// 获取连接
Connection connection = driver.connect(url,properties);

2.2.1 改进

  • 不指定具体使用的数据库Driver,修改Driver的时候不用修改源码,用反射读取配置文件来生成对应的Driver
Class driverClass = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) driverClass.getDeclaredConstructor().newInstance();
  • 通过注册驱动的方式,用DriverManager包装Driver并获取连接
// 注册Driver
DriverManager.registerDriver(driver);
String url = "jdbc:mysql://localhost:3306/zlr?serverTimezone=GMT";
String user = "root";
String password = "password";
// 获取连接
Connection connection = DriverManager.getConnection(url,user,password);
  • 只加载驱动,不需显式地注册驱动

    原因:com.mysql.cj.jdbc.Driver源码中的静态代码块已经执行了注册驱动的操作

// 加载Driver
Class.forName("com.mysql.cj.jdbc.Driver");
// 基本信息
String url = "jdbc:mysql://localhost:3306/zlr?serverTimezone=GMT";
String user = "root";
String password = "password";
// 获取连接
Connection connection = DriverManager.getConnection(url,user,password);
  • 将配置信息写入配置文件中通过读取获得
// 读取配置文件
InputStream is = this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(is);
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driverClassStr = properties.getProperty("driverClass");
// 加载驱动
Class driverClass = Class.forName(driverClassStr);
Connection connection = DriverManager.getConnection(url,user,password);

三、数据库操作——Statement

3.1 Statement简介

在java.sql包下有三个接口定义了对数据库调用的不同方式:

  • Statement:用于执行静态SQL语句并返回它所生成结果的对象

弊端:需要拼写sql语句,存在SQL注入的问题

例:String sql = “SELECT user,password FROM user_table WHERE USER = ‘’”+user+“’ AND password = '”+password+“‘;’”

​ 在输入user和password后,拼接过程中可以注入SQL语句截断某些判断条件达成恒等式完成登录

为避免上述问题可以使用PreparedStatement取代Statement进行使用

  • PreparedStatement:SQL语句被预编译并存储在此对象中,可使用此对象多次高效地执行该语句

    • 能操作Blob数据,Statement做不到
    • 可实现更高效的批量操作
  • CallableStatement:执行SQL存储

3.2 使用Statement进行数据更新

3.2.1 简单更新

// 待执行的sql语句 ?:占位符
String sql = "insert into users(name,password)values(?,?)";
// 使用前面获得的Connection对象,预编译sql语句,返回PreparedStatement的实例
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 填充占位符        【索引从1开始】
preparedStatement.setString(1,"User1Name");
preparedStatement.setString(2,"User1Password");
// 执行操作
preparedStatement.execute();
// 关闭资源
preparedStatement.close();
connection.close();

3.2.2 通用更新操作的实现

若想使用多种不同的更新语句更新数据:

delete from users where id = ?

update users set name = ? , password = ? where id =

insert into users (name,password) values( ? , ? )

可以使用如下方法实现通用的查询操作:

public void update(String sql,Object ... args) {Connection connection = null;PreparedStatement preparedStatement = null;try {// 获取Connection【省略】preparedStatement = connection.prepareStatement(sql);for (int i = 0; i < args.length; i++) {// 根据输入参数的多少填充占位符preparedStatement.setObject(i+1,args[i]);}preparedStatement.execute();} catch (SQLException e) {e.printStackTrace();}finally {// 执行资源关闭操作【省略】}
}

3.3 ResultSet获取查询结果

3.3.1 简单查询

创建的数据库的数据有三个属性,分别是id(int),name(varchar(127)),password(varchar(255))

新建一个User类将数据封装成对象,含有id,name,password三个属性,根据返回的ResultSet将其填充

// ?:占位符
String sql = "select * from users where name = ? ";
// 预编译sql语句,返回PreparedStatement的实例
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 填充占位符【注意索引从1开始】
preparedStatement.setString(1,"zlr");
// 执行并返回结果集
ResultSet resultSet = preparedStatement.executeQuery();
// 处理结果集
// next():若下一条有数据则返回true,指针下移;若下一条无数据则返回false
if(resultSet.next()){int userId = resultSet.getInt(1);String userName = resultSet.getString(2);String userPassword = resultSet.getString(3);//封装成对象User u = new User(userId,userName,userPassword);System.out.println(u);
}
// 关闭资源
preparedStatement.close();
connection.close();
resultSet.close();

3.3.2 通用查询操作的实现

若想使用多种不同的查询语句查询数据:

select id,name from users where name = ?

select name from users where id = ?

select id from users where name = ? and password = ?

可以使用如下方法实现通用的查询操作:

User类对应的属性必须与数据库中表的属性名相同

若要查询多行可以考虑使用while+集合的方式

public User queryForUsers(String sql,Object ... args){Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {// 获取Connection【省略】preparedStatement = connection.prepareStatement(sql);for (int i = 0; i < args.length; i++) {// 根据输入参数的多少填充占位符preparedStatement.setObject(i+1,args[i]);}resultSet = preparedStatement.executeQuery();// 获取ResultSet的元数据ResultSetMetaData rsmd = resultSet.getMetaData();// 获取ResultSet的列数int columCount = rsmd.getColumnCount();if(resultSet.next()){// 先用空参构造器生成User对象,之后将获取到的属性使用set方法填充User u = new User();// 处理结果集一行数据的每个列for (int i = 0; i < columCount; i++) {// 获取当前列的值Object columnValue = resultSet.getObject(i+1);// 获取当前列的列名String columnName = rsmd.getColumnName(i+1);// 通过反射,给User对象指定的columnName属性赋值为columnValueField field = User.class.getDeclaredField(columnName);field.setAccessible(true);field.set(u,columnValue);}return u;}} catch (SQLException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}finally {// 执行资源关闭操作【省略】}return null;}

上述方法中使用getColumnName()的方式获取列名,再使用反射来设置属性,存在局限性

当表的字段名与类的属性名不一致时:

1.声明sql时,使用类的属性名来命名字段的别名

​ 例如:表的字段名:user_id,user_name,user_password 类的属性名:id,name,password

​ 则应使用:select user_name name, user_password password from users where user_id = 1 ;

2.使用getColumnLable()方法代替getColumnName()

​ 作用:获取当前列的别名:若无别名则获得当前列的列名

【JDBC】连接MySQL数据库实现增删改查相关推荐

  1. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  2. DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试

     概念介绍 JDBC JDBC(Java数据库连接,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC ...

  3. jdbc mysql增删改查_使用JDBC连接MySQL数据库操作增删改查

    更多精彩内容欢迎访问我的个人博客皮皮家园:http://www.zhsh666.xyz或者http

  4. C#语言连接Mysql数据库实现增删改查

    C#语言连接Mysql数据库实现增删改查 实现效果如图 在此之前先下载一个mysql.dll 库 如下 链接:https://pan.baidu.com/s/17Nv_1W3KbXfWgdOvWf_S ...

  5. jdbc如何对mysql数据库进行查询_【转载】通过JDBC对MySQL数据库的增删改查

    目录 前言:什么是JDBC 维基百科的简介: Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接 ...

  6. c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查

    这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...

  7. Python项目:学生管理系统连接MySQL数据库(增删改查、排序、统计、显示所有信息)

    文章目录 一程序功能(Function) 1. 功能概述 2. 思维导图 二.开始实践 战前准备 定义学生管理系统菜单 定义主函数 1.录入学生信息 2.查找学生信息 3.删除学生信息 4.修改学生信 ...

  8. C#通过VS连接MySQL数据库实现增删改查基本操作

    创建一个数据库wsq 里面有一张beyondyanyu表 表里面有id(int).names(varchar).count(int).passwords(varchar) 数据可以自己添 1.导入My ...

  9. Python实现连接Mysql数据库实现增删改查

    1.查看已安装的Python驱动 在windows的dos窗口中输入pip list查询已安装的Python驱动. 2.如未安装,进行下载Python的PyMySQL驱动 在windows的dos窗口 ...

最新文章

  1. HTML5--sessionStorage、localStorage、manifest
  2. Load和Initialize的往死了问是一种怎样的体验
  3. 链内容百度新算法怎样判断高质量外链和原创内容
  4. python三级字典_python_三级字典
  5. ML.NET 0.10特性简介
  6. java实现log4j_log4j在java中实现
  7. Spring Boot 集成 Elasticsearch 实战
  8. MacOS录屏OBS+Loopback配置方法
  9. opencv画框返回坐标 python_20行Python代码实现视频字符化
  10. 20天涨幅600%!深交所:天山生物或涉嫌新型股价操纵行为
  11. mac模式怎样构造在jsp中_mac下tomcat的配置和jdk的设置 jsp的初级知识
  12. java文件写入_java怎么写入文件
  13. 用Python合并多个txt文件
  14. Arduino USBASP烧录之ICSP模式
  15. Oracle 18c十大新特性
  16. echarts中如何设置geo3D地图背景图片,以及geo3D中如何使用effectScatter属性
  17. 一根均线选股法_一根均线选股法视频教程
  18. 实现带附件格式的业务服务质量周报邮件
  19. 【整活】修改U盘的图标,让你的U盘与众不同
  20. 学习机器学习的最佳路径是什么

热门文章

  1. .net 微信表情应用
  2. EXTJS开发过程遇到的一些问题的小结(转自麦田守望者)
  3. [NGUI]NGUI中的九宫格切图模式
  4. 企业风险管理的四种模式五种策略分别是什么?
  5. 环境和社会风险分类c类_企业经营风险的定义、种类以及基本分类
  6. 转载:16种鲜鱼的做法
  7. 树莓派操控SG90舵机
  8. 用P、V操作解决进程同步问题的解题步骤
  9. 元素滚动 scroll 系列
  10. 如何关闭迅雷极速版的升级提示