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类型。