文章目录
JDBC的基本使用步骤
- 导入驱动jar包
- 加载驱动的Class类文件
- 获取数据库链接对象
- 定义sql语句
- 设置参数,执行sql
- 获取结果
- 释放资源
典型的代码示例如下:
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
String sql = "select * from accout where id = 1";
Statement stmt = conn.createStatement(sql);
ResultSet result = stmt.execute(sql);
stmt.close();
conn.close():
JDBC的各个对象
-
DriverManager:驱动管理对象
功能
-
注册驱动
public static synchronized void registerDriver(java.sql.Driver driver)
但 写代码时,注册驱动使用的是
Class.forName("com.mysql.jdbc.Driver");
进入到
com.mysql.jdbc.Driver
中,发现在静态代码块中调用了DriverManager中的registerDrvierstatic { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
其实在使用mysql 5 以后的驱动jar包时,可以省略注册驱动这一步,这是因为在mysql的驱动jar包中,通过META-INF/services中配置了Driver接口的实现类,这样通过Java的SPI机制会自动加载com.mysql.jdbc.Driver类。
-
获取数据库连接
public static Connection getConnection(String url,String username,String password);
url的语法格式:
jdbc:mysql://ip地址(域名):端口/数据库名称
比如
jdbc:mysql://localhost:3306/user
如果调用本地mysql,且端口是3306,则url可以简写为
jdbc:mysql:///user
-
-
Connection:数据库连接对象
功能
-
获取执行sql的对象(Statement)
Statement createStatement(); PreparedStatement prepareStatement(String sql)
-
管理事务
-
开启事务
传入false,表示要手动提交事务,就不会默认的执行一行Sql就提交一次事务,从而可以控制多个Sql在一个事务中
void setAutoCommit(boolean autoCommit);
-
提交事务
void commit()
-
回滚事务
void rollback()
-
-
-
Statement:执行SQL的对象
静态SQL,有SQL注入的风险
执行SQL
-
boolean execute(String sql)
可执行任意sql,若返回true,表示执行的结果是ResultSet对象;若返回false,说明是更新计数等操作,或者没有返回的ResultSet
-
int executeUpdate(String sql)
一般用来执行DML语句(insert/delete/update),也可以执行DDL(create/alter/drop)
返回值是该sql影响的行数,如果user表中,一共有5条记录的address值为"四川",而这5条记录中的1条记录的name值为yogurt,其他4条记录的name都不为yogurt,则执行sql
UPDATE user SET name = "yogurt" WHERE address="四川"
影响的行数为4行
-
Result executeQuery(String sql)
执行DQL(select)语句
-
-
ResultSet:结果集对象,封装了查询结果
Statement刚执行完时,得到的ResultSet的游标指向的是第一行记录之前的位置,需要调用next()方法后,再进行数据读取,一般我们会这样来读取ResultSet中的数据(有点像Iterator迭代器的用法)
ResultSet result = stmt.executeQuery(sql); while(result.next()){ //读取数据 }
-
boolean next()
游标向下移动一行,若当前指向的行有数据,返回true,若没数据,若返回false,说明数据读取完了,游标到了最后一行之后的位置 -
getXxx(参数)
获取数据,具体的是获取当前行的某一列参数可以是 int columnIndex,代表列编号,从1开始
参数也可以是String columnLabel,代表列名
Xxx代表类型,比如getInt(1),getString(1)
-
-
PreparedStatement
会进行预编译,然后再动态组装参数,可以防止SQL注入。
参数使用?作为占位符
PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM product WHERE name = ?"); pstmt.setString(1,"无尽之刃"); //注意占位符?的下标从1开始 ResultSet result = pstmt.executeQuery();