java之 JDBC
0x01、JDBC入门
在li处导入jdbc
JDBC的用处,方便与mysql或者oracle数据库之前快速替换
代码实现:
public static void main(String[] args) throws SQLException {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/day10?characterEncoding=utf8";
String user = "root";
String password = "123";
//获得连接
Connection connection = DriverManager.getConnection(url, user, password);
//创建执行sql语句对象
Statement statement = connection.createStatement();
//执行sql,处理结果
String sql = "select *from user";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getObject(1));
System.out.println(resultSet.getObject(2));
System.out.println(resultSet.getObject(3));
System.out.println(resultSet.getObject(4));
}
//关闭资源
resultSet.close();
statement .close();
connection.close();
}
0x02、API详解
1、DriverManager类
作用:
- 注册驱动
- 获得连接
1.registerDriver(Driver driver) ;注册驱动
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
翻阅源码发现,通过API的方式注册驱动会让我们的项目在编译期依赖mysql驱动,产生了耦合,所有推荐这种写法:
//当前就理解成 可以让com.mysql.jdbc.Driver里面的静态代码块执行
Class.forName("com.mysql.jdbc.Driver");
2、getConnection(String url, String user, String password) ;与数据库建立连接
2、Connection接口
作用:
createStatement() ;创建执行sql语句对象
prepareStatement(String sql) ;创建预编译执行sql语句的对象
- Connection代表连接对象, 是一个接口, 实现在驱动jar包; 操作数据库都是基于Connection的
- 作用:
- connection.createStatement(); 创建执行sql语句对象
//创建Statement
Statement statement = connection.createStatement();
3、Statement接口
作用:
ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行**select**语句。
int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值. 【了解】
true: 执行select有查询的结果
false: 执行insert, delete,update, 执行select没有查询的结果
String sql = "select *from user";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getObject(1));
System.out.println(resultSet.getObject(2));
System.out.println(resultSet.getObject(3));
System.out.println(resultSet.getObject(4));
- 执行查询
ResultSet excuteQuery(String sql); //返回值是结果集
- 执行增删改
int excuteUpdate(String sql); //返回值是受影响的行数
4、ResultSet接口
-
封装结果集,查询结果表的对象;
提供一个游标,默认游标指向结果集第一行之前。
调用一次next(),游标向下移动一行。
提供一些get方法。
-
ResultSet接口常用API
boolean next();将光标从当前位置向下移动一行 int getInt(int colIndex)以int形式获取ResultSet结果集当前行指定列号值 int getInt(String colLabel)以int形式获取ResultSet结果集当前行指定列名值 float getFloat(int colIndex)以float形式获取ResultSet结果集当前行指定列号值 float getFloat(String colLabel)以float形式获取ResultSet结果集当前行指定列名值 String getString(int colIndex)以String 形式获取ResultSet结果集当前行指定列号值 String getString(String colLabel)以String形式获取ResultSet结果集当前行指定列名值 Date getDate(int columnIndex); 以Date 形式获取ResultSet结果集当前行指定列号值 Date getDate(String columnName);以Date形式获取ResultSet结果集当前行指定列名值 void close()关闭ResultSet 对象
0x03、封装数据
- 定义一个User类
public class User {
private int id;
private String username;
private String password;
private String nickname;
//提供get/set方法 Alt+Insert
public User() {
}
public User(int id, String username, String password, String nickname) {
this.id = id;
this.username = username;
this.password = password;
this.nickname = nickname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
- 查询封装
List<User> list = new ArrayList<User>();
while (resultSet.next()) {
//每遍历一次, 就是1条记录, 就封装成一个User对象
User user = new User(resultSet.getInt("id"),
resultSet.getString("username"),
resultSet.getString("password"),
resultSet.getString("nickname")
);
list.add(user);
}
0x04、预编译
public static void main(String[] args) throws SQLException {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/day10?characterEncoding=utf8";
String user = "root";
String password = "123";
//获得连接
Connection connection = DriverManager.getConnection(url, user, password);
//创建执行sql语句对象
Statement statement = connection.createStatement();
//执行sql,处理结果
//String sql = "select *from user";
//ResultSet resultSet = statement.executeQuery(sql);
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
ResultSet resultSet = preparedStatement.executeQuery();
//关闭资源
resultSet.close();
statement .close();
connection.close();
}
在Connection接口已经提过了,使用PreparedStatement
来进行预编译
通过connection对象创建
-
connection.prepareStatement(String sql) ;创建prepareStatement对象
-
sql表示预编译的sql语句,如果sql语句有参数通过?来占位
SELECT * FROM user WHERE username = ? AND password = ?
设置参数
- prepareStatement.set类型(int i,Object obj);参数1 i 指的就是问号的索引(指第几个问号,从1开始),参数2就是值 eg: setString(1,"zs"); setString(2,"123456");
//创建预编译的SQL语句对象(SQL参数需要使用?占位)
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//c.设置参数, 执行(还是executeQuery()和executeQUpdate(), 但是不需要再传入SQL语句, 上面已经传入了)
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
ResultSet resultSet = preparedStatement.executeQuery();