MySQL基础学习知识点和重点(三)JDBC操作和连接池

本文详细介绍了JDBC的基础知识,包括理解JDBC的概念、JDBC程序的开发步骤、Statement对象的问题及PreparedStatement对象的使用。同时,讲解了如何通过JDBC处理事务,包括事务的注意事项和相关API。此外,探讨了数据库连接池的重要性,特别是Druid连接池的使用步骤,以及DAO设计模式的简介和commons-dbutils工具类的应用。
摘要由CSDN通过智能技术生成

一、JDBC

1.1 理解JDBC

1.1.1 概述

(1)JDBC:Java Database Connectivity JAVA连接数据库
简单的说,JDBC代表一组API(应用程序接口),一个独立于特定数据库管理系统(DBMS)、通用的SQL数据库存取和操作的公共接口(一组API)。
(2)驱动:每个数据库厂商对JDBC的接口的实现类。
JDBC的API是SUN公司提供的,而这些接口的实现类(驱动)由数据库厂商提供。
(3)JDBC、驱动和mysql数据库的流程是:
Java Application程序 先调用 JDBC 再调用数据库所对应的驱动(这里是mysql),最后进去数据库层的操作。
(4)JDBC目的:为了使java代码可以跨数据库,JDBC的代码尽量不动(少动),设计一组公共接口(标准),规定了所有操作。

1.1.2 JDBC程序的开发步骤

1、把驱动jar引入项目中
在java项目中,已经建立一个libs, 把数据库驱动:mysql-connector-java-5.1.36-bin.jar放入到文件夹中,然后添加到build-path路径下。
(驱动下载,大家可以参考。百度云网盘:https://pan.baidu.com/s/1adYbh1IUdGuKiP20h57rbQ 提取码:7xan)
2、编写JDBC代码

1.1.3 JDBC程序的代码步骤

1、注册驱动
Class.forName("驱动类的全名称");

对于mysql:驱动类的全名称有两个,都可以使用,建议新版。
新版:mysql:com.mysql.jdbc.Driver 老版:org.gjt.mm.mysql.Driver

2、获取连接

(1)String mysqlurl = “jdbc:mysql://主机地址:端口号/数据库名”
主机地址:localhost;mysql 端口号:3306, 这么数据库用test库,
url是网址,即统一资源定位符。其中jdbc是协议,mysql是子协议。
即: String url = "jdbc:mysql://localhost:3306/test";
(2)String username = "用户名";
即mysql的主机用户,一般是"root"
(3)String password = "密码";
即mysql登录密码
(4)Connection conn = DriverManager.getConnection(url,username,password);
用驱动管理类获取连接,Connection接口和DriverManager类都在java.sql包。

3、编写sql

String sql = "xxx";其中xxx即我们写的sql语句。

4、创建Statement对象

Statement st = conn.createStatement();这里是创建的Statement对象来接收sql语句的操作,但是Statement对象有三个致命问题,这在下一章节讲,以后尽量用改进的PreparedStatement对象。

5、执行Sql语句,接收结果

(1)更新:添加、修改、删除

int len = st.executeUpdate(sql);

(2)查询

ResultSet rs = st.executeQuery(sql);
while(rs.next()){
   
xxx xxx = rs.getXxx(字段名或者序号);//序号从1开始
}

==注意:==这里执行sql语句把sql代入了,而创建Statement对象时没有代入sql。这与PreparedStatement对象正好相反。写代码的时候注意下!

6、关闭连接
rs.close();
st.close();

1.1.3 Statement的三个问题

1.sql的拼接问题

例如:从键盘输入员工信息,并添加到test数据库的t_employee表中。
在1.1.3程序代码的第3步,编写sql语言时,如果我们只加入ename,tel,gender,salary信息,其他字段为null,那么sql要写的代码为:

String sql = "insert into t_employee(ename,tel,gender,salary) values('"+ename +"','"+tel+"','"+gender+"','"+salary+"')";

这里重点说下values括号里面的写法:java中的sql里传变量时使用单引号界定引进的变量,然后在变量里面用java的字符串拼接方法" + ename +"。
可以看出来,如果字段稍微多一点,这样的用Statement对象的写法很复杂。

2.sql的注入问题

sql注入问题会有造成盗取信息。
例如:根据姓名到t_employee表中查自己的信息。
在编写sql语句时,

String sql ="select * from t_employee where ename = '"+ ename +"'";

在键盘输入ename时,输入: 张三 ’ or ‘1’='1
这样的sql语句就变成了select * from t_employee where ename = ’ 张三 ’ or ‘1’='1 ’
可以注意到,这个sql在where筛选后所有行都恒成立,将把所有人的信息导出,就会发生盗取信息。

3、sql拼接不支持blob等二进制类型

这是因为因为java中字符串拼接得到的是String类型

1.1.4 PreparedStatement对象

为了解决Statement对象的三个问题,引入PreparedStatement对象。
原代码的第一步注册驱动和第二步获取连接不变。
1.为了解决sql拼接问题:
(1)编写sql:

String sql = "insert into t_employee(ename,tel,gender,salary) values(?,?,?,?)";

==注意:==此处用占位符’?'放在sql语句values中占位;
(2)创建PreparedStatement对象

PreparedStatement pst = conn.prepareStatement(sql);

要先传入sql,对带?的sql进行预编译。注意这里在创建PreparedStatement对象的时候就已经代入了sql。
(3)把?的具体值传进入

  pst.setObject(1, ename);//序号都是从1开始
  pst.setObject(2, tel);
  pst.setObject(3, gender);
  pst.setObject(4, salary);

其中1表示第一个?占位符位置,2表示第二个?占位符位置。
ename,tel,gender,salary都是用Scanner扫描的键盘输入字符串。
(4)更新执行sql

int update = pst.executeUpdate();//这里不能再传sql
  System.out.println(update>0?"添加成功"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值