名词解释
数据库
当前阶段学习数据库,主要学习的是如何对数据进行增删改查操作.
SQL
Structured Query Language: 结构化查询语言, 通过此语言让程序员和数据库软件进行交流
DBMS
DataBaseManagementSystem: 数据库管理系统(数据库软件)
常见的几种DBMS:
定义:JavaDataBaseConnectivity: Java数据库链接
- 学习JDBC主要学习的就是如何通过Java语言和MySQL数据库进行链接并执行SQL语句.
- JDBC是Sun公司提供的一套专门用于Java语言和数据库进行链接的API(Application Programma Interface应用程序编程接口)
- 使用JDBC的原因 : Sun公司为了避免Java程序员,每一种数据库软件都学习一套全新的方法,通过JDBC接口将方法名定义好, 让各个数据库厂商根据此接口中的方法名写各自的实现类(就是一个jar文件, 称为数据库的驱动) ,这样Java程序员只需要掌握JDBC接口中方法的调用,即可访问任何数据库软件.
链接数据库
- 创建Maven工程
- 在工程的pom.xml文件中 添加MySQL驱动的依赖坐标
- 创建cn.tedu.Demo01.java文件 添加以下代码
建立连接步骤 :
- 创建链接对象 异常抛出
- 创建执行SQL语句的对象
- 执行SQL语句 execute执行
- 关闭资源
//1.创建链接对象 异常抛出
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false",
"root","root");
System.out.println("链接对象:"+conn);
//2.创建执行SQL语句的对象
Statement s = conn.createStatement();
//3.执行SQL语句 execute执行
s.execute("create table jdbct1(age int)");
//4.关闭资源
conn.close();
System.out.println("执行完成!");
Statement接口的方法
Statement是执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。
s.execute(“所有的SQL语句“);
- 此方法可以执行任意SQL语句, 但建议执行DDL(数据库相关和表相关的SQL语句)
- int row = s.executeUpdate(“增删改的SQL语句“);
- 此方法用来执行增删改相关的SQL语句, 返回值表示生效的行数
- ResultSet rs = s.executeQuery(“查询的SQL语句“);
- 此方法用来执行查询相关的SQL语句,返回值ResultSet叫做结果集对象,查询到的数据都装在此对象中
- 遍历结果集对象
while (rs.next()){
//获取游标指向的这条数据的某个字段的值,通过字段名获取
String name = rs.getString("name");
double sal = rs.getDouble("sal");
//通过查询回来数据的位置获取数据
String name=rs.getString(1);
double sal=rs.getDouble(2);
System.out.println(name+"\t"+":"+sal+"\t");
}
DBCP
- DataBaseConnectionPool, 数据库连接池
- 作用: 将连接重用,从而提高执行效率
-
创建连接
public class DBUtils {
private static DruidDataSource ds;
static {
/*创建连接池对象*/
ds=new DruidDataSource();
/*设置数据库连接信息 URL 用户名 ,密码*/
ds.setUrl("jdbc:mysql://localhost:3306/empdb?
characterEncoding=utf8&serverTimezone=Asia
/Shanghai&useSSl=false");
ds.setUsername("root");
ds.setPassword("root");
/*设置初始连接量*/
ds.setInitialSize(3);
/*设置最大连接量*/
ds.setMaxActive(5);
}
public static Connection getCoon() throws SQLException {
/*从连接池中获取连接 异常抛出*/
Connection conn=ds.getConnection();
System.out.println("连接对象:"+conn);
return conn;
}
}
//创建对象
try (Connection coon=DBUtils.getCoon()) {
//插入内容
} catch (SQLException throwables) {
throwables.printStackTrace();
}
PreparedStatement接口
PreparedStatement接口是Statement接口的子接口,使用它的好处有三个
一:简化代码,便于sql语句的书写.
二:有效的禁止sql语句的注入,例如:用户名和密码,使用PreparedStatement接口的方法,可防止不正确的输入登陆成功,提高数据库系统的安全性.
三:最大可能的提高了效率.预编译的SQL执行对象
此对象可以将编译SQL语句的时间点提前,提前后可以将SQL语句逻辑部分提前锁死, 用户输入的内容将不能影响原有SQL语句的逻辑部分,从而解决了SQL注入的问题
- 如果SQL语句中存在变量,则必须使用PreparedStatement,解决SQL注入问题, 而且可以提高开发效率(避免了拼接字符串)
- 如果SQL语句中没有变量,可以使用Statement或PreparedStatement
原理 :
- 创建SQL语句的时候,所有的变量用问号代替,然后每个问号对应自己的编号,会在后面重新赋值,
- 通过执行conn.prepareStatement(sql)方法,获取PreparedStatement对象,并且将sql语句传进去.
- 编译SQL语句的时间点从之前执行时,提前到了创建对象时,好处是此时编译用户输入的内容还不在sql语句里面,只是将原有的语句进行编译,此时可以将原有的sql语句的逻辑部分锁死
- 把?替换成我要设置的值.通过小标去获取,
- 此时替换时只能以值的形式添加到原有SQL语句中,因为逻辑部分已经编译好 已经锁死,这样用户输入的内容则不会影响原有SQL语句的逻辑。
- 通过调用ps.executeQuery()方法,执行SQL语句代码,获取返回值内容,对其进行操作.
/*通过PreparedStatement解决SQL注入问题*/
String sql ="select count(*) from user where username=? and password =?";
/*编译SQL语句的时间点从之前执行时,提前到了创建对象时,
好处是此时编译用户输入的内容还不在sql语句里面,只是将原有的语句进行编译,
此时可以将原有的sql语句的逻辑部分锁死*/
PreparedStatement ps= conn.prepareStatement(sql);
/*把?替换成变量 1和2代表的是?的位置
此时替换时只能以值的形式添加到原有SQL语句中,因为逻辑部分已经编译好 已经锁死,
这样用户输入的内容则不会影响原有SQL语句的逻辑。*/
ps.setString(1,username);
ps.setString(2,password);
//执行修改后的代码
ResultSet rs =ps.executeQuery();