JDBC的Jar包下载


JDBC基本连接步骤:
**
步骤:
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 2.右键—>Add As Library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回结果
- 处理结果
- 释放资源
//代码实现://1. 导入驱动jar包//2.注册驱动Class.forName("com.mysql.jdbc.Driver");//3.获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");//4.定义sql语句String sql = "update account set balance = 500 where id = 1";//5.获取执行sql的对象 StatementStatement stmt = conn.createStatement();//6.执行sqlint count = stmt.executeUpdate(sql);//7.处理结果System.out.println(count);//8.释放资源stmt.close();conn.close();
JDBC异常捕捉版本:
//代码:Statement stmt = null;Connection conn = null;try {//1. 注册驱动Class.forName("com.mysql.jdbc.Driver");//2. 定义sqlString sql = "insert into account values(null,'王五',3000)";//3.获取Connection对象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");//4.获取执行sql的对象 Statementstmt = conn.createStatement();//5.执行sqlint count = stmt.executeUpdate(sql);//影响的行数//6.处理结果System.out.println(count);if(count > 0){System.out.println("添加成功!");}else{System.out.println("添加失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally {//stmt.close();//7. 释放资源//避免空指针异常if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
通过上列代码可以发现,每当我们需要对DB进行操作时都要经过DB的连接与释放,代码重复率过高。
抽取JDBC工具类 : JDBCUtils
目的:简化书写
分析:
- 注册驱动也抽取
- 抽取一个方法获取连接对象
- 需求:不想传递参数(麻烦),还得保证工具类的通用性。
- 解决:配置文件
jdbc.properties 内部配置: url=jdbc:mysql://localhost:3306/db3 user=root password=root driver=com.mysql.jdbc.Driver
/*** JDBC工具类*/public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;/*** 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块*/static{//读取资源文件,获取值。try {//1. 创建Properties集合类。Properties pro = new Properties();//获取src路径下的文件的方式--->ClassLoader 类加载器ClassLoader classLoader = JDBCUtils.class.getClassLoader();URL res = classLoader.getResource("jdbc.properties");String path = res.getPath();//2. 加载文件pro.load(new FileReader(path));//3. 获取数据,赋值url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");//4. 注册驱动Class.forName(driver);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获取连接* @return 连接对象*/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}/*** 释放资源* @param stmt* @param conn*/public static void close(Statement stmt,Connection conn){if( stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if( conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 释放资源* @param stmt* @param conn*/public static void close(ResultSet rs,Statement stmt, Connection conn){if( rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if( stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if( conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
PreparedStatement 介绍
目的:
- 可以防止SQL注入
- 效率更高
详解各个对象: **
DriverManager:驱动管理对象
- 注册驱动:告诉程序该使用哪一个数据库驱动jar
- 代码使用:Class.forName(“com.mysql.jdbc.Driver”);
- 注意:mysql5 之后的驱动 jar 包可以省略注册驱动的步骤
获取数据库连接:
方法:
- static Connection getConnection(String url, String user, String password)
参数:
url:指定连接的路径
- 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
- 例子:jdbc:mysql://localhost:3306/db3 ** ** (db3为数据库名)
- 细节:本机mysql服务器,且默认端口3306,则url可简写:jdbc:mysql:///db3
user:用户名
- password:密码
Connection:数据库连接对象
功能:
获取执行sql 的对象
- Statement createStatement()
- PreparedStatement prepareStatement(String sql)
管理事务:
- 开启事务:setAutoCommit(boolean autoCommit) 设置参数为false,即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
Statement:执行 sql 的对象
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:结果集对象,封装查询结果
方法:
boolean next()
游标向下移动一行,判断当前行是否是最后一行末尾 ( 是否有数据 )
- 如果是,则返回false,如果不是则返回true
getXxx ( 参数 )
- 获取数据
- Xxx:代表数据类型 如: int getInt( ) , String getString( )
参数:
- int: 代表列的编号,从1开始 如: getString(1)
- String:代表列名称。 如: getDouble(“balance”)
**
- PreparedStatement:执行sql的对象
原因:SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1. 输入用户随便,输入密码:a' or 'a' = 'a1. sql:select * from user where username = 'fhdsjkf' and password = 'a' **or 'a' = 'a' ****
为解决sql注入问题:使用PreparedStatement对象来解决
预编译的SQL:参数使用 ? 作为占位符
步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar1. 注册驱动1. 获取数据库连接对象 Connection1. 定义sql- 注意:sql 的参数**使用 ?作为占位符**。- 如:**select * from user where username = ? and password = ?;**5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)5. 给?赋值:- 方法: setXxx(参数1,参数2)- 参数1:?的位置编号 从1 开始- 参数2:?的值7. 执行sql,接受返回结果,不需要传递sql语句7. 处理结果7. 释放资源注意:后期都会使用PreparedStatement来完成增删改查的所有操作
- 可以防止SQL注入- 效率更高
JDBCUtils配合PreparedStatement 的使用
利用 JDBCUtils 工具类极大的简化了代码的重复使用量,以及提高了代码的复用性
public class JDBCDemo {/*** 登录方法,使用PreparedStatement实现*/public boolean login(String username ,String password){if(username == null || password == null){return false;}//连接数据库判断是否登录成功Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;//1.获取连接try {conn = JDBCUtils.getConnection();//2.定义sqlString sql = "select * from user where username = ? and password = ?";//3.获取执行sql的对象pstmt = conn.prepareStatement(sql);//给?赋值pstmt.setString(1,username);pstmt.setString(2,password);//4.执行查询,不需要传递sqlrs = pstmt.executeQuery();//5.判断return rs.next();//如果有下一行,则返回true} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtils.close(rs,pstmt,conn);}return false;}}
