一、什么是JDBC
JDBC(Java DataBase Connectivity) Java数据库连接
其实就是利用Java语言(Java程序)连接并访问数据库的一门技术
二、为什么要学习JDBC
之前我们可以通过 CMD窗口 或者 通过 Navicat/Sqlyog等软件 连接数据库, 对数据库中的数据进行增删改查操作.
但是,将来在企业开发中,更多的是通过程序来连接数据库, 而我学的是Java开发,通过Java程序连接数据就必须用到JDBC这门技术!
像Mybatis/hibernate/DBUtils/Spring JdbcTemplate等框架底层也是在通过JDBC来连接数据库
三、概述
早期, 不同的数据库厂商提供的数据库驱动包(jar)是各不相同, 开发人员在操作不同 的数据库时需要学习该数据库对应的数据库驱动(jar)包, 这对于开发人员的学习成本太高了!
后来SUN公司就规定了JDBC这套规范(其实其中包含了大量的接口), 要求不同的数据库厂商提供的驱动都来实现这套接口, 这样一来, 开发人员只需要学会这套接口, 所有的数据库就都会操作了!
JDBC中主要包含两个包(java.sql和javax.sql), 并且java中已经包含这两个包了,但除了JDBC的包之外, 我们在操作数据库时还需要导入该数据库对应的驱动包(jar包)
四、操作、
1.创建lib目录,把jar包放进去并引入项目中。
2.创建类准备进行编写代码。
3.在main里通过Class.forName注册驱动,里面的参数是jar包里Driver的地址。
4.通过DriverManager.getConnection方法连接数据库,参数是jdbc协议和数据库地址和端口号和库名称加utf8的编码,后面加上数据库的账号和密码。
5.用连接数据库的返回的对象名调用createStatement();方法获取传输器。
6.用传输器返回的对象名调用executeQuery()/executeUpdate方法输入sql语句执行,前者是查询,需要在处理结果里进行查看查询到的结果,后者是增删改,不报错就代表执行成功。
7.处理sql语句执行的结果:对查询来说需要while循环如下所示。
while (r.next()){
// String s1 = r.getString(1);
// String s2 = r.getString(2);
// String s3 = r.getString(3);
// System.out.println(s1+s2+s3);
int id = r.getInt("id");
String name = r.getString("name");
int password = r.getInt("password");
System.out.println(id+name+password);
}
r.next判断是否有下一句,有的话返回true继续执行,否则停止执行。有两种方法进行查看,注释为第一种,参数为查看第几列,写法简单,但是不能具体看到表里某列对应的是哪个属性;
后者为第二种方法,参数传入数据库里对应的列名,便于查看。
8.释放资源,最后使用的最先释放
注:上面的方法会发生sql注入危险,解决方案如下:
更换更加安全的传输器:使用prepareStatement()方法,参数写好既定的sql语句骨架,外界输入的地方写上问号,再通过返回的对象名调用set类型方法,里面传入两个参数,第一个参数是表示骨架中的第几个问号,第二个参数是问号的内容。
这样就规定了外界输入内容的类型,避免出现#/''等符号,规避了sql注入的风险。
五、JDBC的优缺点
优点:使用JDBC连接并访问数据库 相比使用第三方的框架连接访问数据库速度要快一些!因为这是最为传统,最为底层的方法。
缺点:
1) JDBC中包含大量重复的代码(比如每次连接数据库都需要 注册驱动、获取连接、获取传输器、处理结果、释放资源等),后期难以维护
2) JDBC自身没有连接池,而框架(mybatis等)自带连接池,当需要连接直接从连接池中获取,用完连接不用关闭,再还回连接池中,这样可以提高执行效率!
3) JDBC中执行select查询语句的结果需要开发人员自己手动处理, 如果是非常复杂的数据(比如查询的结果中列数非常多或者查询的数据来自多张表)处理起来是非常麻烦的,但框架可以帮我们处理!
六、连接池概念
如果不使用连接池:
用户每次需要连接访问数据库时, 都需要创建一个连接(Connection), 基于这个连接去访问数据库中的数据, 用完连接(Connection)后会将连接关闭(close), 其实每次创建连接和关闭连接(相比使用连接)需要消耗大量的时间和资源,导致程序的执行效率低下(特别是高并发的时候,比如京东618;淘宝11.11等)
如果使用连接池:
可以在程序一启动之后,就创建一批连接放在一个池中(容器), 当用户需要连接时, 不用自己创建, 而是从连接池中获取一个连接对象, 再基于这个连接对象去访问数据库, 用完连接后, 不用将连接关闭, 而是还回连接池中。这样一来,用户使用的都是池中的这一批连接,可以减少连接创建和关闭的次数,提高程序的执行效率!
到这里就结束了,mybatis估计在下次了,后面学习前端吧,身为一个java后端开发,前端知识也是要掌握一些的。