JDBC概念原理和连接数据库以及工具类的书写
来源:互联网 发布:网络视频版权 编辑:程序博客网 时间:2024/06/06 02:22
1.JDBC概念(Java Data Base Connectivity)
就是java数据库连接,用于执行SQL语句的Java API.可以为多种关系数据库提供统一访问,由java语言编写的类和接口组成.是java访问数据的标准规范.实现接口的类在驱动程序中.
JDBC连接需要连接驱动, mysql-connector-java就是连接数据库和java的,两者进行通信必须使用.
2.JDBC原理
JDBC是接口,驱动就是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!
3.JDBC操作数据库的步骤
1.注册驱动
告知JVM使用的是哪一个数据库的驱动
推荐使用的代码:Class.forName(“com.mysql.jdbc.Driver”);
DriverManager.registerDriver(new com.mysql.jdbc.Driver());//不推荐使用
存在两方面不足1.硬编码,后期不易于程序扩展和维护2.驱动被注册两次。
2.获得连接
使用JDBC中的类,完成对MySQL数据库的连接
3.获得语句执行平台
通过连接对象获取SQL语句的执行者对象
4.执行SQL语句
使用执行者对象,向数据库执行SQL语句
获取到数据库执行后的结果
5.处理结果
6.释放资源:其实调用一堆的close方法.
执行insert语句获取结果集
代码示例://1.注册驱动 反射技术,将驱动类加入到内容 // 使用java.sql.DriverManager类静态方法 registerDriver(Driver driver) // Diver是一个接口,参数传递,MySQL驱动程序中的实现类 //DriverManager.registerDriver(new Driver()); //驱动类源代码,注册2次驱动程序 Class.forName("com.mysql.jdbc.Driver"); //2.获得数据库连接 DriverManager类中静态方法 //static Connection getConnection(String url, String user, String password) //返回值是Connection接口的实现类,在mysql驱动程序 //url: 数据库地址 jdbc:mysql://连接主机IP:端口号//数据库名字 String url = "jdbc:mysql://localhost:3306/mybase"; String username="root"; String password="123"; Connection con = DriverManager.getConnection(url, username, password); //3.获得语句执行平台, 通过数据库连接对象,获取到SQL语句的执行者对象 // con对象调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库 // 返回值是 Statement接口的实现类对象,,在mysql驱动程序中 Statement stat = con.createStatement(); // 4.执行sql语句 // 通过执行者对象调用方法执行SQL语句,获取结果 // int executeUpdate(String sql) 执行数据库中的SQL语句,因为他的返回值是int类型,所以只能使用 insert delete update三种操作方式. // 返回值int,操作成功返回操作了多少行数据 int row = stat.executeUpdate ("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车用品',50000,'疯狂涨价')"); System.out.println(row); //6.释放资源 一堆close() stat.close(); con.close();
4.JDBC开发步骤:
导入jar包
1.手动创建lib目录
2.添加jar包
3.右键build path - Add to Build Path
怎么查看JDBC的原码
找到com.mysql.jdbc包中的Driver.class文件,打开之后添加驱动文件的src文件夹即可
执行select语句获取结果
5.处理结果集(执行insert、update、delete无需处理)
ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同,列是从1开始)来获取指定列的数据:
rs.next();//指向第一行
rs.getInt(1);//获取第一行第一列的数据
常用方法:
Object getObject(int index) / Object getObject(String name) 获得任意对象
String getString(int index) / Object getObject(String name) 获得字符串
int getInt(int index) / Object getObject(String name) 获得整型
double getDouble(int index) / Object getObject(String name) 获得双精度浮点型
查询之后对结果集的处理
//4.执行sql语句 String sql = "SELECT *FROM sort"; ResultSet exe = sta.executeQuery(sql); //5.处理结果集 while(exe.next()) { System.out.println(exe.getInt("sid")+" "+exe.getString("sname")+" " +exe.getDouble("sprice")+" "+exe.getString("sdesc")); }
6.SQL的注入攻击(登陆案例)
数据库当中先建一张users表,然后在表中添加两组数据,然后再执行查询操作.
CREATE TABLE users (
uid INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(300),
upass VARCHAR(300)
);
– 添加两条数据
INSERT INTO users(uname,upass) VALUES(‘a’,’1’),(‘b’,’2’);
– 查询用户的账号和密码
SELECT *FROM users WHERE uname=’a’ AND upass=’1’
OR 1=1;
//注册驱动 Class.forName("com.mysql.jdbc.Driver"); //连接数据库 String url = "jdbc:mysql://127.0.0.1:3306/mybase"; String user = "root"; String password = "123"; Connection connection = DriverManager.getConnection(url, user, password); //获得语句执行平台 Statement statement = connection.createStatement(); //执行Sql语句 Scanner sc = new Scanner(System.in); System.out.println("请分别输入用户名和密码"); String s1 = sc.nextLine(); String s2 = sc.nextLine(); String sql = "SELECT *FROM users WHERE uname='"+s1+"' AND upass='"+s2+"'"; System.out.println(sql); ResultSet exe = statement.executeQuery(sql); //处理结果集 while(exe.next()) { System.out.println(exe.getString("uname")+" "+exe.getString("upass")); } exe.close(); statement.close(); connection.close();
在登陆的时候分别输入用户名和密码,在密码后边加上’or’1=1,表示这条查询语句后边又多了一条 OR 1=1的代码(为true),也就是查询操作的结果一定为真,所以无论输入的是什么结果当中会拿到用户表中的所有数据
7.登陆攻击的解决方法:
PreparedStatement prepare = connection.prepareStatement(sql); prepare.setObject(1, s1); prepare.setObject(2, s2); ResultSet exe = prepare.executeQuery();
使用PrepareStatement接口,实现数据表的更新操作
String sql = “UPDATE sort SET sname=?,sprice=? WHERE sid=?”;
PreparedStatement prepare = connection.prepareStatement(sql);
prepare.setObject(1, “汽车”);
prepare.setObject(2,59999);
prepare.setObject(3, 7);
prepare.executeUpdate();
使用PrepareStatement接口实现数据表的查询操作.
JDBC工具类的书写当中
Con = DriverManger.getCOnnection(url,user,password);为什么会让强转?
导包的时候应该导java.sql.Connection;这个包
package com.JDBCUtils;
//JDBC的工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* JDBC的工具类,主要实现数据库的连接
*/
public class JDBCUtils {
// 私有构造方法
private JDBCUtils() {
}
// 创建Connection属性(静态,私有)private static Connection con;private static String url;private static String user;private static String password;// 静态代码块主要用于加载数据库连接的一些内容static { // 需要进行异常处理 try { Class.forName("com.mysql.jdbc.Driver"); // 获得连接 url = "jdbc:mysql://127.0.0.1:3306/mybase"; user = "root"; password = "123"; con = DriverManager.getConnection(url, user, password); } catch (Exception ex) { //让用户看的 throw new RuntimeException("数据库连接失败"); }}// 连接数据库的方法(静态,返回类类型为Connection)public static Connection getConnection() { return con;}// 关闭资源(两个方法重载,参数的数量不同)public static void close(Connection con, Statement sta, ResultSet rs) { // 使用IO流当中关闭流的方法 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } if (sta != null) { try { sta.close(); } catch (SQLException e) { e.printStackTrace(); } }}public static void close(Connection con, Statement sta) { // 使用IO流当中关闭流的方法 if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } if (sta != null) { try { sta.close(); } catch (SQLException e) { e.printStackTrace(); } }}
}
//测试JDBC工具类
public static void main(String[] args) throws SQLException {
//连接数据库
Connection con = JDBCUtils.getConnection();
//获得数据库执行平台
Statement sta = con.createStatement();
String sql = “select *from sort”;
ResultSet exe = sta.executeQuery(sql);
while(exe.next()) {
System.out.println(exe.getInt(“sid”)+exe.getString(“sname”)
+exe.getDouble(“sprice”)+exe.getString(“sdesc”));
}
//关闭资源
JDBCUtils.close(con, sta, exe);
}
静态变量、静态代码块、成员变量、构造函数的初始化顺序是??
先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数
8.properties配置文件概述
开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
可变的内容(数据库的类型, 连接主机ip,数据库的名字).
放置位置:放在src下边,就是源码的文件夹下
文件名字:随意,扩展名为properties
文件内容:格式为key=value
2.创建配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybase
user=root
password=123
3.加载配置文件
//使用类的加载器
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream(“database.properties”);
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
System.out.println(pro);
4.通过配置文件连接数据库
//获取集合中的键值对(通过键获取值)
String driver = pro.getProperty(“driver”);
String url = pro.getProperty(“url”);
String user = pro.getProperty(“user”);
String password = pro.getProperty(“password”);
Class.forName(driver);//这行代码不写也可以执行吗??
Connection con = DriverManager.getConnection(url,user,password);
System.out.println(con);
9.读取配置文件的工具类
读取配置文件,获取连接,就只执行一次,应该放在静态代码块中.
配置文件的工具类
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import com.jdbc.PropertiesDemo;
//编写一个工具类,通过配置文件获取数据库的连接
public class JDBCProperties {
private static Connection con;private static String driver;private static String url;private static String user;private static String password;static { try { // 使用类的加载器 InputStream in = PropertiesDemo.class.getClassLoader() .getResourceAsStream("database.properties"); Properties pro = new Properties(); pro.load(in); // 获取集合中的键值对(通过键获取值) driver = pro.getProperty("driver"); url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); Class.forName(driver); //这里不能再加Connection,如果加了就和静态成员变量的con不是同一个变量了. con = DriverManager.getConnection(url, user, password); } catch (Exception ex) { throw new RuntimeException("数据库连接失败"); }}public static Connection getConnection() { return con;//返回的到的是静态的成员变量的con}
}
测试配置文件工具类
如果输出con的的实现类的话就证明测试类没有问题,连接数据库成功
Connection con = JDBCProperties.getConnection();
System.out.println(con);
- JDBC概念原理和连接数据库以及工具类的书写
- JDBC工具类和JDBC连接数据库
- JDBC连接数据库工具类以及测试
- JDBC连接数据库的原理和步骤
- JDBC连接数据库的原理和步骤
- jdbc连接MySQL数据库的工具类
- 两个JDBC连接数据库的工具类
- jdbc连接数据库工具类
- JDBC连接数据库工具类
- jdbc连接数据库工具类
- 连接数据库Jdbc工具类
- JDBC连接数据库工具类
- JDBC工具类连接数据库
- java使用jdbc连接数据库工具类和jdbc连接mysql数据示例
- Java使用JDBC连接数据库完整的工具类实例
- 一个连接数据库的工具类(JDBC)
- JDBC动态SQL语句连接orcale数据库的工具类
- 使用JDBC连接MySQL数据库的工具类
- 1.linux驱动开发前准备工作
- mui HTML5plus 批量上传文件
- 玩玩i++
- 使用QQ互联报空指针异常
- 端午任务
- JDBC概念原理和连接数据库以及工具类的书写
- java 线程常用的方法
- 文章功能
- WebService-01
- QT如何输出调试信息
- SqlSession
- 商品展示
- Weka学习一(分类器算法)
- 【Unity3D基础知识】——Stats窗口