什么是JDBC?
JDBC全称是Java Database Connectivity(Java数据库连接),是Java连接数据库的标准和规范。
JDBC的操作步骤
1.导入驱动包
mysql-connector-java-8.0.22.jar
2.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
3.打开连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc?serverTimezone=UTC", "root", "root");
4.获取预处理器
PreparedStatement preparedStatement = connection.prepareStatement("select * from t_user where name = ?");
5.设置参数
preparedStatement.setString(1, name);
6.执行SQL
ResultSet resultSet = preparedStatement.executeQuery();
7.解析结果
if(resultSet.next()){
//已存在
System.out.println("用户已存在,请重新注册");
}else{
//不存在,插入数据
PreparedStatement preparedStatement1 = connection.prepareStatement("insert into t_user(name, pwd) values(?,?)");
preparedStatement1.setString(1,"name");
preparedStatement1.setString(2,"pwd");
preparedStatement1.executeUpdate();//executeUpdate执行更新
System.out.println("注册成功");
}
8.关闭连接
public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
JDBC的操作步骤解析
导入驱动包
mysql-connector-java-8.0.22.jar
加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
在这儿会碰到连接数据库的报错:
JDBC中com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别
com.mysql.jdbc.Driver 是 mysql-connector-java 5及5之前的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6及6之后的
Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc?serverTimezone=UTC", "root", "root");
在这儿可能会碰到jdbc?serverTimezone=UTC带来的时区差问题,UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。
//北京时间==东八区时间!=北京当地时间
serverTimezone=GMT%2B8
//或者使用上海时间
serverTimezone=Asia/Shanghai
获取预处理器 PreparedStatement preparedStatement = connection.prepareStatement("select * from t_user where name = ?");
在这儿我们使用Statement对象来防止SQL注入,SQL注入问题之所以出现,是因为用户填写sql语句参与了编译
目前我所认知中的处理方法是采用预编译的方式来做,将执行sql语句时封装起来,预防SQL注入
设置参数 preparedStatement.setString(1, name);
在这儿的1,表示上面的第几个?,
name,则是?所表示的值
执行SQL
ResultSet resultSet = preparedStatement.executeQuery();
在这儿我们使用的是executeQuery()方法,
executeQuery()方法会把数据库响应的查询结果存放在ResultSet类对象中供我们使用,
所以ResultSet resultSet = preparedStatement.executeQuery();
executeQuery返回的是ResultSet结果集,通常是执行了select操作。
此外还有:
execute执行增删改查操作
execute返回的结果是个boolean型,当返回的是true的时候,表明有ResultSet结果集,通常是执行了select操作,当返回的是false时,
通常是执行了insert、update、delete等操作。execute通常用于执行不明确的sql语句。
executeUpdate执行增删改操作
executeUpdate返回的是int型,表明受影响的行数,通常是执行了insert、update、delete等操作。
而我们这儿使用的executeQuery执行查询操作
executeQuery返回的是ResultSet结果集,通常是执行了select操作。
解析结果
if(resultSet.next()){
//已存在
System.out.println("用户已存在,请重新注册");
}else{
//不存在,插入数据
PreparedStatement preparedStatement1 = connection.prepareStatement("insert into t_user(name, pwd) values(?,?)");
preparedStatement1.setString(1,"name");
preparedStatement1.setString(2,"pwd");
preparedStatement1.executeUpdate();
System.out.println("注册成功");
}
在这儿的resultSet指针的初始位置位于第一行之前;第一次调用next()方法将会把第一行设置为当前行;第二次调用next()方法指针移动到第二行,以此类推。
来判断我们执行的SQL是否查询到数据,
如果没有查询到数据,我们就可以注册一个用户进去
8.关闭连接
public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
如果存在ResultSet连接对象,则首先关闭
如果存在PreparedStatement / Statement连接对象,关闭
最后关闭Connection连接对象