JDBC(Java Database Connectivity)是Java编程语言用于连接和操作数据库的API(Application Programming Interface)。它为开发人员提供了一组Java类和接口,用于与各种关系型数据库进行通信。使用JDBC,开发人员可以轻松地执行数据库操作,如查询、插入、更新和删除数据。
JDBC提供了一种标准的方式来连接数据库,并通过执行SQL语句与数据库进行交互。它允许开发人员使用Java代码来创建数据库连接、发送SQL语句并处理结果。通过JDBC,开发人员可以跨不同的数据库系统,如MySQL、Oracle、SQL Server等,使用相同的编程接口进行数据库操作。
要想使用JDBC编程要先引入MySQL的JDBC驱动包,JDBC驱动包就是Java对于数据库原生接口的封装,这种驱动包属于第三方库并不包含在JDK中 ,所有需要把它下载下来并且引入项目中。
打开网站:https://mvnrepository.com/
点击上方的搜索框,输入 mysql 然后点击 Search
然后点击如下图第二个搜索结果
然后来到如下界面,向下找到对应自己的MySQL版本,然后点击版本号进去
然后点击如图所示的jar即可下载
1. 先创建一个项目
2. 右键图中的.idea然后点检 新建 / 目录
命名可任意,一般命名为lib
3. 将下载好的jdbc驱动包复制然后粘贴到新建的目录中
3. 右击目录 点击添加到库 然后点击确定即可
数据库是服务器,服务器可能可能在这台主机上,也可能在其他主机上,我们要明确这个服务器的位置才能对其进行操作
数据源就是描述你要操作的数据库在哪里
这里Java是通过 IP地址 + 端口号 + 数据库名 来定位数据库位置的
解释:
注意:
127.0.0.1 是一个特殊的IP地址,叫做环回IP(loopback)表示本机
MySQL默认的端口号为3306
代码:
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
//解释,DataSource 是Java JDBC 中原生的API接口,MysqlDataSource 是我们安装的驱动包中的内容
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
解释:
1. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");
2. ((MysqlDataSource)dataSource).setUser("root");
这行代码设置了数据库连接的用户名。同样是将dataSource转换为MysqlDataSource类型,然后调用setUser()方法,将数据库连接的用户名设置为root,这是一个常见的MySQL数据库的默认用户名,拥有所有权限
3. ((MysqlDataSource)dataSource).setPassword("123456");
这行代码设置了数据库连接的密码。同样是将dataSource转换为MysqlDataSource类型,然后调用setPassword()方法,将数据库连接的密码设置为123456,这是与用户名对应的数据库连接密码,即我们安装MySQL时自己设置的密码
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//注意这里的Connection要使用java.sql包下的Connection
//使用getConnection()方法会抛出一个SQLException异常记得捕获或者抛出这个异常
1. 创建一个字符串类型的SQL语句
//注意末尾不需要加“;”
String sql = "insert into student values(1, 'Ting')";
2 .将String类型的SQL语句转化为语句对象
//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);
注意:还有一个 Statement接口也可以完成该操作,但是他们有一些区别如下:
创建方式:
()
方法创建,需要传入SQL语句作为参数。预编译:
参数设置:
?
)代替具体的参数值,然后通过调用setXXX()方法设置参数的值。防止SQL注入:
增删改操作使用 :executeUpdate() 方法 返回值为int类型 即为影响的行数。
查询操作使用:executeQuery() 方法 返回值为 ResultSet 为一个结果集
int n = statement.executeUpdate();
System.out.println(n);
Connection connection 和 PreparedStatement statement 是需要释放资源的,
因为它们占据了一些计算机重要的软/硬件资源
DataSource dataSource 不需要释放,因为它只储存了 一些信息
使用close() 方法释放资源
//注意释放顺序要与创建顺序相反
statement.close();
connection.close();
在 2.3 中我们发现我们的SQL语句是写死的 如果要插入其他内容又需要重新修改代码,显然这样是不科学的
解决方案:
1. 字符串拼接
在构造SQL语句时我们使用字符串拼接的方式来构造
String sql = "insert into student values(" + id + ", '" + name + "')";
这样就把插入的内容改为可由用户输入了,避免了修改代码
但是这样写任然存在一些问题
1.出的代码太过冗余杂乱
2.有sql注入攻击的风险
例如:用户在输入时 输入 " ');drop database;"
2. 使用 preparedStatement 提供的占位符
String sql = "insert into student values(?, ?)";
//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);//把第一个 ? 设置为 id
statement.setString(2, name);//把第二个 ? 设置为 name
构造查询语句与增删改略有不同,注意查询结果的打印方式即可
public static void main(String[] args) throws SQLException {
//构造数据源
DataSource datasource = new MysqlDataSource();
((MysqlDataSource)datasource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)datasource).setUser("root");
((MysqlDataSource)datasource).setPassword("123456");
//连接数据库
Connection connection = datasource.getConnection();
//构造SQL语句
String sql = "Select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//发送到服务器执行
ResultSet result = statement.executeQuery();
while(result.next()){
int id = result.getInt("id");
String name = result.getString("name");
System.out.println(id + " " + name);
}
//释放资源
result.close();
statement.close();
connection.close();
}