1.jdbc快速入门
JDBC是现在主流的数据库连接方式,哈哈哈哈哈,这话放在我在吃奶的时候还比较可信,
但难免有公司还是用这种比较主流的方法,比如我,哈哈哈哈,通过我的学习,下面将介绍如何使用JDBC去对数据库操作。
下面请看代码
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取链接
String url="jdbc:mysql://localhost:3306/address?useSSL=false";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql
String sql="update address set address_name='fangao' where id =5";
//创建statemnt对象,用于传递参数
Statement statement = conn.createStatement();
int i = statement.executeUpdate(sql);
System.out.println(i);
//释放资源
statement.close();
conn.close();
}
2.api详解
已经跟大家介绍完如何使用,现在就跟大家仔细聊聊其中的api详解
2.1DriverManger
首先其是具有两个功能的
1.注册驱动
2.获取数据库连接
有的同僚就会问了,”老铁,驱动注册的时候Class.form去获取的类对象吗?“这确实是这样,当我们点进去看其底层你会发现
哎,还真是这样!
第二个就是获取连接了
String url="jdbc:mysql://localhost:3306/address?useSSL=false";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url, username, password);
以上我相信都能看得懂,就不多做赘述了。
2.2Connection
Connection也具有两个作用
1.获取执行sql的对象
2.管理事务
获取执行sql的对象也有三个方法,以下代码对其作了介绍
///创建statemnt对象,用于传递参数
Statement statement = conn.createStatement();
//防止预编译
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//执行存储过程的对象
int i = statement.executeUpdate(sql);
管理事务主要是有三个方法,事务是什么呢?不知道的萌新可以看我下面这篇文章
介绍完事务是什么我们就开始介绍jdbc是如何对事务做管理的
//开启事务,true为自动提交;false为手动提交,及开启事务
conn.setAutoCommit(false);
//手动开启事务后,进行提交事务
conn.commit();
//若出现异常则进行回滚
conn.rollback();
下面我将为大家举例
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取链接
String url="jdbc:mysql://localhost:3306/address?useSSL=false";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url, username, password);
Statement statement = null;
try {
//开启事务
conn.setAutoCommit(false);
String sql1 ="update user set money=100 where id=1";
//伪造异常
//int a=1/0;
String sql2 ="update user set money=100 where id=2";
statement = conn.createStatement();
statement.executeUpdate(sql1);
statement.executeUpdate(sql2);
//若无异常提交事务
conn.commit();
} catch (Exception e) {
//若捕获到异常则进行回滚
conn.rollback();
throw new RuntimeException(e);
} finally {
//释放资源
statement.close();
conn.close();
}
}
create table user
(
id int not null
primary key,
name varchar(8) null,
money decimal(10, 6) null
);
可以去试一下。上面是见表语句,以后都会复用该表结构
2.3.Stateenment
他的作用主要是用来执行sql语句
有两个方法
//执行DML\DDL语句,返回值是DML语句影响的行数
int i = statement.executeUpdate(sql1);
//执行DQL语句返回Resultset结果集
ResultSet resultSet = statement.executeQuery(sql3);
2.4.ResultSet
ResultSet主要就是封装了去查询结果集,那么我将用代码的形式告诉大家如何去解析这个结果集
String sql="select * from user";
statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
//判断该行是否有数据,游标向下一行
while (resultSet.next()){
//getXxx(),Xxx代表返回的参数类型,括号内传递参数,int或者string类型
//int代表列的编号,切记从1开始,string是列的名称
resultSet.getInt(1);
resultSet.getString("name");
resultSet.getDouble("money");
2.5.PreparedStatement
PreparedStatement的作用呢就是进行sql的预编译,防止sql注入问题,应该都清楚SQL注入问题是什么吧,如果不清楚就参考一下我的这篇文章。
2.5.1PreparedStatement的使用
使用我就用代码进行描述了,通俗易懂
//sql中的参数值用?进行占位
String sql=" select * from user where id =? and name= ?";
//用Connection获取,并传入sql
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//setXxx(p1,p2),Xxx代表设置的参数类型
//参数p1是给第几个占位符进行赋值,p2是具体值。
preparedStatement.setInt(1,1);
//执行sql此时并不需要再进行传参
preparedStatement.executeUpdate();
2.5.2PreparedStatement的原理
这是因为在预编译期间会对一些敏感字符进行转义,例如" ' "会转义为" \' ",防止sql注入风险,
防止sql注入只是PreparedStatement的一个好处,其还有一个好处就是模板相同,只会检查一次语法,这就提升了性能。
3.数据库连接池
3.1简介
数据库连接池就相当于一个容器,负责分配管理连接
我就给带入场景方便理解,我开了一个餐厅,此时我招聘了一个服务员进行上菜,上完一个菜我就将他辞退并重新招聘,这就是没用连接池。当服务员上完一个菜再进行下个菜的传递这就是使用了连接池,后者也是我们的常规做法,所以我们也尽量使用连接池的方式。
3.2连接池的使用
我用代码进行阐述
//定义配置文件
//加载配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("配置文件路径"));
//获取数据库连接对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//获取数据库连接
Connection connection = dataSource.getConnection();
配置文件需要配置的参数
driverClassName=com.mysql.jdbc.Driver;
url=jdbc:mysql:/localhost:3306//kuming?useSSL=false&useServwePrtpStmts=true
username= root;
password=root;
#初始化连接数量
initialSize=5;
#最大连接数
maxActive=10;
#最大等待时间
maxWait=3000;