Java JDBC学习
JDBC
什么是JDBC
Java Database Connectivity ,Java连接数据库的规范(标准),可以使用Java语言连接数据库完成CRUD操作。
JDBC核心思想
Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver数据库驱动)。
JDBC API
JDBC开发步骤
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");手动加载字节码文件到JVM中。
2.连接数据库
通过DriverManagergeConectionurl,user,pasword)获取数据库连接对象
DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8","root","123456");
URL(Uniform Resource Locator)统一资源定位符∶由协议、IP、端口、SID(程序实例名称)组成
3.获取发送SQL的对象
通过Connection对象获得Statement对象,用于对数据库进行通用访问。
Statement statement=connection.createStatement();
4.执行SQL语句
执行SQL语句,并接收执行结果
int result=statement.executeUpdate(sql);//sql是字符串类型的SQL语句
5.释放资源
statement.close();
connection.close();
6.示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Demo1 {
public static void main(String[] args) throws Exception{
//注册驱动 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
Connection connection= DriverManager
.getConnection("jdbc:mysql://localhost:3306/mydatabase"
, "root"
,"123456");
if (connection!=null){
System.out.println("连接数据库成功");
}else {
System.out.println("连接失败");
}
Statement statement=connection.createStatement();
String sql="insert into student (stuid,stuname,age) values(1001,'java',12)";
int count=statement.executeUpdate(sql);
System.out.println(count);
}
}
数据结果
连接数据库成功
1
ResultSet(结果集)
在执行查询SQL后,存放查询到的结果集数据。
1.接受收结果集
ResultSet rs=statement.executeQuery(sql);
2.遍历ResultSet中的元素
3.常见错误
SQL注入问题
用户输入的数据中有SQL的关键字或语法并且参与了SQL语句的编译,导致SQL语句编译后的条件含义为true,一直得到正确结果,就是SQL注入
如何避免
由于编写的SQL 语句是在用户输入数据,整合后再进行编译。所以为了避免SQL注入的问题,我们要使SQL语句在用户输入数据前就已进行编译成完整的SQL 语句,再进行填充数据。
PreparedStatement
PreparedStatement继承了Statement接口,执行SQL语句的方法无异。
PreparedStatement的应用
作用:
- 预编译SQL语句,效率高。
- 安全,避免SQL注入。
- 可以动态的填充数据,执行多个同构的SQL语句
1.参数标记
PreparedStatement pstmt = conn.prepareStatement('select* from user where username=? and password=?");
注意∶JDBC中的所有参数都由?符号占位,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。
2.动态参数绑定
pstmt.setXxx(下标,值)
注:下标从1开始
封装工具类
- 为了方便使用,在实际JDBC的使用中,存在着大量的重复代码∶例如连接数据库、关闭数据库等这些操作!
- 我们需要把传统的JDBC代码进行重构,抽取出通用的JDBC工具类!以后连接任何数据库、释放资源都可以使用这个工具类。
1、重用性方案
封装获取连接、释放资源两个方法。
- 提供public static Connection getConnection()方法。
- 提供public staticvoid closeAll(Connection conn, Statement sm, ResultSet rs)得方法。
实现
import java.sql.*;
public class DBUtils {
static {
try {
Class.forName("com.mysql.jdbc.Driver");//运行一次后之后不在执行了
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection connection=null;
try {
connection= DriverManager
.getConnection("jdbc:mysql://localhost:3306/mydatabase"
, "root"
,"123456");
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){
try {
if(resultSet!=null){
resultSet.close();
}
if (statement!=null){
statement.close();
}
if(connection!=null){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
Date工具类
现有问题∶数据库存储的数据类型为java.sqL.Date。而我们Java应用层存储日期类型为java.util.Date。当我们用Java应用程序插入带有日期的数据到数据库中时,需要进行转换。
SinpleDateFormat
格式化和解析日期的具体类。允许进行格式化(日期>文本)、解析(文本>日期))和规范化。
转换方法
package com.qf.person;
import java.text.SimpleDateFormat;
public class TestTimes {
public static void main(String[] args)throws Exception {
//获得当前系统的日期时间
System.out.println(new java.util.Date());
//字符串:自定义日期
String str="1999-09-09";
//将字符串转换成Util.Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//parse方法转换为util.Date
java.util.Date date = sdf.parse(str);
System.out.println(date);
//format方法转换为String类型
String dates = sdf.format(new java.util.Date());
System.out.println(dates);
//sql.Date 不支持字符串转换 只支持毫秒值创建
//通过util.Date拿到指定日期的毫秒值,转换为sql.Date
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
System.out.println(sqlDate);
}
}
封装
package com.qf.person;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class DateUtils {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//1.字符串转换为util.Date
public static java.util.Date strToUtil(String str){
try {
java.util.Date date = sdf.parse(str);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
//2.util.Date转换为sql.Date
public static java.sql.Date utilToSql(java.util.Date date){
return new java.sql.Date(date.getTime());
}
//3.util.Date转换为字符串形式
public static String utilToStr(java.util.Date date){
return sdf.format(date);
}
}