主要内容:
- 能够理解JDBC的概念
- 能够使用DriverManager类
- 能够使用Connection接口
- 能够使用Statement接口
- 能够使用ResultSet接口
- 能够说出SQL注入原因和解决方案
- 能够通过PreparedStatement完成增、删、改、查
- 能够完成PreparedStatement改造登录案例
1 JDBC入门
1.1 客户端操作MySQL数据库的方式
- 使用第三方客户端来访问MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL;
- 使用MySQL自带的命令行方式;
- 通过Java来访问MySQL数据库,今天要学习的内容。
1.2 JDBC的基本概念
-
概念:Java DataBase Connectivity(Java 数据库连接),Java语言操作数据库
-
本质:是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商提供各自的实现类去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
-
优点:
- 程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的;
- 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库。
1.3 JDBC依赖包与核心API
- JDBC开发使用到的包:
使用到的包 说明 java.sql 所有与JDBC访问数据库相关的接口和类 javax.sql 数据库扩展包,提供数据库额外的功能。如:连接池 数据库驱动 由各大数据库厂商提供,需要额外去下载,是对JDBC接口实现的类 - JDBC的核心API:
接口或类 作用 DriverManager类 1. 管理和注册数据库驱动
2. 得到数据库连接对象Connection接口 一个连接对象,可用于创建Statement和PreparedStatement对象 Statement接口 一个SQL语句对象,用于将SQL语句发送给数据库服务器 PreparedStatement接口 一个SQL语句对象,是Statement的子接口 ResultSet接口 用于封装数据库查询的结果集,返回给客户端Java程序
2 JDBC操作步骤
2.1 导入驱动Jar包
- 复制
mysql-connector-java-5.1.37-bin.jar
到项目的lib
目录下:
右键
→ Add As Library :
2.2 加载和注册驱动
-
语法:
Class.forName(数据库驱动实现类)
数据库驱动由数据库厂商提供:- MySQL驱动类名:
com.mysql.jdbc.Driver
; - Oracle驱动类名:
oracle.jdbc.driver.OracleDriver
; - SQL server驱动类名:
com.microsoft.jdbc.sqlserver.SQLServerDriver
。
public class Demo1 { public static void main(String[] args) throws ClassNotFoundException { //抛出类找不到的异常,注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); } }
- MySQL驱动类名:
-
为什么这样可以注册驱动?
查看Class.forName(String className)
源码:@CallerSensitive public static Class<?> forName(String className) throws ClassNotFoundException { Class<?> caller = Reflection.getCallerClass(); return forName0(className, true, ClassLoader.getClassLoader(caller), caller); }
再看
forName0
方法:private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader, Class<?> caller) throws ClassNotFoundException;
forName0 是一个 native 方法(由非java语言实现),返回一个给定类或者接口的一个 Class 对象,如果没有给定 ClassLoader, 那么会使用根类加载器。如果 initalize 这个参数传了 true,那么给定的类如果之前没有被初始化过,则会被初始化。JDBC 传入的参数是
com.mysql.jdbc.Driver
。也就是说这个类会被初始化,查看这个类的源码:public class Driver implements java.sql.Driver { static { try { DriverManager.registerDriver(new Driver()); //注册数据库驱动 } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } public Driver() throws SQLException { } }
类在初始化的时候,静态代码块的内容会被执行的。也就是说我们
Class.forName
和直接写DriverManager.registerDriver(new Driver)
两者功能是等同的。注:从JDBC3开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。
2.3 获取数据库连接
- DriverManager类:驱动管理对象。
-
Connection getConnection (String url, String user, String password)
:通过连接字符串,用户名,密码来得到数据库的连接对象;url
:数据库连接路径,用于标识数据库的位置,告知JDBC程序连接哪个数据库。- 格式:
协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
- MySQL格式:
jdbc:mysql://ip地址(域名):端口号/数据库名称?参数=参数值
注:如果连接的是本地服务器,并且端口号是3306,可简写为:
jdbc:mysql:///数据库名称
。
- 格式:
user
:登录的用户名。password
:登录的密码。- 乱码处理:指定参数 ?characterEncoding=utf8,表示让数据库以UTF-8编码来处理数据。
jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Demo2 { public static void main(String[] args) throws SQLException { //使用用户名、密码、URL得到连接对象 String url = "jdbc:mysql://localhost:3306/day24"; Connection connection = DriverManager.getConnection(url, "root", "root"); System.out.println(connection); //com.mysql.jdbc.JDBC4Connection@68de145 } }
-
Connection getConnection (String url, Properties info)
:通过连接字符串,属性对象来得到连接对象。import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class Demo3 { public static void main(String[] args) throws SQLException { //url连接字符串 String url = "jdbc:mysql://localhost:3306/day24"; //属性对象 Properties info = new Properties(); //把用户名和密码放在info对象中 info.setProperty("user", "root"); info.setProperty("password", "root"); Connection connection = DriverManager.getConnection(url, info); System.out.println(connection); //com.mysql.jdbc.JDBC4Connection@68de145 } }
-
2.4 执行sql语句
- Connection接口:数据库连接对象。
Statement createStatement()
:创建一条SQL语句对象。
- ResultSet接口:结果集对象,用于封装查询结果。
-
boolean next()
:游标向下移动1行,判断当前指向的记录是否还有下一条记录,如果还有下一条返回true;否则返回false。 -
参数数据类型 getXxx(参数)
:- 通过列名:
getInt(“id”),getString(“name”),getBoolean("gender "),getDate(“birthday”) - 通过列号:
getInt(1), getString(2),getBoolean(3),getDate(4)
常用数据类型转换表:SQL类型 JDBC对应方法 返回类型 BIT(1) bit(n) getBoolean() boolean TINYINT getByte() byte SMALLINT getShort() short INT getInt() int BIGINT getLong() long CHAR,VARCHAR getString() String Text(Clob) Blob getClob getBlob() Clob Blob DATE getDate() java.sql.Date 只代表日期 TIME getTime() java.sql.Time 只表示时间 TIMESTAMP getTimestamp() java.sql.Timestamp 同时有日期和时间 java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:
java.util.Date
。 - 通过列名:
-
- Statement接口:代表一条语句对象,用于发送SQL语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
-
释放资源:
- 需要释放的对象:ResultSet结果集,Statement语句,Connection连接;
- 释放原则:先开的后关,后开的先关。ResultSet → Statement → Connection;
- 放在哪个代码块中:finally块。
-
Statement中的方法:
-
int executeUpdate(String sql)
:执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句,返回对数据库影响的行数。-
执行DDL操作:使用JDBC在MySQL的数据库中创建一张学生表。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Demo4DDL { public static void main(String[] args) { //1. 创建连接 Connection conn = null; Statement statement = null; try { conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root"
-
-
-