原生态JDBC
Posted King-D
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原生态JDBC相关的知识,希望对你有一定的参考价值。
原生态JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用java语言编写的接口和类组成.
JDBC需要连接驱动,驱动是两个设置要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信.今天我们使用的是mysql的驱动mysql-connector-java-5.1.37-bin.java
JDBC规范(掌握四个核心对象)
1.DriverManager:用于注册驱动
2.Connection:标识与数据库创建的连接
3.Statement:操作数据库sql语句的对象
4.:ResultSet :结果集或者是一张虚表.
JDBC的原理:
java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动.
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库的连接,从而不能操作数据库,每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都是有数据库生产商提供.
JDBC入门案例
执行的sql语句
CREATE DATABASE qingmu; USE qingmu; CREATE TABLE category( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(100) ) INSERT INTO category (cname) VALUES(\'家电\'); INSERT INTO category (cname) VALUES(\'服饰\'); INSERT INTO category (cname) VALUES(\'化妆品\');
导入驱动
创建lib目录,存放mysql的驱动mysql-connector-java-5.1.37-bin.jar
选中mysql的jar包,右键选择“ Add as Library...” 完成jar导入
开发步骤和案例实现:
package com.qingmu.test; import org.junit.Test; import java.sql.*; /** * @Auther:qingmu * @Description:脚踏实地,只为出人头地 * @Date:Created in 21:50 2019/3/24 */ public class JdbcTest { /** * 使用原生态Jdbc时, * 1.注册驱动 * 2.获取连接 * 3.获取执行sql语句的对象 * 4.获取结果集 * 5.处理结果集 * 6.关闭资源 * @throws ClassNotFoundException * @throws SQLException */ @Test public void test1() throws ClassNotFoundException, SQLException { // 注册驱动 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/qingmu"; String username = "root"; String password = "root"; // 获取连接 Connection connection = DriverManager.getConnection(url, username, password); String sql = "select * from category"; // 获取执行sql语句的对象 Statement statement = connection.createStatement(); // 获取结果集 ResultSet resultSet = statement.executeQuery(sql); // 处理结果集 while (resultSet.next()) { int id = resultSet.getInt("cid"); String username1 = resultSet.getString("cname"); System.out.println(id + username1); } // 关闭资源 resultSet.close(); statement.close(); connection.close(); } }
API详解:
1.注册驱动
告诉JVM,我们要使用的是那个数据库
DriverManager.registerDriver(new con.mysql.jdbc.Driver());不建议使用,
因为:java.sql.DriverManager类:管理一组JDBC驱动程序的基本服务
静态方法:
static void registerDriver(Driver driver):向DriverManager注册给定驱动程序.
参数:java.sql.Driver接口:每个驱动程序类必须实现的接口.
mysql的驱动程序中,必然有一个实现了java.sql.Driver接口
1.在Driver中有静态代码块,是用来进行注册驱动的
而我们的代码一旦被执行,Driver类中静态代码块也会被执行
相当于被注册了两次.
所以不建议
2.如果只是使用静态代码块进行注册时候,代码就会被写死,失去了灵活性,所以也不建议使用.
原因:导致驱动被注册两次
强烈依赖数据库的驱动jar.
解决办法:
3.class.forName("com.mysql.jsbc.Driver")
Driver源码:
package com.mysql.jdbc; import java.sql.DriverManager; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } // 静态代码块 static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can\'t register driver!"); } } }
获取连接:
static Connection getConnection(String url,String user,String password):试图建立到给定数据库URL的连接
参数说明:
url:需要连接数据库的位置(网址)
user用户名
password密码
扩展: URL:SUN公司与数据库厂商之间的一种协议。 协议子协议 IP :端口号数据库 mysql: jdbc:mysql://localhost:3306/day04 或者 jdbc:mysql:///day04(默认 本机连接) oracle数据库: jdbc:oracle:thin:@localhost:1521:sid
API详解:java.sql.Connection接口:一个连接
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
Statement createStatement(); //创建操作sql语句的对象
API详解:java.sql.Statement接口: 操作sql语句,并返回相应结果
String sql = "某SQL语句";
获取Statement语句执行平台:Statement stmt =con.createStatement();
常用方法:
int executeUpdate(String sql); --执行insert update delete语句. ResultSet executeQuery(String sql); --执行select语句. boolean execute(String sql); --仅当执行select并且有结果时才返回true,执行其他的语句返回false.
API详解:处理结果集(注:执行insert、update、delete无需处理)
ResultSet实际上就是一张二维的表格,我们可以调用其 boolean next() 方法指向某行记录,当第一次调用
next() 方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的 getXXX(int col) 方法来获取指
定列的数据:(与数组索引从0开始不同,这里索引从1开始)
rs.next();//指向第一行 rs.getInt(1);//获取第一行第一列的数据
常用方法:
Object getObject(int index) / Object getObject(String name) 获得任意对象 String getString(int index) / String getString(String name) 获得字符串 int getInt(int index) / int getInt(String name) 获得整形 double getDouble(int index) / double getDouble(String name) 获得双精度浮点型
API详解:释放资源
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();
3.5 JDBC工具类
使用工具类对数据库进行增删改查
package com.qingmu.test;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @Auther:qingmu
* @Description:脚踏实地,只为出人头地
* @Date:Created in 12:51 2019/3/25
*/
public class UtilsTest {
private Connection connection = null;
private Statement statement = null;
private ResultSet resultSet = null;
// 获取连接,执行sql的语句
@Before
public void before() throws SQLException {
connection = JDBCUtils.getConnection();
statement = connection.createStatement();
}
/**
* 对数据库进行更新
*
* @throws SQLException
*/
@Test
public void updateTest() throws SQLException {
String sql = "update category set cname = \'钢铁侠\' where cid = 1";
int i = statement.executeUpdate(sql);
System.out.println(i);
// 关闭资源
}
/**
* 对数据库进行删除
*/
@Test
public void deleteTest() throws SQLException {
String sql = "delete from category where cname = \'钢铁侠\'";
int i = statement.executeUpdate(sql);
System.out.println(i);
// 关闭资源
}
/**
* 向数据库中增加一条数据
*/
@Test
public void insertTest() throws SQLException {
String sql = "insert into category values(4,\'猪猪侠\')";
int i = statement.executeUpdate(sql);
System.out.println(i);
// 关闭资源
}
/**
* 从数据库中查询出一条语句
*/
@Test()
public void queryTest() throws SQLException {
String sql = "select * from category";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int cid = resultSet.getInt("cid");
String cname = resultSet.getString("cname");
System.out.println(cid + "=======" + cname);
}
// 关闭资源
}
//在这里进行关闭资源
@After
public void after() {
JDBCUtils.closeResource(connection, statement, resultSet);
}
}
在这里本人只是进行了简单的 测试
以上是关于原生态JDBC的主要内容,如果未能解决你的问题,请参考以下文章
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段