目录
一、JDBC介绍
二、使用方法(以MySQL为例)
(1)MySQL的jar包,导入到IDEA
(2)使用代码,操作数据库
1)设置数据源
1.创建MysqlDataSource对象,使用set方法
2.关于set...()方法的填写
1* setURL()
2* setUser()
3* setPassword()
2)和数据库建立网络连接
3)使用程序构造SQL语句
4)关闭资源
三、JDBC操作数据库的补充
1.数据的插入
*1 .字符串拼接——不安全
*2.statement.setXXX()——推荐
2.数据的查询
3.JDBC学习的重要性
一、JDBC介绍
全称:Java DataBase Connectivity——java数据库连接
我们知道数据库厂商有很多,比如Oracle 、IBM 、MySQL、SAP。
不同的厂商都有数据自己较为独特的API。
什么是API?
API——(Application Programming Interface,应用程序编程接口,简称接口)
是一组定义了软件组件之间交互方式的规范。
它允许不同的软件系统之间进行通信和交互,使得开发者可以利用已有的功能和服务来构建自己的应用程序。
比如说咱们最熟悉的:
JAVA标准库中,提供的各种类以及类中的各种方法(PriorityQueue等),就是API。
因为是不同的厂商,他们构建的API都是不一样的。
这就导致,如果操作不同数据库,程序猿就要重新学习一套新的语法,这样就大大提高了学习成本。
为了避免这种情况,JAVA的公司(现在是Oracle公司的一部分)规定了一套规范的API,让其他的数据库厂商去遵守。
程序猿只要学会JDBC这一套API,就可以操作各种厂商的数据库了。
为什么数据库厂商那么听话?——因为JAVA市场份额很大,他是老大。
二、使用方法(以MySQL为例)
(1)MySQL的jar包,导入到IDEA
教程见连接:
(2)使用代码,操作数据库
在上面jar文件导入到IDEA后,就可以使用JAVA代码操作数据库了。
1)设置数据源
1.创建MysqlDataSource对象,使用set方法
简单来讲就是new一个MysqlDataSource的类,
使用该类的setURL()、setUser()、setPassword()方法,
分别设置好要连接的那个数据库、数据库使用者、数据库的密码:
注意:URL和Url都可以:
如图,只要把红色波浪线的空格填好,这一步就完成了。
除了以上这种方式调用set方法,还有另一种常见的方式调用set方法:
这种创建方式就比较简介,好理解。
这两种创建方法褒贬不一,很难说谁好谁坏。
为什么?
想要了解为什么,需要直到什么是耦合、什么是内聚:
支持方式一的人认为:
虽然代码看起来有点繁杂,类型转来转去的。
但是这种写法耦合程度更高,以后代码修改的成本会小。
因为实际的类型是父类DataSource,看不到MysqlDataSource类中的相关方法。
所以在后序代码中,不用关心是使用的那个类型的数据库,这样就使得后序代码可以和MySQL解耦合了。
不过我个人认为,开发途中更换数据库是一个频率很低的事情,即使要更改,考量的范围和要做出的调整也有很多,不是十几行代码就可以完成的。
支持方式二的人认为:
虽然第二种方式耦合程度变得低了,但是代码更加简洁易读啊。
更何况更改数据库是及其少数的情况,大部分情况写第二种都是非常不错的。
以上两种创建方式,见仁见智,不过两种方式都要掌握。
说我了创建,那么set...()方法中的括号如何填写呢?
2.关于set...()方法的填写
1* setURL()
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/testjdbc?characterEncoding=utf8&useSSL=false");
URL是资源资源占位符的缩写*(Uniform Resource Locator)
用来表述网络上某一个资源的位置(类似于网址)
数据库可以理解为一种网络资源(客户端——服务器的结构)
URL具有相对固定的格式:
jdbc:mysql
描述了url的用途是什么?——是给jdbc的mysql使用的
127.0.0.1
IP地址,代表mysql服务器所在主机的位置
3306
叫做端口号。
端口号是用来区分一个主机上的不同应用程序的。
比如点脑上有酷狗、QQ音乐、网易云音乐,这是发来网络数据,想要把数据给到那个程序,就要用端口号来做区分。
MySQL默认安装的端口号是3306
testjdbc
它是我之前就创建的一个数据库的名字
characterEncoding=utf8
说明数据库指定的字符集是那种。
useSSL=false
代表资源是否需要加密
等于false代表把加密关掉(因为咱们的数据库不值钱,所以咱们的数据库很安全,被必要加锁)。
设置URL很重要,一步都不能错,不然后续会出问题。
2* setUser()
dataSource.setUser("root");
“root”代表管理员身份。
3* setPassword()
dataSource.setPassword("1111");
填入的字符串就是安装MySQL时,设置的数据库密码。
2)和数据库建立网络连接
通过刚才创建的对象,使用getConnection()方法:
Connection connection=dataSource.getConnection();
但是,我们直接使用这个方法,会抛出一个异常:
SQLException是一个受查异常,我们直接alt+enter抛出即可。
这样与数据库进阿里了网络连接:
关于JAVA中的异常详细介绍,知识回顾请看:JAVA中的异常
3)使用程序构造SQL语句
我们以插入一个数据行为例,这是我们stuent表的结构(id,name):
表的内容:
构造SQL语句分为两步:
1.通过字符串把代码输入(语句的分号可加可不加)
2.对代码进行预编译(预编译在MySQL服务器上也可以进行,不过为了提高性能还是在客服端上把他解析了),然后上传到服务器上执行。
//3、使用程序构造SQL语句//输入SQL语句 String sql="insert into student values(3,'王五')";//对sql语句进行预编译PreparedStatement statement=connection.prepareStatement(sql);//放到服务器执行预编译好的语句statement.executeUpdate();
注意:
只要SQL语句不是查找(是更新数据),就用statement.executeUpdate()。
如果是SQL查找,用statement.executeQuery()。
4)关闭资源
先创建的后关闭:
三、JDBC操作数据库的补充
1.数据的插入
数据库插入数据的写法不一定要想上面介绍的那样,把数据写死在代码里。
还有两种书写方式:
两种方式,都可以用户进行输入操作:
*1 .字符串拼接——极不推荐
拼接很简单,就是我们学过的:
//3、使用程序构造SQL语句String sql="insert into student values("+id+",'"+name+"')";
不推荐的原因有2:
1.代码看起来很乱,不利于维护。
2.可能会导致“sql注入攻击”。
比如有人故意使坏,输入一些特别的字符串,是的sql语句不在是之前原有的语意。而是另外一些语意,那么就会对数据库带来负面效果。
*2.statement.setXXX()——推荐
我们不再把id和name拼接到字符串中,而是把他换成占位符:
注意:必须是英文的问号(?),不然程序不认识,会编译失败。
占位符类似于C语言中printf的%d这种作用。
接下来我们设置两个问号的具体参数:
//3、使用程序构造SQL语句String sql="insert into student values(?,?)";//对sql语句进行预编译PreparedStatement statement=connection.prepareStatement(sql);//使用statement自带的setXXX方法,设置?的值statement.setInt(1,id);statement.setString(2,name);
setXXX有很多类型,匹配数据列的参数即可:
setXXX的第一个参数代表当前数据位于数据行的第几列参数,从1开始。
这样就大功告成了,整体代码:
import com.mysql.jdbc.MySQLConnection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;/*** Created with IntelliJ IDEA* Description:* User:34398* Date:2024-06-07* Time:14:26*/
public class Main {public static void main(String[] args) throws SQLException {//1、设置数据源// DataSource dataSource=new MysqlDataSource();//向上转型
// //接着又向下转型
// ((MysqlDataSource) dataSource).setURL();
// ((MysqlDataSource) dataSource).setUser();
// ((MysqlDataSource) dataSource).setPassword();Scanner scanner=new Scanner(System.in);System.out.println("输入学生ID:");int id=scanner.nextInt();System.out.println("输入学生姓名:");String name=scanner.next();MysqlDataSource dataSource=new MysqlDataSource();dataSource.setURL("jdbc:mysql://127.0.0.1:3306/testjdbc?characterEncoding=utf8&useSSL=false");dataSource.setUser("root");dataSource.setPassword("1111");//2、和数据库建立网络连接Connection connection=dataSource.getConnection();//3、使用程序构造SQL语句String sql="insert into student values(?,?)";//对sql语句进行预编译PreparedStatement statement=connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);//解析后的语句放到服务器,执行statement.executeUpdate();//4、关闭资源文件statement.close();connection.close();}
}
2.数据的查询
如图只要在更行数据的代码基础上更改第三步即可:
测试结果:
3.JDBC学习的重要性
JDBC在实际开发中用的很少。
因为代码写起来比较的复杂。
后来就有了很多库和框架,来针对JDBC进行简化(都是基于JDBC)
像Mybaits框架,就是针对JDBC简化后的组件。
这些框架的使用的确可以提高我们的开发效率,但是有使用遇到特殊的场景,这些通用的框架可能就发挥不了作用了。
需要我们利用JDBC的知识,去修改或者自己开发一个框架,来应对某些独特的场景。
因此JDBC的学习非常必要!
完