目录

  • 1. 说明
  • 2. JDBC的由来以及定义
  • 3. JDBC体验,statement.executeQuery() 查询
  • 4. 整理和释放
  • 5. 封装JDBCUtils
  • 6. 增删改 —— executeUpdate()
  • 7. 字符编码问题
  • 8. PreparedStatement和问号占位符
  • 9. 最终Demo说明
  • 10. 对象的封装,重构代码, 学生管理系统模块化编程

1. 说明

用Java语言操作Mysql,首先需要学习Mysql

安装教程详见:一、安装、连接以及配置MySQL
Mysql基础教程详见:「MySQL」从零到删库

2. JDBC的由来以及定义

JDBC是什么?

  • Java数据库连接(Java Database Connectivity)简称JDBC
  • JDBC是Java操作各数据库的一种规范,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC是面向关系型数据库的

打个比方?

  • 假设Java公司是布料厂,那么各SQL数据库公司就是服装设计厂
  • Java公司规定JDBC接口,允许去操作各数据库,相当于提供原材料
  • 各SQL公司去实现接口,相当于拿原材料设计出自己的服装

3. JDBC体验,statement.executeQuery() 查询

首先要导入MySQL jar包,其相当于物流公司,将布料厂的原材料运输到服装设计厂里,让服装厂设计

Java MySQL Connector/J 包下载详见:MySQL Connector/J


下载好的jar包拖入lib文件夹下

引入jar包并导入库中

连接数据库并创建一个Info

创建JDBCDemo类写入代码,导入包所用到的方法都是在 java.sql里的,import java.sql.*

4. 整理和释放

规范代码

public class JDBCDemo01 {public static final String URL = "jdbc:mysql://127.0.0.1:3306/student";public static final String USER = "root";public static final String PASSWORD = "xxxxxx";public static final String DRIVER = "com.mysql.jdbc.Driver";public static Connection connection;public static Statement statement;public static ResultSet resultSet;public static void main(String[] args) {try {//1.加载驱动程序,给布料厂打电话,我是mysql公司的Class.forName(DRIVER);//2.获得数据库的连接,告诉物流具体走什么路线connection = DriverManager.getConnection(URL, USER, PASSWORD);//3.获取数据库操作对象,货送到了,然后卸货到仓库statement = connection.createStatement();//4.从仓库中筛选出要用的货,查询Sql语句resultSet = statement.executeQuery("SELECT * FROM info");            while (resultSet.next()){int id = resultSet.getInt(1);String name = resultSet.getString(2);int age = resultSet.getInt(3);System.out.println("[" + id + ","+ name+ "," + age + "]");}//5.完成所有操作,关闭结果,关闭仓库,再关闭数据库连接} catch (Exception e) {e.printStackTrace();}finally {try {resultSet.close();statement.close();connection.close();} catch (Exception e) {e.printStackTrace();}}}
}

5. 封装JDBCUtils

如果每次查询都要重新写配置文件是件很麻烦的事,可以将配置文件封装起来,在src下创建db.properties配置文件,写入配置项

创建com.google.util包,创建JDBCUtils

public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;//静态代码,做预处理static {try {//JDBCUtils.class.getClassLoader()//读取配置文件InputStream inputStream = ClassLoader.getSystemResourceAsStream("db.properties");//加载对象Properties properties = new Properties();properties.load(inputStream);//读取配置项url = properties.getProperty("url");user = properties.getProperty("user");password = properties.getProperty("password");driver = properties.getProperty("driver");} catch (Exception e) {e.printStackTrace();}}//4.测试是否加载成功public static void init(){System.out.println("加载成功");}//5.创建单例,获取配置项public static Connection getConnection() throws SQLException{return DriverManager.getConnection(url, user, password);}//6.释放,关闭结果,关闭仓库,关闭数据库连接public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {if (resultSet != null){resultSet.close();}if (statement != null){statement.close();}if (connection != null){connection.close();}}public static void close(Connection connection, Statement statement) throws SQLException {if (statement != null){statement.close();}if (connection != null){connection.close();}}
}

创建测试类,测试能否加载JDBCUtils

6. 增删改 —— executeUpdate()

确认获取数据库连接和操作对象信息

只有查询是executeQuery(),增删改都是executeUpdate()

运行代码查看数据库已经插入成功

更新或者删除,也是同理

运行代码查看数据库已经更新成功

    public void UpdateTest(){try {//1.获取数据库连接和操作对象connection = JDBCUtils.getConnection();statement = connection.createStatement();//2.更新一条数据String sql = "update info set name ='Pig' where id = 4";int res = statement.executeUpdate(sql);//3.判断数据是否更新成功if (res != 0){System.out.println("Update success");}} catch (Exception e) {e.printStackTrace();} finally {try {//4.调用重载方法,关闭仓库和数据库连接JDBCUtils.close(connection, statement);} catch (SQLException e) {e.printStackTrace();}}}

7. 字符编码问题

如果插入中文时乱码怎么办?

  • 字符编码问题,需要更改数据库、IDE、终端的编码格式为UTF-8,在配置项中添加字符编码


url = jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8
user = root
password = xxxxxx
driver = com.mysql.jdbc.Driver

参考:2.6 修改数据库字符编码

8. PreparedStatement和问号占位符

如果要求用户输入数据,需要用户手动编写sql语句吗?

  • 不需要,用PreparedStatement就可以

PreparedStatement是什么?

  • PreparedStatement是预编译的,可以简化执行查询或者更新数据表数据,对于批量处理可以大大提高效率,也叫JDBC存储过程
  • public interface PreparedStatement extends Statement;

Statement和PreparedStatement的区别?

  • 使用Statement需要进行拼写SQl语句
        resultSet = statement.executeQuery("SELECT * FROM info");while (resultSet.next()){int id = resultSet.getInt(1);String name = resultSet.getString(2);int age = resultSet.getInt(3);System.out.println("[" + id + ","+ name+ "," + age + "]");}
  • 使用PreparedStatementStatement的子接口,可以传入带占位符的SQL语句,提供了补充占位符变量的方法,preparedStatement()要求写入sql语句
preparedStatement = connection.prepareStatement(sql);
package com.company;
import com.google.util.JDBCUtils;
import org.junit.Test;
import java.util.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;/*** @author:Yeats* @description:* @date: 4/4/2022* @time: 4:35 PM*/
public class JDBCDemo03 {public static Connection connection;public static PreparedStatement preparedStatement;public static void main(String[] args) {try {//1.获取数据库连接和操作对象connection = JDBCUtils.getConnection();//2.用户输入信息,使用占位符的sql语句,更新一条数据String sql = "INSERT INTO info(name, age) values(?, ?)";System.out.println("请先输入姓名,再输出年龄,用回车隔开:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int age = scanner.nextInt();//3.preparedStatement传入带占位符的sql语句,set方法设置每一个位置的值,并执行更新操作preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, name);preparedStatement.setInt(2, age);int res = preparedStatement.executeUpdate();//4.判断数据是否更新成功if (res != 0){System.out.println("Update success");}} catch (Exception e) {e.printStackTrace();} finally {try {//5.调用重载方法,释放资源JDBCUtils.close(connection, preparedStatement);} catch (SQLException e) {e.printStackTrace();}}}
}

注意,parameterindex是指传入问号的下标

同时需要更改配置文件JDBCUtils类中的StatementPreparedStatement

package com.google.util;import javax.swing.*;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** @author:Yeats* @description:* @date: 4/4/2022* @time: 9:30 AM*/
public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;//静态代码,做预处理static {try {//JDBCUtils.class.getClassLoader()//读取配置文件InputStream inputStream = ClassLoader.getSystemResourceAsStream("db.properties");//加载对象Properties properties = new Properties();properties.load(inputStream);//读取配置项url = properties.getProperty("url");user = properties.getProperty("user");password = properties.getProperty("password");driver = properties.getProperty("driver");} catch (Exception e) {e.printStackTrace();}}//4.测试是否加载成功public static void init(){System.out.println("加载成功");}//5.创建单例,获取配置项public static Connection getConnection() throws SQLException{return DriverManager.getConnection(url, user, password);}//6.释放资源,关闭结果,关闭仓库,关闭数据库连接public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) throws SQLException {if (resultSet != null){resultSet.close();}if (preparedStatement != null){preparedStatement.close();}if (connection != null){connection.close();}}public static void close(Connection connection, PreparedStatement preparedStatement) throws SQLException {if (preparedStatement != null){preparedStatement.close();}if (connection != null){connection.close();}}
}

运行成功


如果要执行查询操作,需要将excuteUpdate()改成excuteQuery(),大体上与Statement形式相同

9. 最终Demo说明

最好一次性学完,做好准备,头脑清晰再去学

10. 对象的封装,重构代码, 学生管理系统模块化编程

项目源代码下载详见:面向对象大胆向前!Java API实战-视频和资料-Frank

IDEA导入有jar包的Java项目(版本2019.3.2),点击import


找到项目的位置,点OK

选择从已存在的源文件创建项目

确认项目名称与路径

已找到项目的源文件,请选择被添加到项目的根中,确认项目根目录


检查导入的jar包,并勾选jar包

审查建议的项目模块结构。在此阶段,您可以设置模块名称,从项目中排除特定模块,合并或拆分单个模块。所有模块之间的依赖关系都将自动更新,就像库中的依赖项一样


查看项目结构,手动导入所有jar包


直接运行项目会抛出SQL异常,需要更改db.properties代码,将localhost改成127.0.0.1:3306

url = jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8
user = root
password = xxxxxx
driver = com.mysql.jdbc.Driver

9:JDBC-Java API 实战相关推荐

  1. 面向对象大胆向前 Java API 实战

    目录 0:Base API 引言 API的定义和用处 Scanner Number Math Random ThreadLocalRandom Date DateFormat和SimpleDateFo ...

  2. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

    MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...

  3. java search 不能使用方法_ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程

    前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...

  4. Elastic Search Java API(文档操作API、Query DSL查询API)、es搜索引擎实战demo

    elastic search实战小demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es 之前在 Elastic ...

  5. jdbc mysql api_JDBC---一种用于执行SQL的Java API

    JDBC是一种用于执行SQL的Java API,它本身是个商标名,但很多人把它认为是Java Database Connectivity(Java 数据库连接)的缩写. JDBC是一组访问数据库的AP ...

  6. 《Hadoop MapReduce实战手册》一2.8 使用HDFS的Java API

    本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第2章,第2.8节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨卓 ...

  7. 【Java项目实战】在线音乐播放器(从需求到产品完整解析)

    准备工作必看:[Java项目实战]在线音乐播放器(前期准备) 核心功能 登录.注册 上传音乐 删除某一个音乐信息 删除选中的音乐信息 查询音乐(包含查找指定/模糊匹配的音乐) 添加音乐到"喜 ...

  8. 《Java 8 实战》(二)—— Lambda

    Lambda表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表/函数主体/返回类型,可能还有一个可以抛出的异常列表. Lambda表达式由参数/箭头和主体组成: (App ...

  9. MyBatis——Java API

    Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDB ...

  10. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

最新文章

  1. Git与Svn的区别—笔记1
  2. 线程技术 ☞ Future模式
  3. java 泛型小小的测试题
  4. 仿真模拟,需要注意这几点!
  5. 理解AES加密解密的使用方法
  6. 二叉树 的建立及遍历 过程
  7. 810B - 牛人是如何工作的
  8. bzoj 1642: [Usaco2007 Nov]Milking Time 挤奶时间(DP)
  9. Swarm基于多主机容器网络-overlay networks 梳理
  10. jboss linux环境部署,linux下部署jboss
  11. dell 如何给raid分区_Dell服务器如何进行RAID级别在线转换及RAID扩容
  12. 829-信息检索教程【考点汇总】
  13. 请绘制计算机串行通信原理图,单片机实验报告格式6
  14. 日文输入键盘罗马字对应表
  15. WeChat楼梯导航
  16. Fabled Rooks UVA - 11134 
  17. js项目中常见util方法
  18. 关于学习js的一些命令行
  19. 高通win10电脑软件兼容测试,微软把高通处理器装在了Win 10上,那又怎样呢?
  20. C语言实现100的阶乘

热门文章

  1. 计算机硬件系统(一)—计算机硬件系统的组成
  2. 青海大学市计算机科学与技术,曹腾飞 - 青海大学 - 计算机技术与应用系
  3. js ajax同步请求造成浏览器假死的问题
  4. 区块链单笔交易字段解释
  5. SEO内部优化与SEO外部优化
  6. 魔百盒CM201-1,YS代工-免拆-线刷固件及教程
  7. 受美国法律保护美国妞_为什么美国法律有效地要求所有软件设计都要响应
  8. c语言课英语单词,课程英语单词大全:英语单词32个课程加翻译
  9. linux中进程unit是什么意思,linux---systemd进程
  10. snapchat_如何截屏和共享Snapchat快照