JDBC 学习
大约 2 分钟
JDBC 学习
JDBC
** JAVA DATABASE CONNECTIVITY **
- 定义了 操作所有关系型数据库的规则(接口) ---SUN公司定义
各个数据库厂商实现接口 ,提供驱动jar包 真正执行的代码是jar包中的实现类
导入驱动jar包
--注册驱动 --
获取数据库连接对象 Connection --
定义sql --
获取执行sql语句对象statement --
执行sql 接受结果-
处理结果
//注册驱动 ,加载进内存 (内含静态代码快 其中便是DriverManager的注册方法)!!
Class.forName("com.mysql.cj.jdbc.Driver");
//获取数据库连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC","root","Zyl2000215");
/*DriverManager 驱动管理对象(注册驱动 --获取连接)
getConnection (url,user,password)
url :jdbc:mssql//ip :端口 /数据库名称
细节:若是本机的mysql服务器且端口为3306 可以不写ip:端口
*/
/*
Connection
1.获取执行sql对象
createStatement
2.管理事务:
开启事务 setAutoCommit()
提交事务 commit()
回滚事务 rollback()
*/
String sql1="update account set salary =3000";
Statement stat=conn.createStatement();
/*
Statement :
1. 执行sql
int executeupdate(string sql): 执行 DML DDL 返回值:影响的行数
ResultSet executeQuery 执行DQL 语句
*/
int count =stat.executeUpdate(sql1);
/*
ResultSet :
1. next():游标向下移动一行 注意,最开始的从第一行之前开始
getXXX(数据类型)(参数):获取数据
while(rs.next())实现循环
1, 参数为 int :列的编号 从 -1- 开始
2. 参数为String , 列的名称
*/
System.out.println(count);
stat.close();
conn.close();
抽取JDBC 工具类(for 简化书写)
1.注册驱动也抽取
2.抽取一个方法获取连接对象
** 使用配置文件---使用静态代码块 **
3.抽取一个方法释放资源
private static String url;
private static String user;
private static String password;
private static String driver;
/*
静态代码块,文件加载时执行一次
*/
static {
try {
Properties pro=new Properties();
//类加载器 避免直接输入绝对路径造成路径转移时问题
ClassLoader classLoader=JDBCUtils.class.getClassLoader();
URL res=classLoader.getResource("jdbc.properties");
String path=res.getPath();
pro.load(new FileReader(path));
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url,user,password);
}
public static void closeAll(Statement stmt, Connection conn, ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
PreparedStatement :执行sql 的对象
- sql注入问题
- 目的: 用户输入的一些sql的特殊关键字参与拼接,造成安全性问题
- 预编译sql: 参数使用 ? 作为占位符
- 步骤麻烦 但安全:
Connection.preparedSatement(sql)
给?赋值: setXXX(参数1,参数2)
参数1: ?的位置编号,从1开始
参数2: ?的值resultset 传参时,不需要再传参sql
相当于preparedSatement代替了父类statement
** 后期都会使用到preparedStatement!!!**
JDBC 控制事务
conn.setAutoCommit.(false);
抓异常回滚时,是在异常catch中抓 conn.rollback();