一、jdbc简介
1.全称:JDBC(Java DataBase Connectivity) ,Java数据库连接技术。
具体讲就是使用Java语言连接关系型数据库,并对表中数据执行增、删、改、查等操作的技术。
2.作用:通过JDBC技术与数据库进行交互,使用Java语言发送SQL语句到数据库中,可以实现对数据的增、删、改、查等功能,可以更高效、安全的管理数据。
JDBC是数据库与Java代码的桥梁(链接)。
3.JDBC是规范(接口)不是实现(类)
JDBC 是一种规范,由Sum公司它提供了一套完整的接口,由数据库厂商根据特点予以实现,因此只要学会接口的使用就可以轻松的用 JDBC编写适用于各种数据库的程序。
4.好处
二、JDBC开发
ps:idea用jdbc连数据库时,需要在电脑上提前打开数据库服务
步骤
1. 加载驱动
2. 获取链接
3. 准备SQL以及发送SQL的工具
4. 执行SQL
5. 处理结果集
6. 释放资源
使用idea开发的具体步骤
1.打开idea创建一个新项目
file→new→project
选择new/empty都可,命名jdbc、选择位置、选择java语言、本次使用jdk1.8。然后create
右键项目,new一个module,命名jdbc-demo,Java语言,jdk1.8。然后create
2.导入jar包
右键jdbc-demo,new一个包directory,取名为lib,用于存放驱动jar包
复制jar包的文件地址
粘贴到lib里
点击ok
右键jar包,选择add as library,以让当前的工程识别这个jar包
在level里选择有效范围,本次选择模块有效module library即可。然后ok
3.在src里new一个类class,用于写代码。本次命名,同时命名包和类,com.gg.jabc是包名
4.连接数据库,进行操作
//1.加载驱动
/*
5.0版MySQL语法:Class.forName("com.mysql.jdbc.Driver");
8.0版MySQL语法:Class.forName("com.mysql.cj.jdbc.Driver");
*/
//2.创建连接
/*
url参数用来确定连接的数据库信息,数据库机器IP 端口号port 数据库名db_name 连接的参数
url格式:jdbc:mysql://ip:port/db_name?k=v参数
jdbc:mysql:是固定的写法,后面跟主机名localhost,3306是默认的MySQL端口号
serverTimezone=UTC是指定时区时间为世界统一时间
useUnicode=true是指是否使用Unicode字符集,赋值为true
characterEncoding=utf-8是指定字符编码格式为UTF8
*/
写法一(简易版):
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建连接
String url="jdbc:mysql://localhost:3306/sys?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
//测试是否连接成功System.out.println(conn);
写法二(带测试验证版):
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建连接
String url="jdbc:mysql://localhost:3306/sys?useSSL=false";
String username="root";
String password="123456";
try {
Connection conn= DriverManager.getConnection(url,username,password);
System.out.println("数据库连接成功!!!");
}catch(Exception e) {//未连接成功,执行下面的异常处理
System.out.println("数据库连接失败!!!");
}
写法三
public class jdbc连接MySQL {
public static void main(String[] args) {
String driver="com.mysql.cj.jdbc.Driver";//数据库驱动类所对应的字符串
String url="jdbc:mysql://localhost:3306/sys?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";//连接数据库的账号
Connection conn=null;//执行sql对象
//获取链接对象Collection,只有获得该连接对象后,才能访问数据库,并操作数据表
try {
Class.forName(driver);//加载MySQL数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();//没找到驱动时抛出异常
}
try {
conn= DriverManager.getConnection(url,"root","lpxroot");//建立和数据库的连接,并返回表示连接的Connection对象
System.out.println("数据库连接成功!!!");
}catch(Exception e) {//未连接成功,执行下面的异常处理
System.out.println("数据库连接失败!!!");
}
}
}
三、API技术接口
接口:作用
jdbc需要通过Java来操作数据库,jdbc中定义了操作数据库的各种接口和类型
1.Driver:驱动接口,定义建立链接的方式
2.DriverManager驱动管理类:是一个工具类,用于1.注册(管理)驱动,2.获取数据库的连接
2.1
Class.forName("com.mysql.jdbc.Driver");
(MySQL5版本之后,这句代码不写也可执行,原因:jar包里的META.INF目录下含有java.sql.Driver),语句中的forName将Driver加载进内存,点开Driver源码可见静态代码块中含DriverManager.registerDriver(new Driver());该静态代码块会随着类的加载自动执行,所以可按上述语句来写。mysql提供的Driver驱动类一加载进内存的时候,不需要调动任何方法即可自动执行所对应的代码块,执行完毕时,Driver就把驱动类注册了
2.2获取链接:
url连接路径:jdbc:mysql://IP地址:端口号/数据库名称
本机ip默认为:127.0.0.1
MySQL端口号默认:3306
3.Connection:表示Java与数据库建立的连接对象接口,1.获取执行sql的对象2.管理事务
01.获取执行sql对象
//1.普通执行sql对象
Statement createStatement ();
//2.预编译sql的执行sql对象:防止sql注入
PreparedStatement prepareStatement(sql);
//3.执行存储过程的对象
CallableStatement prepareCall(sql);
02.事务管理
该接口定义了3个对应MySQL的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动
提交事务:commit();
回滚事务:rollback();
可在执行sql语句前开启事务,在处理结果之后提交事务,若过程中出现问题可回滚(使用try catch语句)
//例
try{
//开启事务
conn.setAutoCommit(false);
//执行sql
int sql=...
//处理结果
System....
//提交事务
conn.commit();
}catch(Exception throwables){
//回滚事务
conn.rollback();
throwables.prinStackTrace();
}
4.PreparedStatement(未学完):结果集,用于获取查询语句的结果,01.预编译SQL语句并执行:预防SQL注入问题(SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码队服务器进行攻击的方法)
4.1SQL注入演示
需求:完成用户登录
select * from tb_user where username="lihua" and password="123";
4.2预编译ssql并执行
1.获取preparedStatement对象
String sql="select * from user where username=?and password=?";
2.设置参数值
preparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型,如setlnt(参数1,参数2)
参数:
参数1:?位置编号,从1开始
参数2:?的值
3.执行sql
executeUpdate();
5.Statement:01.执行sql语句02
01.执行sql语句
//执行DML、DDL语句
//返回值:1.DML语句影响的行数2.DDL语句执行后,执行成功也可能返回0
int executeUpdate(sql);
//执行DQL语句(查询语句)
//返回值:ResultSet结果集对象
ResultSet executeQury(sql);//qury是查询的意思
package jdbc_mysql;
import java.sql.*;
public class jdbcTest03_Statement {
public static void main(String[] args) throws Exception{
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建连接
String url="jdbc:mysql://localhost:3306/sys?useSSL=false";
String username="root";
String password="lpxroot";
Connection conn = DriverManager.getConnection(url,username,password);
//使用事务管理,希望两条语句同时成功或同时失败
//3.编写sql
//题外话:从用户的角度,可用web知识实现:用户通过浏览器设置set信息发送到代码中用与满足person_name条件的身上
//DML语句(对数据的增删改查)
//String sql=" update person set age=9 where person_name='张三';";
//DDL语句(对库的增删改查),不一定有结果/也可能是0(基本上不报异常即可)(比如创建或删除一个表是没有受影响行数的)
String sql="drop database db1";
//4.查询语句
Statement ment = conn.createStatement( );
//5.执行sql
int update1=ment.executeUpdate(sql);//执行完语句后受影响的行数(程序员角度)注意:适用于DML不适用于DDL
//6.处理结果集(查询语句需要)
//System.out.println(update1);//输出受影响的行数
//改为用户的角度:显示成功与否,而不是0(一条语句也不成功)或1.2.3...
if(update1>0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
//7.关闭资源
ment.close();
conn.close();
}
}
6.ResultSet:结果集对象01.封装了DQL查询语句的结果02.
//执行DQL语句,返回ResultSetd对象
ResultSet stmt.executeQuery(sql);
//获取查询结果
//next方法:
boolean next():01.将光标从当前位置向前移动一行02.判断当前行是否为有效行
返回值:01.true:有效行,当前行有数据02.false:无效行,当前行没有数据
//get方法:
xxx getXxx(参数):获取数据
xxx:数据类型,如int 参数;String 参数;
参数:01.int:列的编号,从1开始02.String:列的名称
//使用步骤
//循环判断游标是否为最后一行末尾
while(re.next()){
//获取数据
rs.getXxx(参数);
}
6.1ResultSet案例
需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
四、数据库连接池
1.概念:是个容器,负责分配、管理数据库连接。
它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;
释放空间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接二引起的数据库连接遗漏
2.好处:
2.1资源重用
2.2提升系统响应速度
2.3避免数据库连接遗漏
3.标准接口:DataSource,sun公司提供的,由第三方组织实现此接口,
功能:获取链接
获取方法:Connection getConnection()
4.常见的数据库连接池:
DBCP、C3P0、Druid(德鲁伊,功能强大,性能优秀,是Java语言最好的数据库连接池之一)
5.Druid下载及使用步骤
5.1下载
01.在官网https://repo1.maven.org/maven2//com/alibaba/druid/
找到要下载的版本,找到jar包,下载即可
导入jar包
ps其他:
1.运行时,即使成功也会出现如下的红色字体warn警告。
原因:MySQL版本较高,他建议使用一个安全的连接方式。若使用,则需配置,且性能会降低。
若不想使用也不想出现红色警告,则可以根据提示:禁用安全连接
复制useSSL=false,粘贴到url里。注意不要使用中文?
结果:无红色警告