JDBC-访问【关系型数据库】的API标准(侧重原理)
项目的三层结构
前台 | 后台 | 底层 |
---|---|---|
浏览器 | 服务器 | 数据库服务器 |
Java | SQL |
Java学习阶段
Java语言:基础语法、面向对象、API。
Java技术:JDBC技术、Servlet技术、JSP技术等。(侧重原理)
Java框架:SpringBoot框架、Spring框架、SpringMVC框架、Mybatis框架。
JDBC技术:Java、数据库连接标准
理解:【Java语言】访问【关系型数据库】的API标准。JDBC是用Java语言向数据库发送SQL语句。
理解:JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
了解:JDBC是JavaEE平台核心技术之一。
JDBC核心类(接口)介绍
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
DriverManger(驱动管理器)的作用有两个:
l 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
l 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
l Connection最为重要的一个方法就是用来获取Statement对象;
l Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句
l void executeUpdate(String sql):执行更新操作(insert、update、delete等);
l ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:
l boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
l XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
PreparedStatement是什么?
PreparedStatement叫预编译声明!
PreparedStatement是Statement的子接口,你可以使用PreparedStatement来替换Statement。
PreparedStatement的好处:
l 防止SQL攻击;
l 提高代码的可读性,以可维护性;
l 提高效率。
PreparedStatement的使用
l 使用Connection的prepareStatement(String sql):即创建它时就让它与一条SQL模板绑定;
l 调用PreparedStatement的setXXX()系列方法为问号设置值
l 调用executeUpdate()或executeQuery()方法,但要注意,调用没有参数的方法;
Mysql准备工作
数据库:db0419
表:person
字段:id、name、sal、bir
JDBC准备工作
新建lib文件夹
把mysql的启动jar包拷贝到lib中
把jar包添加到类路径中
Intellij IDEA将 .jar 文件置于类路径(classpath):
File => Project Structure =>Modules => Dependencies => 点击加号 =》 选择:JARs or directories =》选择想要导入的 .jar文件,点击下方 “OK”。
JDBC标准访问数据库要求
掌握一:JDBC实现添加、修改、删除的步骤。
import java.sql.DriverManager;//驱动管理类
import java.sql.SQLException;
import java.sql.Connection;//和数据库连接的接口
import java.sql.PreparedStatement;
public static void main(String[] args) {
// TODO (2)JDBC实现添加、修改、删除的7个步骤
try {
// 第一步:加载驱动(驱动类的路径)
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接(数据库访问地址、用户名、密码)
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db0419", "root", "123456");
// 第三步:设置事务为手动提交
conn.setAutoCommit(false);
// 第四步:编写SQL语句的句式、获取语句对象(?占位符)
String sql = "insert into person(name, sal, bir) values(?,?,?)";
String sql = "update person set name=?, sal=? where id=?";
String sql = "delete from person where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);//(ps就表示添加等语句的实例了)
// 第五步:传入SQL语句参数、执行SQL语句
ps.setString(1, "李四");(1表示第一个问号,占位的是名字,String类型)
ps.setDouble(2, 4444);
ps.setString(3, "2000-01-21");//注意,在这里,日期用字符串类型表示
// 返回的int整数表示添加(修改、删除)的个数
int c = ps.executeUpdate();
System.out.println(c);
// 第六步:提交事务
conn.commit();
// 第七步:关闭连接
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
掌握二:JDBC实现查询的步骤
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;//结果集
public static void main(String[] args) {
// TODO (3)JDBC实现查询5个步骤
try {
// 第一步:加载驱动(驱动类的路径)
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接(数据库访问地址、用户名、密码)
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db0419", "root", "123456");
// 第三步:编写SQL语句、获取语句对象
String sql = "select * from person where sal between ? and ? order by id desc";
PreparedStatement ps = conn.prepareStatement(sql);
// 第四步:设置SQL参数、执行SQL语句
ps.setDouble(1, 3000);
ps.setDouble(2, 5000);
ResultSet rs = ps.executeQuery();
// rs.next()判断是否有下一条记录
while (rs.next()) {//判断是否有下一条记录
// 当前记录的各个字段获取出来
System.out.println(rs.getInt("id") + rs.getString("name") + rs.getDouble("sal") + rs.getString("bir"));
}
// 第五步:关闭连接
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
映射关系原理:
Java | Mysql |
---|---|
类 | 表 |
成员变量 | 字段 |
对象 | 记录 |
JDBC执行 SQL语句分为2个步骤:
第一:sql句式(预编译)
第二:sql参数(后传参)
原因:防 SQL注入攻击!
举例说明:
用户:abc
密码:’ or ‘1’='1
select * from t
where name=‘abc’ and pass=‘’ or ‘1’=‘1’
拓展连接:
jdbcTemplate使用详解