目录
1、概念
-
JDBC:Java Database Connectivity Java数据库连接
-
本质:SUN公司定义的一套操作所有关系型数据库的接口。各个数据库厂商去实现这套接口来实现与Java的连接。
2、快速入门
步骤
- 导入驱动jar包(mysql-connector-java-x.x.xx.jar)
- 注册驱动,将jar包中的Driver类加载到内存中
- 通过驱动管理类(DriverManager)的getConnection方法获取连接对象,需要参数:url,username,password
- 定义SQL语句
- 获取执行SQL的对象(Statement)
- 调用Statement对象相应的方法执行SQL对象并返回结果
- 处理结果
- 释放资源:关闭结果集、关闭SQL执行对象,关闭连接对象
3、各个对象简介
(1)DriverManager
DriverManager 驱动管理对象
功能:
- 注册驱动
- 获取连接
注册驱动
告诉程序该使用哪一个数据库驱动,通过DriverManager类的静态方法static void registerDriver(Driver driver);
注册指定的驱动程序
写代码可以使用Class的静态方法把Driver类加载到内存中,即可自动注册驱动
Class.forName("com.mysql.jdbc.Driver");
//mysql5之后的驱动jar包可以省略注册驱动的步骤。
//通过查看源码发现:在com.mysql.jdbc.Driver类中有静态代码块:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
获取连接
获取数据库连接的对象,可以通过连接的方法来操作数据库中的数据
方法:static Connection getConnection(String url,String user,String password);
参数:
- url:指定的连接路径 ,格式
jdbc:mysql://host:port/database
- 例:
jdbc:mysql://172.0.0.1:3306/test
- 例:
- user:用户名
- password:密码
(2)Connection
数据库连接对象
功能:
- 获取SQL执行对象
Statement createStatement()
获取执行静态SQL的对象StatementPreparedStatement preparedStatement(String sql)
获取执行动态预编译SQL的对象
- 管理事务
setAutoCommit(boolean aotuCommit)
调用方法设置参数为false即为开启事务commit()
提交事务rollback()
回滚
(3)Statement
执行静态SQL语句并返回结果
boolean execute(String sql)
可以执行任意sql语句,返回布尔值int executeUpdate(String sql)
执行DML(增、删、改)语句,和DDL(create、alter、drop)语句,返回int值为受影响行数ResultSet executeQuery(String sql)
执行DQL(select)语句,返回结果集ResultSet结果集
(4)ResultSet
结果集对象,封装查询结果
获得:通过Statement调用executeQuer(String sql)
方法返回查询的结果集
使用:
- 方法:
方法名 | 说明 |
---|---|
boolean next() | 将光标向下移动一行,如果不为null返回true,否则返回false |
XXX getXXX(String ) | 结果集读取数据的方法主要是getXXX(),他的参数可以是整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列 是空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false.使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有: 基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日 期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型 (BigDecimal和BigInteger等)等。还可以使用getArray(intcolindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用 getAsciiStream(intcolindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。 |
(5)PreparedStatement
预编译的执行SQL对象
- SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。
- 输入任意用户名,输入密码:
a' or 'a' = 'a
- SQL:
select * from account where username = 'afafdf' and password = 'a' or 'a' = 'a';
- 输入任意用户名,输入密码:
- 解决SQL注入问题:使用PreparedStatement对象执行SQL
- 预编译的SQL中
?
作为占位符
用法:
- 定义SQL语句,可变参数用
?
代替String sql = "select * from account where username = ? and password = ?"
- 创建SQL预编译对象
PreparedStatement prepState connection.preparedStatement(sql);
- 给可变参数
?
赋值。赋值方法:prepState.setXXX(int index,XXX xxx);
- 第一个参数:
?
的索引编号,从1开始 - 第二个参数:
?
的值
- 执行SQL:
ResultSet rs = prepState.executeQuery();
执行查询方法不需要传入sql - 处理结果集
- 释放资源