前言
本篇文章将快速的引导大家入门JDBC,同时分析一些内部的API。
目录
我们在第一个事务处理完结果后手动添加了异常把提交事务放到最后这样,只要过程中有一个异常直接回滚,数据库中的数据就不会被改变。
一、学习JDBC有什么用?
学习完数据库和javase之后我们势必要通过java语言操作数据库中的数据,学习完JDBC我们就能够使用java语言了完成一些对数据库的操作。
二、JDBC概念
JDBC全称(Java DataBase Connectivity) java数据库连接,我们可以使用java对数据库进行操作,但是数据库有很多种,常见的关系型数据库MySQL,Oracle,DB2等等,这么多的数据库,我们要使用java操作,那么就很麻烦,我们也不想当数据库改变时要改变大量的java代码来适应不同的数据库,JDBC就是一套规则,也就是java中的标准接口,各大数据库厂写了自己的实现类去实现JDBC的接口,这样我们使用java通过JDBC接口就能够方便操作各种的数据库。
三、JDBC快速入门(以MySQL为例)
1.java操作数据库的流程
<1>编写java代码
<2>java代码将SQL发送到MySQL服务端
<3>MySQL服务器接收到SQL语句并执行该SQL语句
<4>将SQL语句执行的结果返回给java代码
2.java代码的步骤
<1>创建工程导入jar包,jar包就是各大数据库实现JDBC接口的实现类,也被称为驱动
在工程里创建lib目录并把jar包复制进去,并且右键ADD as Library
其他三个大家第一次创建是没有的后续需要请自行加入lib里
这个按照需要一般默认就好
<2>导入后正式开始编写java代码(在API介绍里详细介绍)
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//mysql5以上的jar包可以不手写注册驱动2.获取连接
String url="jdbc:mysql://localhost:3306/jyq_db01"; //如果是本机数据库且端口默认3306则可简写"jdbc:mysql:///jyq_db01 //最后是数据库名 String username="root"; String password="123456"; Connection conn = DriverManager.getConnection(url, username, password);3.定义SQL语句
String s="update...";4.获取执行SQL语句的对象
Statement stmt = conn.createStatement();5.执行SQL
int count1 = stmt.executeUpdate(sql);//返回int表示影响的行数6.处理返回结果
7.释放资源
四、JDBC API详解
1.DriverManager(驱动管理类):
<1>注册驱动
在第二条中我们注册驱动使用的是 Class.forName("com.mysql.jdbc.Driver");
当我们进入Driver类中查看就可以看到内部静态代码块是使用了驱动管理类进行了驱动注册
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }<2>获取数据库的连接
使用getConnection(url, username, password)方法并返回一个 Connection 对象;
url是连接路径 语法 jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对&.....
2.Connection(数据库连接对象)
<1>获取执行sql的对象
有三个方法
1.普通执行SQL对象
conn.createStatement() 返回Statement对象
2.预编译SQL的执行SQL对象(防止SQL注入)
conn.prepareStatement(sql) 返回PrepareStatement对象
3.执行存储过程的对象
conn.prepareCall(sql) 返回CallableStatement对象
<2>管理事务在MySQL中我们有开启事务、提交事务、回滚事务,并且MySQL默认自动提交事务
JDBC的Connection接口中定义了3个对应的方法
开启事务 setAutoCommit(boolean autoCommit) true自动提交 false手动提交(开始事务)
提交事务 commit()
回滚事务 rollback()
我们在第一个事务处理完结果后手动添加了异常把提交事务放到最后这样,只要过程中有一个异常直接回滚,数据库中的数据就不会被改变。
3.Statement
普通执行SQL语句
<1> Statement stmt=conn.createStatement//获取执行对象
stmt.executeUpdate(sql):执行DML(对数据增删改),DDL(表/库的曾增删改查)
返回值:int类型的值表示DML语句影响的行数
<2>stmt.executeQuery(sql):执行DQL(数据的查询)
返回值:ResultSet 结果集对象
以DDL为例测试第一种,结果用count接收表示被影响的行数。
4.ResultSet
封装了DQL(数据的查询)的结果
ResultSet中有一些的方法来对查询结果进行操作
ResultSet rs=stmt.executeQuery(sql)
可以看到ResultSet其实就是stmt执行executeQuery方法的返回值是一个结果集合
<1>next():将光标从当前位置向下移动一行判断是否为有效行 返回Boolean值
<2>getXxx(参数) 返回xxx类型 例如 int getInt(参数)、String getString(参数)
参数有两种一个是int 也就是列的编号从1开始
一个是String表示列的名称
//3.定义sql语句 String sql="select * from actor"; //4.获取执行sql对象 Statement Statement stmt = conn.createStatement(); //5.执行sql ResultSet rs= stmt.executeQuery(sql);//执行完DML后手影响的行数 //6处理结果 //创建集合 List<actor> actors=new ArrayList(); //6.1 光标向下移动一行,并且判断当前行是否有数据 while(rs.next()){ actor at = new actor(); int id = rs.getInt(1); String name = rs.getString(2); String sex=rs.getString(3); String borndate=rs.getString(4); String phone=rs.getString(5); at.setId(id); at.setName(name); at.setSex(sex); at.setBorndate(borndate); at.setPhone(phone); actors.add(at); }
上面是一个例子,执行完查询语句返回一个结果集对象,使用对象获取数据库中的信息,并将获取的数据给对象设置参数值,最后将对象添加到list集合中
5.PreparedStatement
作用:1.预编译SQL,提高性能
2.防止SQL注入:将敏感字符进行转义
<1>获取PreparedStatement对象//SQL语句中的参数开始使用?占位符代替,这样就防止拼字符串导致的SQL注入
String sql="select *from user where username=? and password=?";
//通过Connection对象获取执行对象,并执行sql语句(之前是执行的时候再执行sql语句)
PreparedStatement pstmt=conn.prepareStatement(sql)
<2>设置参数值(数字表示第几个?,后面表示用户的输入用来代替?进行查找
pstmt.setString(1,name)
pstmt.setString(2,pwd)
<3>执行SQL获取ResultSet结果集
Result rs=pstmt.executeQuery();
尝试输出内容
while(rs.next()){
System.out.println(rs.getString("name"));//这里的name是数据库里属性列名
}
五、数据库连接池
先从如果没有数据库连接池会发生的问题开始
有很多用户去访问数据库时,每来一个用户都需要开一个数据库连接给用户服务
服务完成后关闭连接并释放,开始数据库连接需要建立系统底层的资源进行网络连接很耗时,关闭时也耗时,不能做到资源的复用。
如果有了数据库连接池在系统启动之前,初始化一个容器(集合),在容器中提前申请一些数据库的连接,用户访问,从容器中取出数据库连接给用户服务,服务完成后将连接归还到容器中,这样速度就快很多,不用单独申请,而且做到了资源复用,如果数据库连接池中的连接被用完,当此时再来一个用户时,连接池就会去查询之前连接的用户在做什么操作,如果发现有用户占用连接却没进行操作,那么就会强制将连接返还到容器中给等待连接的用户使用,避免了数据连接遗漏
标准接口:DataSource
sun公司提供的数据库连接池标准接口,由第三方组织实现此接口
也就是说之后就不需要再用DriverManager.getConnection()去获得Connection了
常见的数据库连接池:C3P0
Druid
DBCP
本篇文章以Druid为例讲解
Druid(德鲁伊) .
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀
使用:<1>导入jar包
<2>定义配置文件
内容:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///jyq_db01?useSSL=false&useServerPrepStmts=true username=root password=123456 # 初始化连接数量 initialSize=5 # 最大连接数 maxActive=10 # 最大等待时间 maxWait=3000注意url里数据库要改成自己的,账号和密码也需要改成自己的
<3>加载配置文件(根据需求而定)Properties prop=new Properties();
prop.load(new FileInputStream(jdbc_myjdbc/src/druid.properties));
//这里的路径改为自己项目名
<4>获取连接池对象DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
<5>获取数据库连接
Connection conn=dataSource.getConnection();
后面就和正常一样
定义SQL,获得pstmt对象,(设置参数),执行SQL ,处理结果集合