Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
注意:JDBC仅仅是一个规范而不是一个实现。意思是各种不同类型的数据库都依这种规范有相应的实现,它们之间的具体实现都是由java类和接口组成。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
//参数配置
private final String jdbcDriver = "com.mysql.jdbc.Driver"; //jdbc 驱动
private final String url = "jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
private final String userName = "root";
private final String password = "123456";
jdbcDriver
:使用jdbc时所需要的驱动userName
:登录数据库时所需要的用户名password
:登录数据库时所需要的密码url
:确定我们所需要连接的数据库
jdbc:mysql
:和mysql建立连接时使用的协议127.0.0.1
:mysql服务器所在的ip地址(此处为本机)3306
:mysql服务器所在的端口号(此处为MySQL的默认端口)school
:即需要操作的数据库名Class.forName(jdbcDriver); //加载驱动
connection = DriverManager.getConnection(url,useName,password); //建立连接
JDBC提供了两种操作数据库的对象:Statement
和 PreparedStatement
注意:
当同结构的SQL语句执行多次时,使用PrePareStatement创建对象的执行效率要比使用Statement创建对象的效率高得多。原因是用PrePareStatement创建对象只编译一次,下一次传值只从解析树之后的操作进行,而使用Statement创建对象每次都需要从头编译。
但并不是使用PrePareStatement创建对象的执行效率总比使用Statement创建对象的效率高,当一个结构的SQL语句只执行一次时,用Statement创建对象的执行效率要比使用PrePareStatement创建对象的效率高,原因是用Statement创建对象会直接执行完一条SQL语句,而用PrePareStatement创建对象会在判断SQL语句没有问题后停止线程等待参数传递,此时会使效率低下。
因此在不同的使用场景下要使用不同的对象。其实在实际操作过程中,更多的是使用PrePareStatement创建对象,原因是使用Statement创建对象容易产生SQL注入异常
总结:
PreparedStatement和statement的区别:
还需要注意:
executeUpdate()
方法。executeQuery()
方法。while (resultSet.next())
;判断集合中是否还有数据Statement statement = connection.createStatement();
String sql = "SELECT * FROM Student where SID=1 ";
ResultSet rs =statement.executeQuery(sql);
while (rs.next())
{
String title = rs.getString("SID");
String author = rs.getString("Sname");
System.out.println(title+":"+author);
}
rs.close();
statement.close();
connection.close();
完整代码如下:
public class JDBCDemo {
/**
* 1、引入依赖驱动包
* mysql-connector-java
* 2、加载驱动
* Class.forName("");
* 3、连接数据库,获取Connection
* url:jdbc:mysql/ip+port(3306)/数据库名
* username:
* password:
* Connection connection = DriverManager.getConnetion();
*
* 4、获取Statement对象
* Statement statement = connection.createStatement();
*
* 5、执行数据库的操作(CRUD)
* statement.executorQuery();
*
* 6、获取结果集:ResultSet
*
* 7、关闭资源
* statement.close();
* connection.close();
*/
//第一步:导入jar包
//第二步:说明JDBC驱动的名称和数据库的地址
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/school";
//第三步:说明数据库的认证账户及密码
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
//第四步:加载数据库驱动.通常使用Class.forClass(String driverName);加载
try {
Class.forName(JDBC_DRIVER);
} catch (ClassNotFoundException e) {
//这里会发生类没有找到的异常!
e.printStackTrace();
}
//第五步:获得数据库连接
try {
//获取连接
Connection connection = DriverManager.getConnection(DB_URL,USER,PASS);
//第六步:执行查询语句
Statement statement = connection.createStatement();
String sql = "SELECT * FROM Student where SID=1 ";
ResultSet rs =statement.executeQuery(sql);
while (rs.next())
{
String title = rs.getString("SID");
String author = rs.getString("Sname");
System.out.println(title+":"+author);
}
//第七步:关闭连接资源
rs.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
//这里会发生SQL异常,因为我们提供的的账户和密码不一定能连接成功
}
}
public class JDBC {
//导入jdbc的MySQL依赖 -> pom.xml
//参数配置
private String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
private String useName;
private String passWord;
private String jdbcDriver = "com.mysql.jdbc.Driver"; //jdbc驱动
private Connection connection; JDBC与MySQL所建立的连接
//加载驱动(驱动加载完成后就可以使用JDBC了)
//建立连接
public void createConnection(){
try {
Class.forName(jdbcDriver); //加载驱动
try {
connection = DriverManager.getConnection(url,useName,passWord); //建立连接
//getConnection方法就是JDBC提供给我们建立连接的方法
//即登录到MySQL服务器的过程
if(!connection.isClosed()){
//判断是否成功建立连接
System.out.println("连接建立成功");
}else {
System.out.println("连接建立失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//开启或者关闭事务
public void setAutoCommit(){
try {
if(!connection.isClosed()){
if(connection.getAutoCommit()){
connection.setAutoCommit(false); //开启事务
System.out.println("当前事务已开启");
}else {
connection.setAutoCommit(true); //关闭事务
System.out.println("当前事务已关闭");
}
}else {
System.out.println("当前数据库未连接");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//更改事务的隔离级别
public void setTransactionIsolation(int level){
try {
if(!connection.getAutoCommit()){
connection.setTransactionIsolation(level);
}else {
System.out.println("当前事务未开启");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//操作数据库(增删改查操作)
//插入数据
public void insertTest(int id,String name){
//update delete
String insertSql = "insert into jdbc_test values(?,?)"; //定义无参的SQL语句
PreparedStatement pre = null;
try {
pre = connection.prepareStatement(insertSql); //将无参的SQL语句提交给MySQL
//根据字段的不同数据类型给无参的SQL语句提交参数
pre.setInt(1,id);
pre.setString(2,name);
pre.executeUpdate(); //执行SQL语句
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
pre.close();
dataToDetermine();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//删除数据
public void deleteTest(int id){
String deleteSql = "delete from jdbc_test where id = ?";
PreparedStatement pre = null;
try {
pre = connection.prepareStatement(deleteSql);
pre.setInt(1,id);
pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
pre.close();
dataToDetermine();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//更改数据
public void updateTest(int id,String name){
String updateSql = "update jdbc_test set name = ? where id = ?";
PreparedStatement pre = null;
try {
pre = connection.prepareStatement(updateSql);
pre.setString(1,name);
pre.setInt(2,id);
pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
pre.close();
dataToDetermine();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//查询数据
public void selectTest(){
String selectSql = "select * from jdbc_test";
PreparedStatement pre = null;
try {
pre = connection.prepareStatement(selectSql);
ResultSet resultSet = pre.executeQuery(); //resultSet查询到的结果集的集合
//executeQuery方法是执行查询操作的专用方法
//通过遍历集合的方法达到查询的操作
while (resultSet.next()){
//resultSet.next()判断集合中是否还有数据
System.out.println("id:"+resultSet.getString(1)
+" name:"+resultSet.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
pre.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println();
}
//当开启事务时进行提交操作
public void dataToDetermine(){
try {
if(connection.getAutoCommit()){
return;
}else {
System.out.print("是否正式提交SQL语句(yes/no):");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
if(input.equals("yes") || input.equals("y")){
connection.commit();
}else {
connection.rollback();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭数据库连接
public void closeConnection(){
try {
connection.close(); //当不再使用数据库时,关闭JDBC连接避免资源浪费
if(connection.isClosed()){
System.out.println("连接已关闭");
}else {
System.out.println("连接关闭失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}