JDBC
一.什么是持久化数据
断电也能保存下来的数据
二.基本操作
创建maven工程
1.加载驱动
在pom.xml文件中配置JDBC驱动版本
https://mvnrepository.com/artifact/mysql/mysql-connector-java
Class.forName("com.mysql.jdbc.Driver");
JDBC的配置
8.0+:com.mysql.cj.jdbc.Driver;
8.0-:com.mysql.jdbc.Driver;
2.获取与数据库的连接
Connection conn = null;
//配置JDBC地址、用户、密码
String url = "jdbc:mysql://127.0.0.1:3306/scoot";(访问协议)
String user = "root";
String passwd = "123456";
conn = DriverManager.getConnection(url,user,passwd);
3.获取statement
Statement stm = conn.createStatement();(不建议使用Statement)
可以使用PreparedStatement,预编译
PreparedStatement sqlPs = jConnect.prepareStatement(sql);
Statement存在的问题:
(1)会造成sql注入:只要在sql语句中加入特定的恒等式,查询的数据就会把整张表的数据拿到,有安全隐患
(2)每查询一次就会编译一次,极大的消耗性能
4.执行sql语句,获取结果集ResultSet
ResultSet result = stm.executeQuery("select empno as en,ename,hiredate from `emp`");
5.遍历查询结果
while(result.next()){
int empon = result.getInt("en");
// int empon = result.getInt(1);
String ename = result.getString("ename");
Date date = result.getDate("hiredate");
System.out.println(empon + "," + ename + "," + date);
}
6.获取查询数据
(1)数据可以根据列名获取,别名获取
(2)数据可以根据列所在位置获取,从1开始
(3)数据的获取要符合数据类型的对应和数据库支持的类型保持一致
三.增删改查
(1)在JDBC当中,数据的修改默认是没有事务的
(2)在JDBC当中完成事务
setAutoCommit(false) 把自动提交关掉
commit() 手动提交
rollback() 回滚
(3)批量插入数据
addBatch() 添加需要批量执行的数据
executeBatch() 执行批量添加的数据
实例:
package com.kop.insert;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
public class exerciseJDBC {
public static void main(String[] args) {
Connection jConnect = null;
try {
//加载jdbc驱动
Class.forName("com.mysql.jdbc.Driver");
//定义需要连接的数据库,账号,密码
String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/scoot";
String jdbcUser = "root";
String jdbcPasswd = "123456";
jConnect = DriverManager.getConnection(jdbcUrl,jdbcUser,jdbcPasswd);
//关闭事务自动提交
jConnect.setAutoCommit(false);
String sql = "INSERT INTO `dept` (`deptno` , `dname` , `loc`) VALUES (? , ? , ?)";
// String sql = "DELETE from `dept` where `deptno` = ?";
//把sql放到statement中编译
PreparedStatement sqlPs = jConnect.prepareStatement(sql);
for (int i = 50; i < 100 ; i += 10) {
// sqlPs.setObject(1,50);
// sqlPs.setObject(1,60);
// sqlPs.setObject(1,70);
// sqlPs.setObject(1,80);
// sqlPs.setObject(1,90);
sqlPs.setObject(1,i);
sqlPs.setObject(2,"JavaSyswork");
sqlPs.setObject(3,"CHENGDU");
//批量导入需要修改的数据
sqlPs.addBatch();
}
//批量提交需要修改的数据
int[] sqlArray = sqlPs.executeBatch();
jConnect.commit();
System.out.println(Arrays.toString(sqlArray));
} catch (ClassNotFoundException e) {
if(jConnect != null){
try {
jConnect.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (jConnect != null) {
try {
jConnect.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}