JDBC连接数据库-mysql篇
- 1.前期准备及其演示
- 1.1 前期准备(所用到的数据库设计都会在这里进行展示)
- 1.2 连接演示
- 1.2.1增/删/改 等操作演示
- 1.2.2 查询 操作演示
- 2.jdbc连接数据库各个步骤详解
- 2.1 注册驱动
- 2.2 建立连接
- 2.3 创建加载sql语句对象
- 2.4 接收返回结果
- 2.4.1 于executeUpdate(sql)返回结果的解析
- 2.4.2 对.executeQuery(sql)返回结果的解析
- 2.5 关闭连接
- 3.mysql中的事务管理
- 3.1 数据库中的事务
- 3.1.1 事务简介
- 3.1.2 事务的四个特性
- 3.1.3 事务的必要性
- 3.2 代码演示
- 4.总结
1.java连接数据库是java基础内容,也是十分重要的基础内容
2.mysql作为目前使用人数最多的数据库,这个文章的讲解也将大有裨益
3.学习本章需要您熟悉最为基本的sql语句
4.本文会先演示一个完整的代码过程,然后分布讲解各个步骤的具体内容及注意事项
1.前期准备及其演示
1.1 前期准备(所用到的数据库设计都会在这里进行展示)
- 创建名为test的数据库,并创建数据库表 t_user,表格式如下:
- 下载mysql的jar包,(本文使用的是:mysql-connector-java-5.1.6.jar)
1.2 连接演示
连接演示分为两类操作:
- 第一类操作是对数据库表的增删改操作,操作后数据库会返回受影响的行数
- 第二类操作是对数据库表的数据进行查询,返回的是数据进行接收
此部分内容仅作为了解,或者快速开发使用,在第二部分我将进行详细讲解
1.2.1增/删/改 等操作演示
- 代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args)throws Exception {
//1.注册驱动,新的版本其实可以不需要注册了
Class.forName("com.mysql.jdbc.Driver");
//2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
/*
* 3.执行sql语句
*/
//3.1 写sql语句
String sql = "insert into t_user(userName,userPassword) values('张三','123456') ";
//3.2 加载sql驱动
Statement statement = connection.createStatement();
//3.3 执行sql语句 此时返回值是影响的行数
int i = statement.executeUpdate(sql);
System.out.println("受影响的行数:"+i);
//关闭连接
statement.close();
connection.close();
}
}
- 返回结果:
1.2.2 查询 操作演示
- 代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args)throws Exception {
//1.注册驱动,新的版本其实可以不需要注册了
Class.forName("com.mysql.jdbc.Driver");
//2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
/*
* 3.执行sql语句
*/
//3.1 写sql语句
String sql = "select userName,userPassword from t_user where userName='张三'";
//3.2 加载sql驱动
Statement statement = connection.createStatement();
//3.3 执行sql语句此时用ResultSet进行接收
ResultSet resultSet = statement.executeQuery(sql);
//3.4 打印结果
while (resultSet.next()) {
/*
*此处内容是不是很简明的阐述了通过java反射可以做到获取数据库值之后如何将数据绑定到method对象中的
*/
System.out.println(resultSet.getObject("userName"));
System.out.println(resultSet.getObject("userpassword"));
System.out.println("***********************************************");
System.out.println(resultSet.getObject(1));
System.out.println(resultSet.getObject(2));
}
//关闭连接
resultSet.close();
statement.close();
connection.close();
}
}
- 显示结果:
2.jdbc连接数据库各个步骤详解
- 切记,此部分内容仅仅是操作数据库的常规做法,并不是所有的做法,也不是很完整的做法,仅仅作为入门了解使用,了解更多先学习第三部分的事务管理之后,再学习。
- 学习完本篇文章内容后,将结合之前java反射,注解等内容封装一个jdbc数据库连接的简单的框架把,仿造hibernate和mybatis的机制进行。
2.1 注册驱动
- 什么是注册驱动? 简单来说就是做好准备的对接工作,就好像鼠标等设备准备驱动一样的道理。因为写此mysql的jar包的人把注册驱动写在了静态方法里面了,理论上是不需要再次注册,但是习惯性会写一遍。
- 注册驱动有其内置的方法,但是保证代码解耦等,我们这边使用了反射的方式进行驱动注册
- 注册驱动在本文开发中其实只需要导入相应的jar包就可以实现了
代码:
Class.forName("com.mysql.jdbc.Driver");
2.2 建立连接
- 在进行数据库操作的时候,建立的连接封装了socket方式来传输sql,建立连接的方式其实就是封装这个过程,返回的对象是 connection,关闭连接就是释放了系统资源。
- 单例的设计模式或者连接池的方式都是很好的进行数据库代码管理的方式。
2.1 单例设计模式主要是建立一个连接之后,不进行关闭,所有的的数据库操作都基于此连接进行操作。
2.2 连接池则是创建多个连接对象,由连接池统一管理,当需要的时候就从连接池进行调用,关闭方法并非是释放资源,而是将资源还给连接池- 本处不会讲解太过细致,后续博客我将进行系统性讲解,当然在我没出博客之前大家也可以借鉴网上的方法(写博客实在是太慢了,包括排版,有时候发现写的不够系统又要回炉)
演示代码:
//2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
三个参数讲解
DriverManager.getConnection(url, user, password);
- url:
此处主要是写数据库所在的url,因为本机就是localhost
- user
此处则是用户名,mysql数据库安装时候设置的登录账号
- password
同上,此处是安装时设置的登录密码
2.3 创建加载sql语句对象
- 此处前提是已经定义好了sql语句(一个String字符串写好)
- 加载sql语句对象返回的是一个statement对象,这也是一个加载sql的驱动。主要提供的是进行sql语句操作的过程,比如上文中的:executeQuery(sql)、executeUpdate(sql) 等方法
- 实际上有三种 Statement 对象,分别是:Statement、PreparedStatement、CallableStatement ,本人就用过前两种:
3.1 Statement 主要用于执行简单的sql语句,参数写在String字符串里面,sql注入的防护
3.2 PreparedStatement 用于执行带或不带参数的sql,使用 ? 作为占位符后续进行参数补充来进行。
3.3 CallableStatement 用于执行对数据库已存储过程的调用。- 本处仅列出Statement的方法,PerparedStatement将在后文列出,不准备演示CallableStatement 用法
演示代码:
/*
* 此方法是执行所有的sql语句,返回值为boolean,但是不是很建议使用
*/
Boolean resultBoolean = statement.execute(sql);
/*
* 此方法主要用于执行查询操作,返回值为一个ResultSet 结果集
*/
ResultSet resultResultSet = statement.executeQuery(sql);
/*
*此方法主要用于执行 增/删/改 操作,返回结果是影响行数
*/
int resultInt = statement.executeUpdate(sql);
2.4 接收返回结果
2.4.1 于executeUpdate(sql)返回结果的解析
- executeUpdate方法很简单,返回值就是返回的影响行数。
- 在Statement对象中,此方法局限性在于只能写死sql语句
- 支持 delete/update/insert等语句
示例代码:
String sql = "delete from t_use where userName= ' 张三' ";
//String sql = "update t_use set userName='李四' where userName='张三' ";
//String sql = "insert into t_user(userName,userPassword) values('王五','123456') ";
int resultInt = statement.executeUpdate(sql);
2.4.2 对.executeQuery(sql)返回结果的解析
- executeQuery方法的结果集是 java.sql里面的ResultSet对象
- 这里主要讲解对ResultSet结果集的操作,其主要方法有:
2.1 .next()方法,返回值为Boolean 当前有结果返回true,没有结果返回false
2.2 .getObject(int columnIndex) 方法,参数是表示查询出来的第几行数据,当不存在则报错
2.3 .getObject(String columnLabel) 方法,参数表示查询出来的参数属性名,反射就会使用此方法
2.4 .getString(int columnIndex/String conlumnLabel)、 getDate(int columnIndex/String conlumnLabel)等方法,根据具体类型以及参考2.2、2.3的用法。没必要使用感觉
示例代码
// 打印结果
while (resultSet.next()) {
System.out.println(resultSet.getObject("userName"));
System.out.println(resultSet.getObject("userpassword"));
System.out.println(resultSet.getObject(1));
System.out.println(resultSet.getObject(2));
}
2.5 关闭连接
- 连接关闭有三个 一个Connection对象的连接,一个是Statement对象的连接,一个是结果集ResultSet的连接关闭
- 关闭连接主要是为了释放资源
示例代码:
//关闭连接
resultSet.close();
statement.close();
connection.close();
3.mysql中的事务管理
3.1 数据库中的事务
3.1.1 事务简介
什么是事务?文学上说就是要做的事情。但是作为计算机单元来说,就是我们所认为的工作模块,一项需要完成的事情,比如我们需要拿筷子,将这个比作一个我们需要的做的事情,这个事情不掺杂别的情况,只是拿筷子的时候便可以将拿筷子称为一个事务。如果将吃饭比作一个要做的事情,也就是事务的时候,那么拿筷子将成为吃饭的必要操作(模块),此时我们便不能讲拿筷子称为事务,而是事务的必要因素之一,吃饭才是我们要做的事务。
3.1.2 事务的四个特性
为了更好的定义事务,那么我们将事务归纳出来四个特有特性,即:原子性、隔离性、一致性、持久性:
- 原子性:事务一旦确定便是不可分割的整体,操作的时候要么这个事务完全完成,要么不做,不存在做了一半不做的情况。
- 隔离性:事务的操作不掺杂任何外在因素,不被外物所扰。这里的外物可能是别的事务,避免类似于两个人(多线程)同时取一张银行卡里面全部的钱的情况。
- 一致性: 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态(百度)。怎么解释呢?两个一致性是进行状态转换后的结果的转变,比如数据库进行数据增加操作时,除了数据库表里面添加了我们需要添加的数据外没有其他变化。
- 持久性:这个主要说明在事务处理之后,结果在非物理损坏的前提下的永久性保存,只有进行事务更新的时候才能进行修改
3.1.3 事务的必要性
讲了许多事务,那么事务到底重要在哪些地方呢?我来扯一扯,谈家常一样。比如3+2这个例子,计算机分的很清楚就是3+2=5进行常规操作进行计算,但是人不同,3+2很可能是因为这个三块钱那个两块钱总共五块钱,也可能是两个人吃三个圣女果两根油条的早餐等等,计算机是无法识别这种事情的。
说了这么多,那么这个对于计算机操作有什么影响?就好像上文举例拿筷子一样,计算机是无法识别拿筷子是一个事务,还是吃饭的一个模块的,这个需要人为的控制。最为经典就是银行转账的例子,计算机无法知道你的银行卡扣钱的行为是需要把这笔钱转给别的银行账号还是自己取钱,如果只是取钱或许必要性不大,万一是转账那么就会十分尴尬,那么这个时候需要人为的学习事务管理进行有效的事务管控。
3.2 代码演示
public static void main(String[] args)throws Exception {
//1.注册驱动,新的版本其实可以不需要注册了
Class.forName("com.mysql.jdbc.Driver");
//2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//2.1 取消自动提交,手动提交事务
connection.setAutoCommit(false);
/*
* 3.执行sql语句
*/
//3.1 写sql语句
String sql = "insert into t_user(userName,userPassword) values('王五','123456')";
String sql2 = "update t_user set userPassword = '12345677' where userName='王五'";
//3.2 加载sql驱动
Statement statement = connection.createStatement();
try {
statement.executeUpdate(sql);
int a = 1/0;
statement.executeUpdate(sql2);
//提交事务
connection.commit();
} catch (Exception e) {
//事务回滚
connection.rollback();
System.out.println("事务处理失败");
e.printStackTrace();
}
finally {
//关闭连接
statement.close();
connection.close();
}
}
4.总结
关于sql这一章讲完了,很基础的内容,其实还有一些升华的部分没有讲解,出博客太难了,我将sql攻防、优化,封装、连接池等内容进行逐一讲解,这里告一段落了,可能我不会立马出来sql相关的博客
如果有关于本博客更好的建议或者不正确的地方希望您多多斧正