JDBC 入门记录

JDBC 记录

JDBC快速入门–流程实现

导入jar包

这一步出错的概率很大,因为数据库的版本和jar包的版本是需要对应上的,前期用的5.7版本数据库,装了一个5.1.48版本的jar包,导致报错,最后解决办法是从官网下载最新的jar驱动包使用,报错修复成功

代码实现

//1. 设置数据库的url地址
// 是一个固定的写法
// 后跟着的是你要操作的数据库的名称
String url = "jdbc:mysql://127.0.0.1/test";
//2. 连接数据库
Connection conn = DriverManager.getConnection(url);
//3. 定义sql语句
String sql = "update ttt set id = 4";
//4. 获取sql执行对象
Statement statm = conn.createStatement();
//5. 执行sql语句 返回的是执行sql语句受到影响的行数
int count = statm.executeUpdate(sql);
//6. 打印结果
System.out.println(count);
//7. 关闭连接
statm.close();
conn.close();

以上代码是实现更新数据操作,但是如果我们要对一批数据进行操作,那么为了保证整个操作不会因为小的失误而导致数据出错

那么就需要用到事务操作,在jdbc里面,事务的操作如下:

//前面的步骤和上面一样,主要有区别的就是在定义sql语句和执行sql语句这个地方,需要用到try/catch环绕
try{
    String sql = "update ttt set id = 4";
    Statement statm = conn.createStatement();
    int count = statm.executeUpdate(sql);
    String sql2 = "update ttt set id = 5";
    int count2 = statm.executeUpdate(sql2);
    conn.commit();
}catch(Exception e){
    conn.rollback();
}

以上代码实现的是数据库的更新或者删除操作,接下来的代码实现的是数据的查询操作

//前面的步骤还是和上面的是一样的
/*对应于数据的查询操作来说,问题在于查询到的数据放在哪,怎么展示出来,所以需要用到一个API叫做ResultSet*/
String sql = "select * from ttt";
ResultSet resultSet = statement.executeQuery(sql);
//查询到的数据会存放在resultset里面,类似于一个游标,一行一行的遍历,用next进行移动,当next的返回值为true的时候说明这一行有数据,反之则,没有数据
//所以遍历操作这一步可以使用一个while循环
while(resultSet.next()){
	int id = resultSet.getInt("id");
	String title = resultSet.getString("title");
	double price = resultSet.getDouble("price");
	System.out.println(id + " " + title + " " + price);
	connection.rollback();
}

防止SQL注入

首先来讲讲什么是SQL注入

例如一个很普通的登录页面

image-20220917184502505

假设我们的账号是admin,密码是123,那么我们对一个账号的登录SQL语句就应该这样写

select * from user where username='admin' and password = '123';

这个没有问题,但是如果我们把密码改一下,改成 ’ or ‘1’ = ‘1’ ,那么SQL语句就变成了

select * from user where username='admin' and password = '123' or '1' = '1';

显而易见,这条sql语句必然能查询到结果,那么我们的后台就这样被登陆了上去,所以要预防这种情况的发生,就需要用另一个API

String sql = "insert into tb_brand (brand_name,company_name,ordered,description,status) values (?,?,?,?,?);";
PreparedStatement ppstm = connection.preparedStatement(sql);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1, brandName);
        preparedStatement.setString(2, companyName);
        preparedStatement.setInt(3, ordered);
        preparedStatement.setString(4, description);
        preparedStatement.setInt(5, status);
        int line = preparedStatement.executeUpdate();

用此方法就可以避免字符串拼接的问题,将变量用一个?代替,然后手动进行替换,就可以预防SQL注入的问题发生。

数据库池

为什么要有数据库池

image-20220917185449518

首先来看这张图,有n个用户同时访问数据库,那么第一个用户来了,我们建立一个连接,为第一个用户服务,当第一个用户使用完成后,关闭这个连接,第二个用户来的时候,建立连接,然后关闭连接,直到最后一个用户走了,结束

乍一看,是不是整个过程没毛病,但是我们换个思路想一下,只要有一个用户来了,我们就开一个连接,然后再关闭,是不是就很像公司招聘,需要一个人了,招一个人,然后工作完成,给这个人开除了,这么一看,是不是就有问题了

所以比较好的解决方案就是建立一个数据库池,先初始化几个连接放在里面,一个用户来了,取走一个连接,然后服务完成后,将连接还回来,继续给下一批客户服务,如果连接数量不够用,那么我们就新建几个连接存入连接池

代码编写

这里我使用的是一个Druid连接池,Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。

在写正式代码之前,还需要写一个配置文件

driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=123

initialSize=5
maxSize=10
maxWait=3000

前面四行就不用说了,看后面三行,第一行定义初始化连接的数量

也就是说先往数据库池里面放五个连接备用

第二行是最大连接数量,也就是说这个池里面最多存放十个连接

最后一行是最大的等待时间,超出这个时间就自动断开连接了

下面就开始写正式代码

Properties prop = new Properties();
prop.load(new FileInputStream("./druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
Connection connection = dataSource.getConnection();
String sql = "select * from tb_brand where id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1 ,1);
ResultSet resultSet = preparedStatement.executeQuery();

首先看第一行和第二行和第三行,导入写好的配置文件

第四行通过配置文件,建立一个连接,这个时候就拿到了connection

后面的步骤就是一样的了。

以上就是数据库池的简单应用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值