JDBC 是java语言操作数据库的包 属于javaSe部分,由一组Java工具类和接口组合而成在JDBC中
常用的类有:
DriverManager;驱动,该类提供注册驱动的方法,但是使用会使驱动被注册两次和硬编码后期不易程序扩展和维护。所以一般直接使用的是Class.forName
Connection;连接
Statement;执行对象
ResultSet。结果集
开发步骤
1、注册驱动
2、获取连接
3、获得语句执行者
4、执行SQL语句
5、处理结果
6、释放资源
例如在asd库中搜索显示所有信息
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 QueryAll {
@Test
public void test123(){
Connection conn= null;
Statement stmt = null;
ResultSet rs = null;
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver"); //MYSQL驱动类提供了实现类
//2.获取连接 //数据库服务器ip 端口
String url ="jdbc:mysql://127.0.0.1:3306/asd?useSSL=false"; //url固定由jdbc:mysql://localhost:3306/库名
conn = DriverManager.getConnection(url, "root", "ch595200");//三个参数分别未url 登录名和密码
//此时已经连接上
//3.获取执行sql语句对象
stmt = conn.createStatement();
//4.编写sql语句 做什么写什么
String sql = "select * from product";
//5.执行sql语句
rs = stmt.executeQuery(sql);
/*查询使用executeQuery(sql) DQL语句 返回了一个结果集
* executeUpdate(sql) DML语句(插入数据等) 返回int
* execute(sql) ①执行select 返回true 用getResultSet获取结果
* ②执行其他语句 返回false 用getUpdateCount()获得影响的行数
*/
//6.处理结果集
while(rs.next()){ //用光标获取数据
System.out.println("用户名:"+rs.getString(2)+" pid:"+rs.getString("pid"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
}
}
注意:有时候会发生SQL攻击 , 我们输入的参数中的某些参数被当成sql语句执行代码片,此时要用占位符,并预处理。
所以,无论什么情况,多使用PreparedStatement,而不是使用Statement。如搜索name和cid ,
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 TestLogin {
//sql注入问题 预处理 PreparedStatement
@Test
public void test()
{
try {
se("士兵' or '黄迎", "1"); //SQL攻击 此时有错误 需要预处理
} catch (Exception e) {
e.printStackTrace();
}
}
public void se(String name,String cid) throws ClassNotFoundException, SQLException
{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
String url = "jdbc:mysql://127.0.0.1:3306/asd?useSSL=false";
Connection conn = DriverManager.getConnection(url, "root", "ch595200");
//编写sql语句
//String sql = "select * from product where pname='"+name+"' and cid="+cid;
String sql = "select * from product where pname=? and cid=?"; //占位符
// 创建预处理对象防止SQL攻击;提高代码的可读性,以可维护性;提高效率。
PreparedStatement pstmt = conn.prepareStatement(sql);//创建的时候已与一条sql语句绑定
// 设置参数(给占位符)
pstmt.setString(1, name);
pstmt.setString(2, cid);
//执行sql语句,获取结果
ResultSet rs = pstmt.executeQuery(); //此时没有参数
//显示结果
if(rs.next())
{
System.out.println("查询到," + name + ",成功!");
System.out.println(sql);
}
else
System.out.println("查不到");
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
}
}