外贸网站建设有什么需要注意的吗,有哪些比较好的企业网站建设,中铁建设集团有限公司领导名单,多媒体资源库网站建设一.什么是JDBC
我们操作数据库是用sql语句#xff0c;那么怎么编写程序来操作数据库呢#xff1f;这就要学习JDBC。
JDBC就是使用Java中操作关系型数据库的一套API。全称#xff1a;( Java DataBase Connectivity ) Java 数据库连接。 JDBC更准确的来说是一套接口/API那么怎么编写程序来操作数据库呢这就要学习JDBC。
JDBC就是使用Java中操作关系型数据库的一套API。全称( Java DataBase Connectivity ) Java 数据库连接。 JDBC更准确的来说是一套接口/API定义了所有操作关系型数据库的规则由SUN公司定义。但接口中各个接口的实现类称之为驱动是由各自的数据库厂商实现的。 我们可以使用这套接口JDBC编程真正执行的代码是驱动 jar包中的实现类。
好处统一一套API替换底层数据库只需要替换驱动就可以了。
JDBC操作数据库的流程 二.使用JDBC操作数据库
注册驱动-获取连接-定义sql-获取执行sql的对象Statement-执行sql-释放资源
具体代码
/**
* JDBC快速入门
*/
public class JDBCDemo {public static void main(String[] args) throws Exception {//1. 注册驱动Class.forName(com.mysql.jdbc.Driver);//2. 获取连接String url jdbc:mysql://127.0.0.1:3306/db1;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username,password);//3. 定义sqlString sql update account set money 2000 where id 1;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//受影响的行数//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();}
}
三.JDBC API详解
总结 DriverManager--获得--Connection--获得--Statement---如果执行查询操作---得到结果集ResultSet对象
1.DriverManager【注册驱动获取连接】
【1】注册驱动
registerDriver方法是用于注册驱动的但是我们之前做的入门案例并不是这样写的。而是如下实现
Class.forName(com.mysql.jdbc.Driver);
因为Driver类中的静态代码块中已经执行了 DriverManager 对象的 registerDriver() 方法进行驱动的注册了那么我们只需要 加载 Driver 类该静态代码块就会执行Class.forName(com.mysql.jdbc.Driver); 就可以加载 Driver 类。
源码实现 MySQL 5之后的驱动包可以省略注册驱动的步骤 自动加载jar包中META-INF/services/java.sql.Driver文件 中的驱动类 【2】获取数据库连接
获取数据库连接需要三部分信息url连接路径user用户名password密码 1连接路径语法 jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1参数键值对2… 示例jdbc:mysql://127.0.0.1:3306/db1 2如果连接的是本机mysql服务器并且mysql服务默认端口是3306则url可以简写为jdbc:mysql:///数 据库名称?参数键值对 配置 useSSLfalse 参数禁用安全连接方式解决警告提示 2.Connection【获取执行SQL的对象管理事务】
Connection数据库连接对象作用 (1)获取执行 SQL 的对象 (2)管理事务
1.获取执行对象
【1】普通执行SQL对象
Statement createStatement()【2】预编译SQL的执行SQL对象防止SQL注入
PreparedStatement prepareStatement(sql) SQL注入 是通过操作输入来修改事先定义好的SQL语句用以达到执行代码对服务器进行攻击的方法。 例 String sql select * from tb_user where username name and password pwd; 这时候如果String pwd or 1 1; 这时候sql语句就变成了 select * from tb_user where username sjdljfld and password or 1 1 那么密码检查不管怎么样都会登录成功这就是个很大的安全漏铜。 下面会具体讲讲PreparedStatement如何防止SQL注入。
【3】执行存储过程的对象
CallableStatement prepareCall(sql)
存储过程在MySQL中不常用所以这个我们将不进行讲解。
2 事务管理
MYSQL事务管理的操作开启事务-提交事务-回滚事务
JDBC实现事务
public class JDBCDemo3_Connection {public static void main(String[] args) throws
Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username,password);//3. 定义sqlString sql1 update account set money 3000 where id 1;String sql2 update account set money 3000 where id 2;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();try {// 开启事务conn.setAutoCommit(false);//5. 执行sqlint count1 stmt.executeUpdate(sql1);//受影响的行数//6. 处理结果System.out.println(count1);int i 3/0;//5. 执行sqlint count2 stmt.executeUpdate(sql2);//受影响的行数//6. 处理结果System.out.println(count2);// 提交事务//程序运行到此处说明没有出现任何问题则需求提交事务conn.commit();} catch (Exception e) {// 回滚事务//程序在出现异常时会执行到这个地方此时就需要回滚事务conn.rollback();e.printStackTrace();}//7. 释放资源stmt.close();conn.close();}
}3.Statement【执行SQL】
Statement对象的作用就是用来执行SQL语句。而针对不同类型的 SQL语句使用的方法也不一样。 4.ResultSet【封装了SQL查询语句的结果】
例
ResultSet executeQuery(sql)执行DQL 语句返回ResultSet 对象我们还需要从 ResultSet 对象中获取我们想要的数据。 ResultSet 对象提供了操作查询结果数据的方法如下 如下图为执行SQL语句后的结果 一开始光标指定于第一行前如图所示红色箭头指向于表头行。当 我们调用了 next() 方法后光标就下移到第一行数据并且方法 返回true此时就可以通过 getInt(id) 获取当前行id字段的 值也可以通过 getString(name) 获取当前行name字段的 值。如果想获取下一行的数据继续调用 next() 方法以此类推。
代码示例
/*** 执行DQL* throws Exception*/
Test
public void testResultSet() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username,password);//3. 定义sqlString sql select * from account;//4. 获取statement对象Statement stmt conn.createStatement();//5. 执行sqlResultSet rs stmt.executeQuery(sql);//6. 处理结果 遍历rs中的所有数据/* // 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){//6.2 获取数据 getXxx()int id rs.getInt(1);String name rs.getString(2);double money rs.getDouble(3);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println(--------------);}*/// 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){//6.2 获取数据 getXxx()int id rs.getInt(id);String name rs.getString(name);double money rs.getDouble(money);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println(--------------);}//7. 释放资源rs.close();stmt.close();conn.close();
}5.PreparedStatement【预编译SQL语句并执行预防SQL注入问题】
【1】使用步骤
(1)获取 PreparedStatement 对象
// SQL语句中的参数值使用占位符替代
String sql select * from user where username ? and password ?;
// 通过Connection对象获取并传入对应的sql语句
PreparedStatement pstmt conn.prepareStatement(sql);(2)设置参数值
上面的sql语句中参数使用 ? 进行占位在之前之前肯定要设置这些 ? 的值。 PreparedStatement对象setXxx(参数1参数2)给 ? 赋值 Xxx数据类型 如 setInt (参数1参数2) 参数 参数1 的位置编号从1 开始 参数2 的值
(3)执行SQL语句
executeUpdate(); 执行DDL语句和DML语句 executeQuery(); 执行DQL语句 注意 调用这两个方法时不需要传递SQL语句因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
代码示例 Test
public void testPreparedStatement() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name zhangsan;String pwd or 1 1;// 定义sqlString sql select * from tb_user where username ? and password ?;// 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);// 设置的值pstmt.setString(1,name);pstmt.setString(2,pwd);// 执行sqlResultSet rs pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();pstmt.close();conn.close();
}
这样就不会发生sql注入的问题了。
【2】原理
将敏感字符进行转义。利用Mysql自己的预编译功能可以自己查查怎么修改配置文件开启Mysql的预编译功能。
具体步骤 注 检查SQL和编译SQL花费的时间比执行SQL的时间还要长。 如果我们后面只是重新设置参数用同一套sql模板那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。 四.数据库连接池
如果每个方法都需要建立一次Connection使用完毕后进行销毁很好事。使用数据库连接池就不需要自己创建连接只要从连接池中获取一个连接进行使用使用完毕后将对象归还给连接池。
这样就避免了频繁创建和销毁连接对象所花费的时间和资源。 常见的数据库连接池
DBCP C3P0 Druid
这里重点就重点讲讲Druid
Druid使用步骤 导入jar包 druid-1.1.12.jar 定义配置文件 加载配置文件 获取数据库连接池对象 获取连接
现在通过代码实现首先需要先将druid的jar包放到项目下的lib下 并添加为库文件 项目结构如下 编写配置文件如下
driverClassNamecom.mysql.jdbc.Driver
urljdbc:mysql:///db1?
useSSLfalseuseServerPrepStmtstrue
usernameroot
password1234
# 初始化连接数量
initialSize5
# 最大连接数
maxActive10
# 最大等待时间
maxWait3000
使用druid的代码如下
public class DruidDemo {public static void main(String[] args) throwsException {//1.导入jar包//2.定义配置文件//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbcdemo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection connection dataSource.getConnection();System.out.println(connection); //获取到了连接后就可以继续做其他操作了//System.out.println(System.getProperty(user.dir));}
}