3、JDBC

JDBC

  • JDBC入门
  • JDBC中常用的几个对象
  • JDBC控制事务
  • 常见bug

一、JDBC入门

1.1、JDBC概念

  JDBC(java datebase Connectivity),是一种用于执行SQL语句的Java API,可以为多 种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

1.2、JDBC的基本步骤

//1、导入、注册JDBC驱动。(Add as library 驱动包)
Class.forName(driverPath);
//2、创建连接数据库的对象
Connection conn = DriverManager.getConnection(rul,userName,password);
//3、创建操作数据库的对象
Statement state = conn.createStatement();
//4、编写sql语句
String sql = "Sql语句";
//5、通过Statement对象执行sql语句,【返回的是sql影响的行数】
int len = state.executeUpdate(sql);
//6、释放资源
conn.close();

二、JDBC中常用的几个对象

2.1、驱动管理对象(DriverManager)

1)、加载驱动

//Driver类的静态代码块
static {
	try {
		DriverManager.registerDriver(new Driver());//注册驱动程序
	} catch (SQLException var1) {
		throw new RuntimeException("Can't register driver!");
	}
}
//DriverManager类的静态方法
public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException {
	registerDriver(driver, null);
}

  所以我们可以知道,Class.forName(driverPath);的本质其实是运行registerDriver(new Driver())方法去加载驱动。

2)、创建数据库连接对象

//DriverManager类的静态方法
public static Connection getConnection(String url,String user,String password)//创建数据库连接对象
  • url:指定连接的路径。jdbc:mysql://ip地址:端口号/数据库名称
  • user:MySQL用户名
  • password:MySQL密码

2.2、数据库连接对象(Connection)

1)、获取SQL执行对象

//Connection接口的方法
Statement createStatement()//创建SQL执行对象
PreparedStatement prepareStatement(String sql)//创建SQL执行对象并构建SQL骨架

2)、管理事务

//Connection接口的方法
void setAutoCommit(boolean auto);//调用该方法设置autocommit参数,false为手动,true为自动。
void commit();//提交事务
void rollback();//回滚事务

2.3、SQL执行对象(Statement 、PreparedStatement)

1)、Statement

boolean execute(String sql);//可以执行任意SQL
int executeUpdate(String sql);//可以执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句,返回值是对数据库影响的行数。
ResultSet executeQuery(String sql);//执行DQL(select)语句,ResultSet里面封装的是查询结果

2)、PreparedStatement

  避免SQL注入问题,一般现在都是用这个,安全、效率更高。

//SQL注入经典案例:SELECT * FORM USER WHERE username='1111' AND password='1111' or 'a'='a';

//在用connection创建PreparedStatement对象时,我们传入了一个SQL,这个SQL其实是空参的,比如下面这样的
String sql = "SELECT * FROM USER WHERE username= ? and password= ? ";
//所以我们需要PreparedStatement对象的一些方法来替换这些问号
setXxx(int index,String value);//index代表?在SQL中的位置,value代表替换?的值。Xxx代表value的数据类型
//填充完SQL就可以执行SQL了
boolean execute();//任意类型的SQL
int executeUpdate();//可以执行DML、DDL语句,返回值是受影响的行数
ResultSet executeQuery();//可以执行DQL语句,ResulteSet里面封装的是查询结果。

2.4、结果集对象(ResuletSet)

  封装查询结果

boolean next();//将光标从当前位置向后移动一行
Object getXxx(参数);//根据参数名获取对应列名的值。
//Xxx:决定返回值类型,如getInt()的返回值是int,getString的返回值是String
//参数:可以是int型,代表第几列,也可以是String型,代表具体的列名

三、JDBC控制事务

3.1、开启事务

获取DB连接对象以后就开启事务:connection.setAutoCommit(false)

3.2、提交事务

执行SQL返回结果以后就可以提交事务了:connection.commit()

3.3、回滚事务

SQL异常捕捉里面回滚事务:connection.rollback()

四、常见bug

4.1、url中的时区问题和编码问题

The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

解决:url:jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&characterEncoding=utf-8

不知道为什么,连Linux没啥问题。

4.2、Junit4.10版本以上不包含hamcrest

解决:导入hamcrest-core-1.3.jar,或者将Junit版本降到4.10以下,然后将测试类所在文件夹调整为Test类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值