JDBC是啥?
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现
JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。我们只需要改少量代码,调用厂商的接口,不用在意具体怎么实现。
JDBC操作步骤
1.导入jar包和初始化驱动
以mysql为例,我电脑用的mysql5.5,可以选择高版本的mysql-connector-java-n8.0.jar
- 初始化驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
注意mysql8.0以上要用注册驱动要把参数改成com.mysql.cj.jdbc.Driver
2.使用Connection连接数据库
使用Connection getConnection (String url, String user, String password)方法
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/数据库[?参数名=参数值]","root", "admin")
注意
- url最好加上可以指定参数: ?characterEncoding=utf8,统一urrt-8来处理数据库。
3.使用Statement执行sql语句
- int executeUpdate(String sql)
用于发送 DML 语句,增删改的操作,返回受影响的行数 - ResultSet executeQuery(String sql)
用于发送 DQL 语句,执行查询的操作,返回结果集
4.使用ResultSet处理结果
- boolean next()
返回 boolean 类型,如果游标到最后一行记录,返回 false,否则返回 ture
5.释放资源
按照先开后关,后关先开的原则,应该
resultset.close()
statement.close()
connnection.close()
防止sql注入问题
什么是sql注入
编写sql,绕过后台直接检验的行为
-示例
String sql = "select * from user where username='" + username + "' and password='" + password + "'"
String username="' or 1=1 --";//后台会通过
使用Statementd的子类Prestatement解决
好处
1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
2、其具有预编译机制,性能比statement更快。
3、其能够有效防止SQL注入攻击。
方法
- int executeUpdate(String sql)
用于发送 DML 语句,增删改的操作,返回受影响的行数 - ResultSet executeQuery(String sql)
用于发送 DQL 语句,执行查询的操作,返回结果集 - set数据类型
- 用于给制定参数给Java数据类型
步骤
- 导入jar包和初始化驱动
- 使用Connection连接数据库
- 使用Pretatement执行sql语句
- 使用ResultSet处理结果
JDBCUitls
由于经常要打开数据库链接资源,关闭资源,需要写一大段代码,所以我们会创造一个工具类,来实现Java与数据库链接的开关
例子:
需要有配置文件
package util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Properties;
/**@author*/
public class JDBCUtil {
private static String driverClass;
private static String url;
private static String username;
private static String password;
private static Connection conn;
static Properties properties = new Properties();
static DataSource dataSource = null;
static{
try {
//获取配置信息
properties.load(JDBCUtil.class.getClassLoader().getResourceAsStream("./jdbc.properties"));
driverClass= properties.getProperty("driverClass");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从连接池获取数据库连接
* @return
*/
public static Connection getConnection() {
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Statement stat,Connection conn){
//关闭
if(stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement stat, Connection conn, ResultSet res){
if(res != null){
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭
if(stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}