一.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即可