java web应用的基础就是 连接数据库,对数据进行crud。
那么java是如何连接 数据库的呢?那就是jdbc。使用jdbc就可以连接上我们想要的数据库。
jdbc 是什么呢? 全称:Java DataBase Connection
用java 连接关系数据库的api,是一种接口规范,它位于java.sql包和javax.sql包里,而具体实现是各大数据库厂商,根据Jdbc编写的驱动来实现。
jdbc核心的类四个:1.DriverManager 2.Connection 3.Statement (有升级) 4.ResultSet
jdbc的具体使用:
public class DbUtil {
public static final String url = "jdbc:mysql://localhost:3306/aaa";
public static final String name = "liulx";
public static final String password = "123456";
public static void main(String[] args) throws Exception {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(url, name, password);
//3.操作数据库,实现增删改查
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from user");
//如果有数据,rs.next()返回true
while(rs.next()){
System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
}
}
}
第一步中加载对应数据库版本的驱动,然后通过驱动获得连接,这个连接就相当于我们使用者到数据库服务器的桥,桥修起来,我们就可以通信了,使用statement会话进行传输,使用ResultSet结果集接受返回的结果。
jdbc核心就是者四个步骤,但是这里面存在了很多很多问题,比如说sql注入,就是在参数的位置,写入了sql语句,造成了数据库的错误解析,对数据库内容进行了非法操作,为了避免这种情况的产生,有了PreparedStatement,在sql语句中,对于非关键字部分,使用占位符来处理,这个类有预编译过程,将sql和参数,进行了分离,分离传输给数据库,这样就可以对参数进行分析,参数不能有多余的操作。
mysql数据库每秒可以进行800次读写,但是用户在对数据库访问的时候,会先建立连接,然后在进行访问,最后还要释放连接,虽然我们访问的速度不满,但是建立连接是基于tcp,还要三次握手,是很慢的过程,所以,如果一秒钟有100个用户进行登录,那么数据库是无法进行服务的。
问题来了,既然连接这么慢,为什么我们连接上了又要释放呢?
因为如果不释放,那么可能存在很多很多连接,而数据库的连接是有上限的,而且连接超过数量之后,可能造成内存溢出,造成问题,数据库的连接是占了很大内存资源的,就算没有溢出,在复杂的操作过程中,可能吧内存丢失遗漏了,那么就会操作数据不安全,比如你存密码的内存块丢了,被不法分子利用了,就很不安全。所以使用之后一定要关闭连接。
参考:https://www.iteye.com/blog/tomenjoy-311350
问题:那么我们连接又慢,但是又要提高速度怎么办?
jdbc为我们提供了连接管理接口,让第三方来实现对连接的管理,所以有了连接池的概念,连接池的本质就是装了很多连接的容器。
我们使用一个容器来把很多连接都装起来,要用的时候就拿一个出来使用,用完了就还回去,这样就可以避免重复的创建连接数据库。而我们的容器也可以控制连接的数量,不让其一直扩大。
连接池不仅仅是管理connection,还要管理statement ,resultSet这些,这些同样是也宝贵的资源。
连接池的实现原理呢?
用一个容器来装连接,在应用启动时候,初始化容器里面的连接(这个连接到数量,由用户来确定), 连接初始化好了,就是使用和还回来了,我们怎么知道一个连接是在使用,还是空闲呢?在jdbc提供的connection中,是没有标识符的,所以我们要封装connection,拿出一个新的连接,给这个连接加上新的成员,是否空闲的标识符。然后用户就可以根据连接的状态来获取连接了,也可以避免重复建立连接。一切交给连接池来管理。