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、控制事务

操作步骤:

  1. 获取连接
  2. 开启事务
  3. 获取到 PreparedStatement , 执行两次更新操作
  4. 正常情况下提交事务
  5. 出现异常回滚事务
  6. 最后关闭资源
    相关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。

(二)核心功能

  1. QueryRunner 中提供对sql语句操作的API.
    • 注意:手动模式
    • 实现增删改查:核心方法:update(Connection conn, String sql, Object… params)
    • 步骤
      • 创建QueryRunner(手动或自动)
      • 占位符方式 编写SQL
      • 设置占位符参数
      • 执行
  2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.实际应用中我们根据不同的需求去使用最合适的实现类。
  3. 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即可

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值