数据库笔记06 JDBC
文章目录
一.JDBC介绍:
JDBC(JAVA DATA BASE CONNECTIVITY)是一种规范:使用JAVA语言和数据库建立连接并操作数据库的一套规范,其实就是一套接口和类,各家数据库厂商,如果想要java程序操作它们的数据库,就需要实现这套规范,我们把数据库厂商写的实现类,叫做数据库的驱动
JDBC入门程序:
【注意:此处使用的是mysql5.7对应的jdbc的jar包】
- 1)导入数据库厂商写的数据库驱动jar包:新建lib->右键添加依赖
- 2)加载驱动:通过反射加载,使用:
Class.forName("com.mysql.jdbc.Driver");
- 3)建立连接,返回连接对象:
DriverManager[驱动管理类].getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");
//三个参数:url , 用户 , 密码
将上面的连接对象接收,在下面的结果中输出conn看是否连接成功:
Connection conn=上面的语句
- 4)获取操作对象:
Statement.statement conn.createStatement();
statement.executeUpdate("对应的SQL语句操作");
//执行SQL增删改,返回值是改变的行id
- 5)操作结束之后注意释放资源:
conn.close();
statement.close();
//一定要记得释放资源(!!非常重要!!)
二.mysql驱动:
关于mysql中的数据驱动中几个类的介绍:(适配mysql 5.7)
- DriverManager驱动管理类,其中有方法可以获取连接对象
- Connection是一个连接对象,是一个接口,返回的对象是接口的子类对象
- 数据库URL,同样符合url的定义规范:主协议:子协议://主机:端口/资源路径(连接本地端口可以省略)
- 注册驱动这句语法同样可以不写,注册驱动不写也会加载,但是为了清晰好解释,在其中加上
- statement操作对象,同样也是接口,用于执行sql语句和接收接口子类对象
操作对象中有两个最常用的方法:
- 1)操作增删改语句:
executeUpdate("sql语句"); //DELETE,UPDATE,INSERT
- 2)操作查询语句:
executeQuery("sql语句"); //SELECT语句
- 3)不常用的方法:(发送任何sql语句)
execute("sql语句");
三.JDBC查询语法:
程序示例如下:
tatement.executeQuery("对应语句"); //返回的类型是结果集对象!
//对该对象的接收有:
ResultSet resultset = statement.executeQuery("对应sql语句");
//在结果集对象中取数据:
while(resultset.next()){
//还有下一行数据吗,没有的话返回false
int emp_no = resultset.getInt("emp_no[列名或列号取数据]");
//第一列是int型,进行访问
String emp_name = resultset.getString("emp_name");
//第二列是varchar类型,用string接收
//分别将得到的信息进行打印
//注意最后在释放资源还要有一个: resultset.close(); 释放结果集资源
}
结果集封装:
将取到的结果集数据要封装到一个类中:新建一个类,其中的成员变量对应的是数据库表中的字段名,字段名与成员变量名名称要与类对应表中的数据类型相匹配,但是数据类型上,可以与表中保持一致,但是使用包装类Integer类型也可以(同样double–>Double等等),注意在定义完成员变量之后设定对应的set/get/toSring/构造方法等
,最后可以在外部程序新建一个集合:
ArrayList<新建的封装类> list = new ArrayList<>();
四.使用idea连接数据库:
- 右边database->加号新建->MySQL(下载驱动,登陆,配置driver文件)
- database中进行对应操作是图形界面化的形式
- 连接上数据库之后程序中语句不会报错并且还会有对应提示
- 在右上角可以打开控制行对数据库中数据进行控制以及显示
- 在手动修改数据库中的数据之后记得在界面上找到提交按钮提交保存
五.用JAVA登录数据库:
- 用JAVA在登录数据库时首先注意:在拼串时注意sql语句中本身就有单引号作为where中的条件,拼串时不要删除
- 对应可能产生的安全问题:SQL注入
即:不知道用户名和密码可以依旧成功:用户名和密码都是"1'or'1'='1"
等于拼串时将sql在where判断时成立 - 防止sql注入的方法:预编译:
1)将操作对象由statement
改为使用preparedStatement
,不需要拼串,用?
作为参数占位符
2)将查询语句改为:
String str = "select * from user where username=? and password=?"
使用PreparedStatement:
preparedStatement s= conn.preparedStatement(str); //发送查询语句
preparedStatement.setString(1,username); //发送后进行预编译
preparedStatement.setString(2,password); //进行预编译演示
六.将登陆数据库模板抽成工具类:
将代码登陆模板抽成一个工具类,最后将连接对象进行返回,目的:为了方便后续每次与数据库进行连接,增加了代码的复用性:
示例源码:
import java.sql.*;
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private JDBCUtils() {
}
static {
try {
Class.forName("com.mysql.jdbc.Driver");
//"jdbc:mysql:///mydb", "root", "123456" //这样做会将数据写死,不利于交互,需要使用配置文件进行编辑
url = "jdbc:mysql:///mydb";
user = "root";
password = "123456";
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConnection() throws SQLException {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
//释放资源的方法
public static void colse(Connection conn, Statement statement, ResultSet resultSet) throws SQLException {
if (conn != null) {
conn.close();
}
if (statement != null) {
statement.close();
}
if (resultSet != null) {
resultSet.close();
}
}
//释放资源的方法重载,在没有得到结果的时候
public static void colse(Connection conn, Statement statement) throws SQLException {
if (conn != null) {
conn.close();
}
if (statement != null) {
statement.close();
}
}
}
针对工具类中出现的数据写死问题:driverclass,url,user,password,写成配置文件进行书写和编辑会更加具有灵活性
七.批量处理和调用:
将大量数据插入到对应的表中,除了使用传统的按行插入的方法之外,可以进行批处理:
preparedStatement.addBatch(); //添加批处理,将数据缓存
preparedStatement.executeBatch(); //在循环外,统一执行
preparedStatement.clearBatch(); //清除批处理
这样的好处是效率相对于传统的while循环+插入这种模式效率会更高