1.JDBC概述
Sun公司制定一套规则。通过java代码连接咱们数据库(mysql,oracle,SQLServer,DB2)的规范。而且要求数据库的厂商去解决连接和操作问题!!!
如果把sun公司比作一台电脑,然后电脑给你预留接口。这些数据库厂商就好比u盘。
如果电脑想要用鼠标功能,买个鼠标通过接口插到电脑上面,让电脑具有鼠标的功能。
sun公司制定的java代码,要符合市面上所有的数据库厂商。厂商不一样。sun公司说了。你想使用java代码去连接SQLServer(微软),sun公司对微软说,哥们,你得给我封装一些类库,让我直接调用。如果你不封装,我就不用你的了!!!
JDK中有两个包:
java.sql
javax.sql
如果想要连接数据库,必须要下载第三方的jar包。
sun公司给咱们封装一写类库,但是厂商需要自己封装一些类库,那这些类库是厂商的,被称为第三方的类库,不是java自己带的!!!
真正用的时候,需要导入第三方的jar包,在开发中。
要连接mysql数据库,需要下载一个jar包,mysql-connector-java-5.1.47.jar
如何下载第三方的jar:
最快的方法就是去maven去下载。
1.百度输入maven
2.打开网站https://mvnrepository.com/
3.输入mysql进入查询
4.选择要的版本进行下载(我这里使用的是5.1.47版本的,java开发工具使用的idea2019版本的)
2.mysql连接数据库的参数
假如咱们要在控制台链接数据库:
cmd> mysql -hlocalhost -uroot -p1234
1. 需要确定连接哪一款数据库 mysql
2.hlocalhost 确定连接数据库在哪个服务器上面 本机localhost
3.数据库的用户名 root
4.数据库的密码 1234
java代码连接数据库的时候也是需要这几个参数的!!!
JDBC的URL=协议名+子协议名+数据源名。
a 协议名总是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
几种常见的数据库连接
-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@machine_name:port:dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1521
-------------------------------mysql-------------------
驱动:com.mysql.jdbc.Driver
URL:jdbc:mysql://machine_name:port/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认3306
---------------------------SQL Server(微软)------------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1433
--------------------------DB2 (IBM)--------------------------
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是5000
-------------------------------------------------------
3.借助JDBC连接mysql数据库的入门案例
在项目中如何导包
1.在src的文件夹下面新建一个lib文件夹
2.将jar包复制到lib文件夹中
3.点击上jar包右键,add as library
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.准备url
//useSSL 要么是true要么是false
//你自己电脑的系统我不知有这个ssl协议的!!!
//如果报一个错: javax.net.ssl.SSLHandshakeException:
//true和false看自己情况来定的!!!!
String url = "jdbc:mysql://localhost:3306/java2109?useSSL=false";
//3.准备用户名和密码
String user = "root";
String password = "1234";
//4.借助于一个java里面的类DriverManager 获取数据库连接对象
Connection connection = DriverManager.getConnection(url, user, password);
//
System.out.println(connection);
connection.close();
}
}
最后记着关闭,因为不会自动释放资源,如果不手动关闭的话会一直占用系统资源!!!
4.增删改操作
首先咱们可以先创一个数据库,随便插入几条数据
我这里给获取数据库连接的类对象封装了一下,方便之后调用
import java.sql.*;
public class JavaUtils {
//javaqwz是我的数据库名字
private static String url = "jdbc:mysql://localhost:3306/javaqwz?useSSL=false";
//user 是我的mysql用户
private static String user = "root";
//1234是我的密码
private static String password = "1234";
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection () throws SQLException {
//获取数据库加载类对象
Connection connection = DriverManager.getConnection(url,user,password);
return connection;
}
public static void close (Connection connection) {
close(connection,null,null);
}
public static void close (Connection connection, Statement statement){
close(connection,statement,null);
}
public static void close (Connection connection, Statement statement, ResultSet resultSet){
if (connection == null){
System.out.println("connection为空");
}
if (statement == null){
System.out.println("statement为空");
}
if (resultSet == null){
System.out.println("resultSet为空");
}
}
}
这是在测试类里面写了增删改的方法,目前来说就先搞定静态的sql语句就ok,就是sql语句在Java代码里写好的,不会随着传值改变的
import java.sql.SQLException;
public class UrilTest2 {
public static void main(String[] args) throws SQLException {
add();//调用插入的静态方法
delete();//调用删除的静态方法
update();//调用修改的静态方法
}
public static void add() throws SQLException {
String sql = "insert into test1 values (9,'菠萝酱',79)";//写插入的sql语言
int i = JavaUtils.getConnection().createStatement().executeUpdate(sql);
System.out.println("插入数据成功,共"+i+"行受到影响");
}
public static void delete() throws SQLException {
String sql ="delete from test1 where id=1";
int i = JavaUtils.getConnection().createStatement().executeUpdate(sql);
System.out.println("删除数据成功,共"+i+"行受到影响");
}
public static void update() throws SQLException {
String sql ="update test1 set age=99 where id=2";
int i = JavaUtils.getConnection().createStatement().executeUpdate(sql);
System.out.println("修改数据成功,共"+i+"行受到影响");
}
}
接着咱们运行一下,看看数据库有什么变化
下图为操作之前的数据库
下图为操作之后的数据库
可以看到新增加了id为9的数据、删除了id为1的数据、修改了id为2的age数据
接下来大家看一下查询的
为了方便给大家显示出结果,我新建了一个Person类,里面的属性就是id、name、age
public class Person {
private int id;
private String name;
private int age;
public Person(){}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
接着就是操作数据库了
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class UtilTest {
public static void main(String[] args) throws SQLException {
Connection connection = JavaUtils.getConnection();//获取connection对象
Statement statement = connection.createStatement();//获取statement搬运工对象
ResultSet resultSet = statement.executeQuery("select * from test1");//调用executeQuery方法,返回值为一个resultSet对象
ArrayList<Person> list = new ArrayList<>();//新建一个集合用来存储对象
while (resultSet.next()) {//resultSet的next方法是将光标从当前位置向前移动一行。 ResultSet光标最初位于第一行之前; 第一次调用方法next使第一行成为当前行; 第二个调用使第二行成为当前行,依此类推。返回值为布尔类型,如果有数据的话就为true 反之为false
int id = resultSet.getInt("id");//获取id列的int类型数据
String name = resultSet.getString("name");//获取name列的String类型(varchar)的数据
int age = resultSet.getInt("age");//获取age列的int类型的数据
list.add(new Person(id, name, age));//将值付给新对象加到集合中存储
}
for (Person person : list) {//增强for循环遍历打印
System.out.println(person);
}
JavaUtils.close(connection, statement, resultSet);//最后记者关闭
}
}
结果如下: