文章目录
1.JDBC概述
1.1 JDBC的概念
- JDBC: Java Database Connectivity sun公司为了简化和统一java连接数据库,定义的一套规范。
- JDBC和数据库驱动的关系:类似接口和接口的实现类, 通过驱动程序,java应用程序可与数据库进行通信。
1.2 为什么要使用JDBC
- 没有JDBC如下
- 有JDBC
2. 第一个jdbc程序
2.1 数据库
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20)
);
INSERT INTO `USER` VALUES(null,'zhangsan','123','张三');
INSERT INTO `USER` VALUES(null,'lisi','1234','李四');
INSERT INTO `USER` VALUES(null,'wangwu','12345','王五');
2.2 代码实现
package com.freedom.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class JdbcDemo {
@Test
public void testQuery() throws ClassNotFoundException, SQLException {
// 1. 注册驱动驱动
// 加载字节码文件,获取的字节码对象, 将字节码文件加载到jvm中
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
String url = "jdbc:mysql://localhost:3306/javaweb";
String user = "root";
String password = "258369";
Connection connection = DriverManager.getConnection(url, user, password);
// 3.获取一个执行SQL的对象
Statement statement = connection.createStatement();
// 4.执行sql
String sql = "select * from user";
ResultSet rs = statement.executeQuery(sql);
// 5.获取结果处理结果
while (rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println("===");
}
// 6.关闭资源
rs.close();
statement.close();
connection.close();
}
}
3. JDBC API详解
3.1 java.sql.Drivermanager
作用: 主要是用于加载驱动,并且创建和数据库的连接
- java.sql.DriverManager.registerDriver(new Driver()),这种方式会两次new Driver();
- Class.forName(“com.mysql.jdbc.Driver”);推荐这种写法
- getConnection(String url, String user, String password) ;与数据库建立连接
3.2 java.sql.Connection接口
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
- createStatement() ;创建执行sql语句对象
- prepareStatement(String sql) ;创建预编译执行sql语句的对象
3.3 java.sql.Statement接口
接口的实现在数据库驱动中,操作sql语句,并返回相应结果对象。
- ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
- int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
- boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回的是ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false。
3.4 java.sql.ResultSet接口
封装结果集,查询结果表的对象
- 提供一个游标,默认游标指向结果集第一行之前。
- 调用一次next(),游标向下移动一行。
- 提供一些getXXX方法。XXX代表的是数据类型
ResultSet接口常用API
- boolean next() ;将光标从当前位置向下移动一行。
- XXX getXXX(int columnIndex) : 根据列的序号获取XXX类型的值,列的序号从1开始。
- XXX getXXX(String columnName) : 根据列名去获取XXX类型的值。
- void close()关闭ResultSet 对象。
4. SQL注入问题解决:preparedStatement
package com.freedom.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
public class JdbcDemo {
@Test
public void testQuery() throws ClassNotFoundException, SQLException {
// 1. 注册驱动驱动
// 加载字节码文件,获取的字节码对象, 将字节码文件加载到jvm中
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
String url = "jdbc:mysql://localhost:3306/javaweb";
String user = "root";
String password = "258369";
Connection connection = DriverManager.getConnection(url, user, password);
// 3.预编译sql
String sql = "select * from user where username=? and password=?";
PreparedStatement prepareStatement = connection.prepareStatement(sql);
String username = "zhangsan";
String password1 = "123";
prepareStatement.setString(1, username);
prepareStatement.setString(2, password1);
// 4.执行
ResultSet rs = prepareStatement.executeQuery();
// 5.获取结果处理结果
while (rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println("===");
}
// 6.关闭资源
rs.close();
prepareStatement.close();
connection.close();
}
}