目录
JDBC概念
JDBC(Java Database Connectivity)。但它只是规范,不做具体实现
调用方式有三种:
Statement语句、
PreparedStatement预处理语句、
CallableStatement存储过程,
推荐使用第二种PreparedStatement,防止SQL注入,其也是预编译性能高。
JDBC使用步骤
导入jar包(丰富的工具类)
获取和数据库的连接(用户名、密码)
通过程序执行SQL
通过程序处理结果
idea 创建项目并导入jar包
- 创建stage2 Java工程
- 创建lib目录,拷贝驱动objbc6-11.1.0.7.0到lib目录下
- 项目引用这个外部jar包
JDBC创建及注入
//解决SQL注入攻击的方案
private static void login2() {
try{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql:///cgb2104?characterEncoding=utf8";
Connection conn = DriverManager.getConnection(url, "root", "root");
// Statement st = conn.createStatement();不行,不安全,会被SQL攻击
String user = new Scanner(System.in).nextLine();//用户输入jack'#
String pwd = new Scanner(System.in).nextLine();
//?叫占位符 ,SQL的骨架
String sql ="select * from user2 where name=? and password=?";
//先把SQL骨架发给数据库执行
PreparedStatement ps = conn.prepareStatement(sql);
//给SQL里的? 设置参数
ps.setString(1,user);//给第一个?设置值是user
ps.setString(2,pwd);//给第二个?设置值是pwd
ResultSet rs = ps.executeQuery();//执行拼接好的SQL,返回结果集
if(rs.next()){
System.out.println("登录成功~");
}else{
System.out.println("登录失败~");
}
ps.close();
conn.close();
}catch(Exception e){
e.printStackTrace();//有异常,直接打印异常信息
//System.out.println("执行失败。。。");//上线
}
}
JDBC常见问题
驱动版本
Mysql5.0x mysql-connector-java-5.1.32.jar
Mysql8.0x mysql-connector-java-8.0.21.jar
- Driver变成了: com.mysql.cj.jdbc.Driver,中间多了cj
- url必须加时区参数: serverTimezone=Asia/Shanghai
中文乱码
url增加参数:characterEncoding=utf8防止中文乱码
String url ="jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false";
常见错误
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
错误原因:
1)jar没有导入,没有builder path
2)Class.forName("com.mysql.jdbc.Driver"); 字符串拼写错误
Unknown database mydb;
错误原因:
数据库名称拼写错误
Access denied for user ‘root123’@‘localhost’ (using password: YES)
错误原因:
数据库用户名或者密码错误
Table ‘py-school-db.mydb’ doesn’t exist
错误原因:
表不存在,也可能表名写错了