一.jdbc的概述:
在开发过程中我们使用的shijava语言,那么肯定是要通过java语言操作数据库。
1.1jdbc的概念
JDBC是java来执行sql语句的AplJDBC是java访问数据库的标准规范,可以对多种关系类型的数据库进行统一的访问;它是有java语言编写的接口和类组成。
JDBC是接口,由数据库生产生产厂商提供的实现类被称为驱动。
1.2 JDBC的组成;
接口规范;一开始有很多的数据库他们是不统一的每个数据库都有自己的接口,这样子就显得很麻烦;最后sum公司出手了他制订了java程序连接各种数据库的统一接口规范。这样的话,不管是链接哪一种数据库,java代码都可以保持一致性。
实现规范:因为各个数据厂商的的软件各有不同,那么各自的内部如何通过sql实现增删改等操作管理数据库,只有这个数据库厂商自己更清楚,因此接口规范就交给数据库厂商自己实现。
厂商实现内容和过程封装成jar文件,我们程序员只需要将jar文件引入到项目中集成即可,就可以开发调用实现过程的操作数据库了。
二.JDBC快数入门;
准备一下自己的数据库
1.2官网下载数据库连接连接驱动jar包:MySQL :: Download MySQL Connector/J (Archived Versions)
穿件java项目,在项目下创建lib文件夹,将下载的驱动jar包复制到java项目下lib里面;
选中复制到lib文件夹里面的jar包,右键找到--->Add as Library,点击什么都不用管点OK就好,
与项目集成。
package JavaJdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/*** /** * JDBC API中的核心类和接口* DriverManager(类): 用于注册驱动和获取连接* Connection(接口): 表示与数据库创建的连接* Statement(接口): 执行SQL语句的对象* ResultSet(接口): 结果集或一张虚拟表** * 以上接口由MySQL驱动程序jar包,提供实现类** * JDBC开发步骤 ,固定步骤 6个 (模版)* 1.注册驱动* 2.获得连接对象* 3.获得执行sql语句的对象* 4.执行SQL语句,获取结果集对象* 5.处理结果集 (打印控制台)* 6.释放资源**/public class JDBC3 {public static void main(String[] args)throws Exception {//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2。获得连接对象String url = "jdbc:mysql://localhost:3306/day7-16";//连接数据库的地址:我的是连接day7-16String username="root";//填写数据库的用户名String password="G20030718";//数据库密码Connection conn = DriverManager.getConnection(url, username, password);//获取执行sql语句的对象Statement state = conn.createStatement();//修改数据String query ="update tab_User set nickname='蟹老板' where id='1';";//删除数据String ques = "delete from tab_User where id='4'";//添加数据String sql="insert into tab_User values (null,'zhaoliu','238761','张三')";//查看数据:String sql1 ="select * from tab_User where nickname='张三' and password = '123456'";//影响行数:注意:executeUpdate() 增删改 executeQuery() 查询int i = state.executeUpdate(ques);int i1 = state.executeUpdate(query);int i2 = state.executeUpdate(sql);ResultSet resul = state.executeQuery(sql1);// 处理结果集if(i>=1){System.out.println("修改成功");}else{System.out.println("修改失败");}if(i1>=1){System.out.println("删除成功");}else{System.out.println("删除失败");}if(i2>=1){System.out.println("添加成功");}else {System.out.println("添加失败");}if(resul.next()){System.out.println("查询成功");}else{System.out.println("查询失败");}
//释放资源:resul.close();state.close();conn.close();}
}
二.连接池
目的:就是为了建立数据库连接的消耗费的资源,和时间很多问题,提高性能,
Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了(close).每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.连接池初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.
生活里面的连接池例子
老方式:下了地铁需要骑车, 跑去生产一个, 然后骑完之后,直接把车销毁了.连接池方式 摩拜单车:骑之前, 有一个公司生产了很多的自行车, 下了地铁需要骑车, 直接扫码使用就好了, 然后骑完之后, 还回去
连接池原理:
1.2 连接池原理 程序一开始就创建一定数量的连接,放在一个容器(集合)中,这个容器称为连接池。
使用的时候直接从连接池中取一个已经创建好的连接对象。
关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。
1.3 编写标准的数据源(规范)
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的第三方连接池如下:C3P0,阿里巴巴-德鲁伊druid连接池
二.Druid 连接池
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是国内目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。如:一年一度的双十一活动,每年春运的抢火车票。
Druid的下载地址:https://github.com/alibaba/druid
1. 导入jar包 druid-1.1.12.jar
2. 定义配置文件
3. 加载配置文件
4. 获取数据库连接池对象
5. 获取连接
2.1 编写 druid.properties
driverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/day_0801?useUnicode=true&characterEncoding=utf8
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
编写DbUtils工具类
public class DBUtils { private static DataSource ds=null; static { try { //创建Properties对象 Properties prop=new Properties(); //创建输入流 InputStream in = DBUtils.class.getClassLoader().getResourceAsStream("druid.properties");//加载输入流 prop.load(in); //获取连接池对象 ds = DruidDataSourceFactory.createDataSource(prop); } catch (Exception e) { e.printStackTrace(); } } //获取连接池对象 public static DataSource getDataSource(){ return ds; } //获取连接对象 public static Connection getConnection(){ //改成从数据库连接池获取连接 try { return ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } //释放资源的代码 public static void close(ResultSet rs, Statement stat, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } }
if (stat != null) { try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
}
测试类:
public class Demo02 { public static void main(String[] args) throws Exception { //获得连接 Connection conn = DBUtils.getConnection(); //获取执行SQL语句的预编译对象 String sql="select * from tab_user"; PreparedStatement pstat = conn.prepareStatement(sql); //执行SQL语句,获取结果集对象 ResultSet rs = pstat.executeQuery(); //处理结果集 ArrayList<User> list=new ArrayList<>(); while(rs.next()){ int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password");String nickname = rs.getString("nickname");//System.out.println(id+"..."+username+"..."+password+"..."+nickname); User user=new User(id,username,password,nickname); list.add(user); } //System.out.println(list); for (User user : list) { System.out.println(user); } //释放资源 DBUtils.close(rs,pstat,conn); }
}