Schwertlilien
As a recoder: notes and ideas.

JDBC

JDBC

即使用java语言操作关系型数据库的一套API。

本质

  • 官方定义的一套操作所有关系型数据库的规则,即接口;
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包;
  • 可以使用这套接口(JDBC)去编程,但是真正执行代码的是驱动jar包中的实现类

好处

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发;
  • 可以随时更换底层数据库,访问数据库的java代码基本不变。

大体步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");//由于导入的jar包是8.0之后的版本
//获取连接对象
String url="jdbc:mysql://127.0.0.1:3306/bank_175?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
//定义sql语句
String sql="update account_175 set balance=500.0 where account_number='A_101' ";
//获取执行sql对象---这里会变更
Statement stmt=conn.createStatement();
//执行sql
int count=stmt.executeUpdate(sql);
//处理结果,cnt=受影响的行数;
System.out.println("受影响的行:"+count);
//释放资源
stmt.close();
conn.close();

JDBC API

DriverManager

驱动管理类的作用:

  • 注册驱动
  • 获取数据库连接

1.注册驱动

1
2
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");//由于导入的jar包是8.0之后的版本

但是对于MYSQL 5之后的驱动包,可以省略注册驱动的步骤。自动加载jar包中如下的驱动类:

然后你发现和上述代码中的字符串一模一样()

2.获取连接

1
static Connection | getConnection(String url,String user,String password)

userpassword没啥好说的,即自己数据库用户账密(一般用的都是root)。所以主要就是url

url,我们在计网中学过,它叫统一资源定位符。在这里,url是连接数据库的路径。

  • 语法jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
  • 示例jdbc:mysql://127.0.0.1:3306
  • 细节
    1. jdbc:mysql://表明是JDBCmysql的协议。
    2. 如果连接的是本机的mysql服务器,并且mysql服务器默认端口是3306(或许你自己改了,一般没改就是这个捏),那么可以简写成jdbc:mysql:///数据库名称?参数键值对1&参数键值对2...
    3. 配置useSSL=false参数,禁用安全连接方式,解决警告提示。

Connection

数据库连接对象的作用:

  • 获取执行SQL的对象
  • 管理事务

1.获取执行SQL的对象

1
2
3
4
5
6
//普通执行SQL对象
Statement createStatement()
//预编译SQL的执行对象:防止SQL注入
PreparedStatement prepareStatement(sql)
//执行存储过程的对象
CallableStatement prepareCall(sql)

2.事务管理

MYSQL的事务管理:

1
2
3
4
5
6
7
#mysql default下默认自动提交事务
#开启事务
begin;start transaction;
#提交事务
commit;
#回滚事务
rollback;

JDBC的事务管理:

1
2
3
4
5
6
7
//开启事务--true:自动提交事务;false:手动提交事务,即开启事务
setAutoCommit(boolean autoCommit);
setAutoCommit(false);//开启事务!
//提交事务
commit();
//回滚事务
rollback();

Statement

Statement的作用:执行SQL语句。

1.执行SQL语句

1
2
3
4
int executeUpdate(sql);//执行DML、DDL语句
//return: 1.DML语句影响行数 2.DDL语句执行后,执行成功【也可能】返回0
ResultSet executeQuery(sql);//执行DQL语句
//return:ResultSet结果集对象

ResultSet

结果集对象的作用:

  • 封装了DQL查询语句的结果

1.封装DQL查询语句的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ResultSet stmt.executeQuery(sql);//执行DQL语句,返回ResultSet对象
//【获取查询结果】
boolean next();
//将光标从当前行向前移动一行,判断当前行是否为有效行。
//return:
// 1.true:有效行、当前行有数据
// 2.false:无效行、当前行没有数据

//【获取数据】
xxx getXxx(params);
//xxx:数据类型,eg: int getInt(1),String getString("name")
//params:第几列,可选择int or String来选择
// int:列的编号,从1开始
// String:列的名称

//【使用方法】
while(re.next()){
rs.getXxx();
}

这里可以将每一行的数据载入ArrayList。

通过定义一个类:装载所有的schema捏。

PreparedStatement

PreparedStatement作用:

  • 预编译SQL语句并执行,预防SQL注入问题。

SQL注入:通过操作输入事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//【获取PreparedStatement对象】
//SQL语句中的参数值使用'?'占位符来替代
String sql="select * from user where username = ? and password =?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt=conn.prepareStatement(sql);

//【设置参数值】
//PreparedStatement对象:setXxx(param1,param2):给?赋值
//Xxx:数据类型,eg:setInt(...)
//params:
// param1:?的位置编号,从1开始
// param2:?的值

//【执行SQL】
executeUpdate();
executeQuery();

1.预编译SQL

1
2
//开启预编译功能--加入url后面
useSeverPrepStmts=true

鹅鹅鹅,下面这个可能不需要捏。

加入MYSQL的日志my.ini(重启完成)

1
2
3
4
5
6
log-out=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow-query-log-file="D:\mysql_slow.log"
long_query_time=2

数据库连接池

数据库连接池:是个容器,负责分配、管理数据库连接(Connection)。

  • 它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;
  • 释放空间时间超过最大空闲时间的数据库连接来避免因为没有释放数据库而引起的数据库连接遗漏。

好处

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

实现

标准接口:DataSource

1
2
//功能:获取连接
Connection getConnection();

常见的数据库连接池:

  • DBCP
  • C3P0
  • Druid(One of Best)

使用步骤

  • 导入jar包 druid-1.1.10.jar
  • 定义配置文件
  • 加载配置文件
  • 获取数据库连接池对象
  • 获取连接

捣鼓半天,成功了。

搜索
匹配结果数:
未搜索到匹配的文章。