1、java的数据库编程:JDBC
1、定义:
本质:java数据库连接,是一种用于执行SQL语句的java API,是java中的数据库连接规范。
目的:使用这套规范(JDBC)实现不同数据库之间的统一访问
2、JDBC的工作原理
1、JDBC访问数据库层次结构
2、JDBC优势
(1)java语言访问数据库操作完全面向抽象接口编程;
(2)开发数据库应用不用限定在特定数据库厂商的API;
(3)程序的可移植性大大增强。
3、JDBC使用
1、步骤:
1、创建一个java程序,并添加mysql驱动包
2、使用代码来操作数据库
MySQL JDBC提供了两种操作MySQL数据库的方法:
(1)DiverManager
(2)DataSource(推荐使用,更符号OOP编码的思想和代码模式)
DataSource:
①获得数据源DataSource(相当于使用mysql客户端输入密码)
②获得一个连接Connection(输入了正确的密码,并且进入到了mysql操作界面)
③获得一个执行器(使用了某个数据库)
④组装SQL并调用执行的API(相当于在mysql客户端输入了SQL命令,并执行了回车操作)
⑤关闭资源(关闭mysql客户端)
2、JDBC代码实现流程
1、获得数据源
2、得到Connection
3、得到执行器PreparedStatement
4、执行SQL
5、关闭资源
4、JDBC常用的接口和类
1、数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式;
1、通过DriverManager(驱动管理类)的静态方法获取
//1、选择mysql驱动
Class.forName("com.mysql.jdbc.Driver");
//2、得到连接
Connection connection = (Connection) DriverManager.getConnection(url:"jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
//3、拼接sql
PreparedStatement statement = connection.prepareStatement(sql:"select * from city");
2、通过DataSource(数据源)对象获取。实际应用中会使用Database对象。
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("12345678");
//2、得到链接
Connection connection = (Connection) dataSource.getConnection();
//3、得到执行器
String sql = "select * from city where id < ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,5);
区别:
(1)DriverManager类获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接;
(2)DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以重复的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。
2、Statement对象
Statement对象主要是将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象。
1、Statement:用于执行不带参数的简单sql语句;
2、PreparedStatement(最常用):用于执行带或不带参数的sql语句;
3、CallableStatement:用于执行数据库存储过程的调用。
3、ResultSet对象
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套get…方法提供了这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
4、增删改查操作的使用
1、查询操作
(1)第一种:
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 SeCity {
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("12345678");
//2、得到链接
Connection connection = (Connection) dataSource.getConnection();
//3、得到执行器
String sql = "select * from city where id < ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,5);
//4、组装并执行sql
ResultSet resultSet = statement.executeQuery();
//若结果集的下一行有数据的话,若下一行为null,返回false;若下一行有值,返回true;
//每次循环可以得到一行数据
while (resultSet.next()){
City city = new City();
city.setId(resultSet.getInt("id"));
city.setName(resultSet.getString("name"));
System.out.println(city);
}
//5、关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
(2)第二种
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* DriverManager 进行 JDBC 的查询
*/
public class SelCity2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1.选择 mysql 的驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.得到连接
Connection connection = (Connection) DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java33?user=root&password=12345678&characterEncoding=UTF-8&useSSL=true");
// 3.拼接 SQL,得到执行器
PreparedStatement statement = connection.prepareStatement("select * from city");
// 4.执行 SQL,得到结果
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
City city = new City();
city.setId(resultSet.getInt("id"));
city.setName(resultSet.getString("name"));
System.out.println(city);
}
// 5.关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
2、添加操作
import com.my`在这里插入代码片`sql.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"); // 1.1 设置 MySQL 的服务器地址
dataSource.setUser("root"); // 1.2 设置连接mysql的用户名
dataSource.setPassword("12345678"); // 1.3 设置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, 5);
statement.setString(2, "宝鸡");
// 4.执行 SQL
int result = statement.executeUpdate(); // 返回一个受影响的行数【添加、修改、删除】
System.out.println("受影响的行数:" + result);
// 5.关闭资源(从小到大)
statement.close(); // 关闭执行器
connection.close(); // 关闭连接
}
}
3、修改操作
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.得到数据源 DataSource【url、user、password】
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("12345678");
// 2.得到连接 Connection
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, 4);
// 4.执行 SQL,得到执行结果
int result = statement.executeUpdate();
System.out.println("执行结果:" + result);
// 5.关闭资源
statement.close();
connection.close();
}
}
4、删除操作
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.得到 DataSource
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("12345678");
// 2.得到连接 Connection
Connection connection = (Connection) dataSource.getConnection();
// 3.得到执行器,组装 SQL
String delSQL = "delete from city where id=?";
PreparedStatement statement = connection.prepareStatement(delSQL);
statement.setInt(1, 5);
// 4.执行 SQL
int result = statement.executeUpdate();
System.out.println("结果:" + result);
// 5.关闭资源
statement.close();
connection.close();
}
}