当前位置: 首页 > >

JDBC复*

发布时间:

一.JDBC
1、概述

JDBC是一套操作关系型数据库的接口即规则,数据库厂商需要实现这套接口,并且提供数据库驱动jar包。我们实际执行的是对应驱动包中的实现类


2、连接数据库
(一)注册驱动
(二)获取连接
(三)执行CRUD操作
Statement

//1.创建Statement对象
Statement st=con.createStatement();
String sql="create table test(id int auto_increment,name varchar(20))";
/*
方法介绍:
executeUpdate(sql):执行create、insert、update、delete语句
executeQuery(sql):执行select语句,返回ResultSet结果集对象
*/
int affects=st.executeUpdate(sql); //返回的是改变的行数
Result rs=st.executeQuery();//查询返回的是结果集
while(rs.next()){//是否存在下一个元素
int id=rs.getInt("id");//通过列名获取
int id=rs.getInt(1); //通过列号
}

Statement的缺陷:

SQL注入问题:因为SQL语句参数是用户输入的,所以可能会改变SQL语句原本的意义,安全性差。
示例(来自拉勾教育):

如何解决:
使用PreparedStatement可以有效解决上述问题,并且在执行重复操作过多时,效率更高。
PreparedStatement接口的父接口为Statement,两者方法类似


public class TestLogin02 {
/**
* 使用预编译对象 PrepareStatement 完成登录案例
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
//1.获取连接
Connection connection = JDBCUtils.getConnection();
//2.获取Statement
Statement statement = connection.createStatement();
//3.获取用户输入的用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名: ");
String name = sc.nextLine();
System.out.println("请输入密码: ");
String pass = sc.nextLine();
System.out.println(pass);
//4.获取 PrepareStatement 预编译对象
//4.1 编写SQL 使用 ? 占位符方式
String sql = "select * from jdbc_user where username = ? and password = ?";
PreparedStatement ps = connection.prepareStatement(sql);
//4.2 设置占位符参数
ps.setString(1,name);
ps.setString(2,pass);
//5. 执行查询 处理结果集
ResultSet resultSet = ps.executeQuery();
if(resultSet.next()){
System.out.println("登录成功! 欢迎您: " + name);
}else{
System.out.println("登录失败!");
}
//6.释放资源
JDBCUtils.close(connection,statement,resultSet);
}
}

(四)关闭连接

补充: 可以将注册驱动操作放至静态代码块执行,关闭和获取连接单独封装为对应的方法。
以下代码为简化示例:


public class DBUtils {
private static final String DRIVER="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/module02?characterEncoding=UTF-8";
private static final String USER="root";
private static final String PWD="123456";
public static void main(String[] args){
Connection con= null;
try {
Class.forName(DRIVER);
con = DriverManager.getConnection(URL,USER,PWD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if(null!=con){
con.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}

3、协议说明(图片来源于拉勾教育)


4、控制事务

操作步骤:


    获取连接开启事务获取到 PreparedStatement , 执行两次更新操作正常情况下提交事务出现异常回滚事务最后关闭资源
    相关API:
    setAutoCommit(boolean autoCommit) :参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务
    commit() 提交事务
    rollback() 回滚事务
    注意 如果是手动提交事务,则需要在增删改查操作执行语句后 加上commit()。

二.数据库连接池
1、连接池概念

频繁获取连接、释放资源是非常消耗系统资源的,连接池则是用于解决此类问题。
好处:用池来管理Connection,这样可以重复使用Connection。 当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。


2、JDBC和连接池连接方式(图来自拉勾教育)

普通 JDBC方式

连接池方式:


3、如何使用

Java提供了公共的连接池接口:javax.sql.DataSource,不同厂商需要用自己的连接池去实现。


4、常见连接池
(一)DBCP
介绍

DBCP也是一个开源的连接池,是Apache成员之一,在企业开发中也比较常见,tomcat内置的连接池。


配置

将对应数据库的驱动即我们的jar包导入项目,也可将常用的一些数据库的jar包作为库添加至项目。


工具类(示例代码来自拉勾教育)

public class DBCPUtils {
//1.定义常量 保存数据库连接的相关信息
public static final String DRIVERNAME = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/db5?characterEncoding=UTF-8";
public static final String USERNAME = "root";
public static final String PASSWORD = "123456";
//2.创建连接池对象 (有DBCP提供的实现类)
public static BasicDataSource dataSource = new BasicDataSource();
//3.使用静态代码块进行配置
static{
dataSource.setDriverClassName(DRIVERNAME);
dataSource.setUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
}
//4.获取连接的方法
public static Connection getConnection() throws SQLException {
//从连接池中获取连接
Connection connection = dataSource.getConnection();
return connection;
}
//5.释放资源方法
public static void close(Connection con, Statement statement){
if(con != null && statement != null){
try {
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){
try {
resultSet.close();
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

(二)CP30
介绍

C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。


配置

1.C3P0有两个jar包
2.将c3p0-config.xml也需要放至项目中的src文件或者 自建目录,将该目录改为资源文件根目录。

3.工具类


public class C3P0Utils {
//1.创建连接池对象 C3P0对DataSource接口的实现类
//使用的配置是 配置文件中的默认配置
//public static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//使用指定的配置
public static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
//获取连接的方法
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//释放资源
public static void close(Connection con, Statement statement){
if(con != null && statement != null){
try {
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){
try {
resultSet.close();
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

(三)Druid
介绍

Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。


配置

同样需要导入jar包和配置文件。
工具类示例:


public class DruidUtils {
//1.定义成员变量
public static DataSource dataSource;
//2.静态代码块
static{
try {
//3.创建属性集对象
Properties p = new Properties();
//4.加载配置文件 Druid 连接池不能够主动加载配置文件 ,需要指定文件
InputStream inputStream=DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
//5. 使用Properties对象的 load方法 从字节流中读取配置信息
p.load(inputStream);
//6. 通过工厂类获取连接池对象
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
//释放资源
public static void close(Connection con, Statement statement){
if(con != null && statement != null){
try {
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){
try {
resultSet.close();
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

5.DBUtils工具类
(一)概念
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。DBUtils就是JDBC的简化开发工具包。需要项目导入 commons-dbutils-1.6.jar。
(二)核心功能

    QueryRunner 中提供对sql语句操作的API.
    注意:手动模式实现增删改查:核心方法:update(Connection conn, String sql, Object… params)步骤
    创建QueryRunner(手动或自动)占位符方式 编写SQL设置占位符参数执行 ResultSetHandler接口,用于定义select操作后,怎样封装结果集.实际应用中我们根据不同的需求去使用最合适的实现类。DbUtils类,他就是一个工具类,定义了关闭资源与事务处理相关方法.

三.批处理
批处理可以一次执行大量的sql语句,在我们需要添加大量数据时,使用批处理效率很高。mysql 批处理是默认关闭的,所以需要加一个参数才打开mysql 数据库批处理,在url中添加
如:url=jdbc:mysql://127.0.0.1:3306/db5?characterEncoding=UTF-8&rewriteBatchedStatements=true
Mysql元数据
1.概念

除了表之外的数据都是元数据,可以分为三类


查询结果信息: UPDATE 或 DELETE语句 受影响的记录数。数据库和数据表的信息: 包含了数据库及数据表的结构信息。MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。
常用命令有
元数据相关的命令介绍1.查看服务器当前状态2.查看MySQl的版本信息3.查询表中的详细信息4.显示数据表的详细索引信息5.列出所有数据库6.显示当前数据库的所有表7.获取当前的数据库名
四.问题总结

在过程中因为IDEA中连接Mysql发生密码错误的问题浪费了太多时间,因为之前使用XAMPP时安装的Mysql文件没有卸载干净,也会导致发生密码错误的问题,即使在命令行和第三方工具都可以正常登陆。
最终彻底删除干净后重装Mysql,问题解决
步骤如下:1.win10在应用里卸载掉MySQL相关的软件
2.删除默*沧澳柯枷碌 MySQL文件(如果是默认C盘目录下的话就是 ProgramFiles和ProgramData文件中去找)
3.关掉任务管理器中进程里的mysqld.exe
4.删除注册表中的MySQL信息,重装Mysql即可



友情链接: