JDBCのフルネームはJavaDataBase Connectivityとも呼ばれ、Javaデータベース接続です。率直に言って、Java言語を使用してデータベースを操作することです。
JDBCの原則
JDBCは主にJavaがデータベースに接続するために使用されます。どのデータベースに接続できるかは指定されていません。実際、JDBCはさまざまな種類のデータベースに接続できます。よく知られているのはoracle、mysql、sqlserverです。データベースの種類が多すぎるため、データベースごとに接続の種類を設定することは、開発者にとって非常に不便です。そこで、Sun社の人々が方法を考え出しました。Sun社は一連のルールを定義します。データベースベンダーはこのルールに従って、APIを実装するための基本原則に基づいて独自のデータベースを作成し、開発者はそれを呼び出すだけでアクセスを実現できます。データベース。この一連のルールはJDBCであり、JDBC仕様データベースの製造元によって作成されたデータベースの基本原則に従ったAPIの実装はドライバーと呼ばれます。
接続手順
- 最初のステップ:ドライバーを登録します(機能:接続しようとしているデータベースのブランドをJavaプログラムに通知します)
- ステップ2:接続を取得します(JVMプロセスとデータベースプロセス間のチャネルが開いており、使用後に閉じる必要があることを示します)
- ステップ3:データベース操作オブジェクト(SQLステートメントを実行するオブジェクト)を取得します
- ステップ4:sQLステートメントを実行する(DQL DML ...)
- 5番目のステップ:線香クエリの結果セットを処理します(このステップは、selectステートメントが4番目のステップで実行された場合にのみ使用できます)
- ステップ6:リソースを解放します(リソースは使用後に閉じる必要があります)
例
public class Main {
// 数据库连接地址
private static String JDBC_URL = null;
// 用户名
private static String JDBC_USER = null;
// 密码
private static String JDBC_PASSWORD = null;
// 驱动
private static String Driver = null;
// 储存学生信息
private static final List<Student> students = new ArrayList<Student>();
public static void main(String[] args) throws SQLException, IOException {
// 读取配置文件
InputStream in = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(in);
JDBC_URL = properties.getProperty("JDBC_URL");
JDBC_USER = properties.getProperty("JDBC_USER");
JDBC_PASSWORD = properties.getProperty("JDBC_PASSWORD");
Driver = properties.getProperty("Driver");
// 注册驱动 利用反射加载静态方法块注册
try {
Class.forName(Driver);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace();
}
// 获取连接对象
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
// 需要执行的sql语句
String sql = "SELECT * FROM student WHERE sdept=?";
// 获取可执行sql的对象(避免注入攻击)
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
// 设置参数
preparedStatement.setObject(1, "软件工程");
// 执行
try (ResultSet rs = preparedStatement.executeQuery()) {
/**
* 执行查询 .executeQuery() 查
* 返回值 ResultSet结果集
* 执行更新 .executeUpdate() 增 删 改
* 返回值 int(更新数量)
*/
//遍历结果集,取出数据(.next()返回布尔值)
while (rs.next()) {
Student student = new Student();
student.setSno(rs.getString("Sno"));
student.setSname(rs.getString("Sname"));
student.setSsex(rs.getString("Ssex"));
student.setSage(rs.getInt("Sage"));
student.setSdept(rs.getString("Sdept"));
students.add(student);
}
}
}
}
// 输出结果
students.forEach(System.out::println);
// useBatch(students);
}
// 只有参数不同的若干语句可以使用batch执行
public static void useBatch(List<Student> list) throws SQLException {
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO student VALUES (?, ?, ?, ?, ?)")) {
// 对同一个PreparedStatement反复设置参数并调用addBatch():
for (Student s : list) {
ps.setString(1, s.getSno() + 1);
ps.setString(2, s.getSname());
ps.setString(3, s.getSsex());
ps.setInt(4, s.getSage());
ps.setString(5, s.getSdept());
// 添加到batch
ps.addBatch();
}
// 执行batch:
int[] ns = ps.executeBatch();
for (int n : ns) {
// batch中每个SQL执行的结果数量
System.out.println(n + " inserted.");
}
}
}
}
}
学生クラス:
public class Student {
private String Sno;
private String Sname;
private String Ssex;
private String Sdept;
private int Sage;
public String getSno() {
return Sno;
}
public void setSno(String sno) {
Sno = sno;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public String getSdept() {
return Sdept;
}
public void setSdept(String sdept) {
Sdept = sdept;
}
public int getSage() {
return Sage;
}
public void setSage(int sage) {
Sage = sage;
}
@Override
public String toString() {
return String.format("{Student: id=%s, name=%s, Sex=%s, age=%d, dept=%s}", this.Sno, this.Sname, this.Ssex, this.Sage, this.Sdept);
}
}
構成ファイル:
Driver = com.mysql.cj.jdbc.Driver
JDBC_URL = jdbc:mysql://localhost:3306/learnjdbc?serverTimezone=GMT
JDBC_USER = root
JDBC_PASSWORD = 123456
データベースフィールド:
データベース接続パッケージクラス
public class DBUtil {
// 数据库连接地址
private static String JDBC_URL = null;
// 用户名
private static String JDBC_USER = null;
// 密码
private static String JDBC_PASSWORD = null;
// 驱动
private static String Driver = null;
// 构造方法
private DBUtil() {
}
// 静态代码块,只在类加载的时候执行一次。
static {
// 读取配置文件
InputStream in = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
JDBC_URL = properties.getProperty("JDBC_URL");
JDBC_USER = properties.getProperty("JDBC_USER");
JDBC_PASSWORD = properties.getProperty("JDBC_PASSWORD");
Driver = properties.getProperty("Driver");
try {
Class.forName(Driver);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace();
}
}
/**
* 获取数据库连接对象
* @throws SQLException
* @return 连接对象
*/
public static Connection getconnection() throws SQLException {
return DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
}
/**
* 关闭资源
* @param connection 数据库连接对象
* @param statement 数据库操作对象
* @param resultSet 数据库查询结果集
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
JDBC接続プール
時間があるときに書いています~~