1.使用程序之所以能操作数据库,主要是因为数据厂商提供了操作的API,也就是数据库驱动,驱使数据库行动起来,就是数据库驱动,不光是程序,向我们之所以能通过命令行操作MySQL,也
是因为MySQL的数据库驱动,对于操作界面而言,数据库驱动就是:
输入的命令就是MySQL数据驱动的一部分,数据库驱动包含了数据库操作API,它们的关系如下:
1.不同数据库厂商提供数据库驱动不一样,提供了不同的API接口,那么java程序要怎么实现,针对一个数据库写一套调用方法太麻烦,解决上面问题的办法就是使用JDBC.
1.JDBC即java DataBase Connectivity,java数据库连接,是一种用于执行SQL语句的javaAPI,它是java中的数据库连接规范。目的是用这套规范(JDBC)实现不同数据库之间的统一访问。
1.jdbc为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。
jdbc访问数据库层次结构:
2.JDBC优势
(1)java语言访问数据库操作完全面向抽象接口编程。
(2)开发数据库应用不用限定在特定数据库厂商的API。
(3)程序的可移植性大大增加。
1.创建一个java项目(创建项目的目录里面一定不要包含中文路径,不然后面会有问题),并添加MySQL驱动(mysql-connector-java-5.1.47.jar),需要注意不同的数据库版本要对应相应的驱动包。
1.操作数据库MySQL提供了两种操作API:
(1)DriverManager
(2)DataSource(推荐使用)
2.使用DataSource来实现操作数据库,使用代码操作数据分为五个步骤:
(1)获取数据源(准备工作,点击MySQL连接工具,并输入用户名、密码)
(2)获取连接(敲击回车试图建立客户端和服务端的连接)
(3)获取执行器(连接到服务器并切换到数据库)
(4)查询或操作数据库(输入命令并得到结果)
(5)关闭连接(关闭客户端)
1.数据源是MysqlDataSource,获取方式如下,需要输入数据连接的MySQL服务器地址、用户名和密码:
//1.创建数据源
MysqlDataSource dataSource=new MysqlDataSource();
//1.1设置连接的MySQL服务器
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
//1.2设置用户名
dataSource.setUser("root");
//1.3设置密码
dataSource.setPassword("123456");
连接对象是connection,注意此步骤容易出错,一定是com.mysql.jdbc包下的Connection对象:
1.执行器是用来执行SQL命令的,执行器有三种:
(1)Statement:
用于执行不带参数的简单SQL语句。
(2)PreparedStatement:
用于执行带或者不带参数的SQL语句。
SQL语句会编译在数据库系统。
执行速度快与Statement.
(3)CallableStatement:
用于执行数据库存储过程的调用。
2.实际开发中最常用的PreparedStatement对象,它的优点有:
(1)参数化SQL查询
(2)性能比Statement高
(3)SQL预编译
(4)阻止常见SQL注入攻击
(5)占位符:? 下标从1开始
(6)占位符不能使用多值。
3.具体实现:
// 1.创建数据源
MysqlDataSource dataSource = new MysqlDataSource();
// 1.1 设置连接的 MySQL 服务器
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?
characterEncoding=utf8&useSSL=true");
// 1.2 设置⽤户名
dataSource.setUser("root");
// 1.3 设置密码
dataSource.setPassword("12345678");
// 2.创建连接
Connection connection = (Connection) dataSource.getConnection();
//3.获得执行器
PreparedStatement statement=connection.prepareStatement("select * from student where username=?");
//3.1占位符赋值
statement.setString(1,"王五");
4.PreparedStatement有两种重要的方法:
(1)executeQuery():方法执行后返回单个结果集,通常用于select语句。
(2)executeUpdate():方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句。
int result=statement.executeUpdate();//返回受影响的行数
System.out.println("受影响的行数:"+result);
关闭数据库连接时为了不浪费MySQL服务器端的资源。
//5.关闭资源(从小到大)
statement.close();//关闭执行器
connection.clase();//关闭连接
1.使⽤ DriverManager 只是获取 Connection 之前的两步代码不⼀样:
// 1.加载JDBC驱动程序:反射,这样调⽤初始化com.mysql.jdbc.Driver类,即将该类加载到
JVM⽅法区,并执⾏该类的静态⽅法块、静态属性。
Class.forName("com.mysql.jdbc.Driver");
// 2.创建数据库连接
Connection connection =
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java33?
user=root&password=12345678&characterEncoding=UTF-8&useSSL=true");
1.代码:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class AddCity {
public static void main(String[] args) throws SQLException {
//1.获得数据源 DataSource(设置mysql的服务器地址)
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");//设置mysql服务器地址
dataSource.setUser("root");// 设置连接mysql的用户名
dataSource.setPassword("123456");//设置mysql的密码
//2.获得连接Connection
Connection connection=(Connection) dataSource.getConnection();
//3.得到执行器,组装SQL(
String insertSQL="insert into city(id,name) values(?,?)";//组装SQL,使用占位符?
PreparedStatement statement=connection.prepareStatement(insertSQL);
//填充占位符
statement.setInt(1,4);
statement.setString(2,"深圳");
//4.执行SQL
int result=statement.executeUpdate();//返回一个受影响的行数
System.out.println("受影响的行数:"+result);
//5.关闭资源
statement.close();//关闭执行器
connection.close();//关闭连接
}
}
1.代码:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UpCity {
public static void main(String[] args) throws SQLException {
//1.获得数据源
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("123456");
//2.获得连接
Connection connection= (Connection) dataSource.getConnection();
//3.获得执行器,组装SQL
String updateSql="update city set name=? where id=?";
PreparedStatement statement=connection.prepareStatement(updateSql);
statement.setString(1,"长沙");
statement.setInt(2,3);
//4.执行SQL
int result=statement.executeUpdate();
System.out.println("受影响的行数:"+result);
//5.关闭资源
statement.close();
connection.close();;
}
}
1.代码:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DelCity {
public static void main(String[] args) throws SQLException {
//1.获得数据源
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("123456");
//2.获得连接
Connection connection= (Connection) dataSource.getConnection();
//3.获得执行器,组装SQL
String delSql="delete from city where id=?";
PreparedStatement statement=connection.prepareStatement(delSql);
statement.setInt(1,2);
//4.执行SQL
int result=statement.executeUpdate();
System.out.println("受影响的行数为:"+result);
//5.关闭资源
statement.close();
connection.close();
}
}
1.代码:
SelCity.java:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SelCity {
public static void main(String[] args) throws SQLException {
//1.获得数据源
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("123456");
//2.得到连接Connection
Connection connection= (Connection) dataSource.getConnection();
//3.获得执行器
String sql="select * from city where id ";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,10);
//4.执行SQL,打印查询结果
ResultSet resultSet=statement.executeQuery();//得到结果集
while(resultSet.next()){
City city=new City();
city.setId(resultSet.getInt("id"));//查询当前行中列名为id的值
city.setName(resultSet.getString("name"));
//打印city对象
System.out.println(city);
}
//5.关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
City.java:
public class City {
private int id;
private String name;
public int getId() {
return id;
}
@Override
public String toString() {
return "City{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}