JDBC (一)
第一大块 JDBC概述
一、JDBC概述
- a.概念:Java DataBase Connectivity Java数据库连接,Java语言操作数据库
- b.JDBK本质:其实是官方(sun公司)定义的一套操作所有关系型数据的规则,即接口。
各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用
这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
- c.快速入门:学会如何导入JDBC的jar包,也就是安装驱动。
- d.简单介绍一下JDBC需要使用的对象
DriverManager对象:驱动管理对象
Connection:数据库连接对象
Statement:执行sql对象(使用静态的SQL)
ResultSet:结果集对象
PreparedStatemet:执行sql的对象(预编译的SQL)
第二大块 详解各个对象
一、DriverManager类 java.sql.DriverManager
- a.功能:1.注册驱动 2.获取数据连接
- b.方法:
static void registerDriver(Driver driver) 注册给定的驱动程序 实现通过 Class.forName(“com.mysql.jdbc.Driver”);因为这样注册驱动比较方便,直接在穿件类对象时执行静态代码块注册驱动
Connection getConnection(String url,String user,String password); 获取数据库连接
注意:url 指定连接的路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 其实种数据库使用用的url语法是不一样的
如果连接的是本机的mysql服务器,并且默认端口是3306,则url可以写为jdbc:mysql:///数据库名称
说明:这里其实在参数url中已经是包含了一个数据库的精确的位置信息了,有数据库种类、数据库所在主机的IP地址、数据库的端口号、你要适用的数据库
接着的两个参数其实就是用户的信息了,一个注册了的用户可以连接这个数据库。
二、Connection接口 java.sql.Connection
- a.功能:1.获取sql对象 2.管理事务
- b.方法:
Statement creteStatement()
PreparedStatement prepareStatement(String sql)
void setAutoCommit(boolean autoCommit) false就是开启事务
void commit()
void rollback()
三、Statement接口
- a.功能
- b.方法:
boolean execute(String sql) :可以执行任意的sql 了解
int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
ResultSet executeQuery(String sql) :执行DQL(select)语句
返回值:结果集对象
四、ResultSet接口
- a.功能:
- b.方法:
- boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
- getXxx(参数):获取数据
- Xxx:代表数据类型 如: int getInt() , String getString()
- 参数:
- int:代表列的编号,从1开始 如: getString(1)
- String:代表列名称。 如: getDouble(“balance”)
第三大块 创建自己的工具类JDBCUtil
一、示例展示:实现了数据库安装驱动,建立与数据库连接,数据库资源释放的操作
/*
由于每次对mysql进行操作时都会对一部分繁琐的代码进行操作
所以特地创建这个工具类,方便了对数据操作
1.安装驱动
2.建立和数据库的连接 DriverManager
3.关闭相关资源 Statement Connection ResultSet
*/
public class JDBCUtil {
//配置文件的内容,一是数据库连接字段;二是驱动安装字段;
public static String url,user,password;
public static String driver;
static {
try {
//第一步获取配置文件信息
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtil.class.getClassLoader();
//这里需自己新建配置文件,后缀是.properties
URL res = classLoader.getResource("JDBCpeizhi.properties");
String path = res.getPath();
System.out.println(path);
pro.load(new FileReader(path));
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//第二步:安装驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//获取数据库连接,由配置文件决定
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
//关闭数据库相关资源,有一个是方法的重载
public static void close(Statement stm, Connection con) {
if (stm != null) {
try {
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement stm, Connection con, ResultSet rs) {
if (stm != null) {
try {
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、示例说明解释
- a.说明创建一个工具类的要点
1.创建的成员基本都是静态的,方便直接调用
2.静态代码块是一个很好的选择
- b.在JDBC工具类中用到的额外方法(参考示例中的实际使用)
1.ClssLoader getClassLoader() 获取类加载器
2.URL getResource(String name) 参数:文件名,需要添加后缀 获取文件链接
3.String getPath() 获取完整路径
3.void load(FileReader reader) 读取配置文件信息到Peoperties集合中
4.Sting getProperties(Sting name) 参数:配合文件中的键 key 返回相应的值
- c.配置文件的方法与步骤说明
注意点:配置文件通常不传递绝对路径,绝对路径不方便代码的移植。
步骤:1.获取Properties集合 2.通过当前所在类的类对象获取类加载器 3.获取配置文件路径
4.将配置文件中的数据读取到Properties集合中 5.通过集合获取对应的数据
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtil.class.getClassLoader();
URL res = classLoader.getResource(“JDBCpeizhi.properties”);
String path = res.getPath(); //获取绝对路径
pro.load(new FileReader(path));
url = pro.getProperty(“url”);
第四大块 PrepareStatement接口
一、用PreparedStatement接口解决SQL出现的问题(注入问题)
- a.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
- 输入用户随便,输入密码:a’ or ‘a’ = 'a
- sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’
- b.设置通配符 ? 的参数 参数1是?的位置 || 参数2是需要对?设置的值
void setXxx(int station,参数2)
- c.执行DQL的方法同时获取ResultSet对象
ResultSet executeQuery()
说明:执行sql查询操作时,接受返回结果,不需要传递sql语句 //也就是在创建ResultSet对象时不需要进行传递参数,而Statement对象创建时需要在方法中传递参数;这是因为在创建prepareStatement对象时已经将SQL语句传递进来了
方法总结:按照使用的各个对象来说明了
说明:这里其实是有这么一个逻辑,1.安装驱动
2.与数据库建立连接(此时已经连接到了数据中对应的表中)
3.获取数据库执行对象
4.获取数据库结果集对象
一、DriverManager
- a.注册驱动
Class.forName(“com.mysql.jdbc.Driver”); static void registerDriver(Driver driver)
- b. 获取Connection对象(数据库连接对象)
Connection getConnection(String url,String user,String password);
二、Connection
- a.获取sql对象(这里注意一下两个sql对象的获取方式的特点)
Statement createStatement()
PrepareStatement prepareStatement(String sql)
- b.事务管理方法
void setAutoCommit(boolean autoCommit)
void commit()
void rollback()
三、Statement
- a.执行DML、DDL的方法
int executeUpdate(String sql)
- b.执行DQL的方法同时获取ResultSet对象,但是查看结果需要通过ResultSet对象
ResultSet executeQuery(String sql)
四、PrepareStatement
- a.设置通配符 ? 的参数 参数1是?的位置 || 参数2是需要对?设置的值
void setXxx(int station,参数2)
- b.执行DQL的方法同时获取ResultSet对象,虽然说这个通过PrepareStatement的方法创建ResultSet对象不需要传递参数,但是在创建PrepareStatement对象时传递的参数决定了是否可以调用这个无参方法。
ResultSet executeQuery()
- c.执行DML、DDL的方法
int executeUpdate()
五、Result
- a.移动游标:游标从表头行开始
boolean next()
- b.获取数据
T getXxx(多种参数)