JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
简单地说,JDBC 做三件事:与数据库建立连接、发送 操作数据库的指令并处理结果。
连接JDBC的步骤
- 加载驱动程序
- 创建连接
- 执行SQL语句
- 关闭连接
准备
安装完成mysql
后可以cmd
中mysql -u root -p
指定root账户登录mysql
数据库。
到mysql
的官网下载mysql
的JDBC驱动程序。下载完成后得到一个压缩包,将压缩包解压,得到一个下面的目录。其中,我们所需的就是mysql-connection-java-8.0.18.jar
包。下载完在src
目录下创建一个lib
包。将这个包放进lib包中。(下载位置随意
jdbc
如图,我有个数据库dbname
,库里有个表stu
,表如图:
在idea打开的项目中左上角选择File->Project Structure->Project Settings->Modules
, 然后选择其中的Dependencies
选项卡,然后点击右上角绿色的”+”号,选择JARs or directories
, 选中你刚刚放到lib目录中的mysql-connector-java-8.0.18.jar
,然后点击”OK”。首先将前面解压的mysql-connection-java-8.0.18.jar
包复制,然后
如图:点击右边的+
,选择JARs or directories
,会弹出一个框,选择你上面解压后的mysql-connection-java-8.0.18.jar
包,
上一步执行过后,可以在你的项目下面External Libraries
里面看到mysql-connection-java-8.0.18.jar
,此时所需jar
包已经准备好了。
操作数据库。无非就是增删改查(CURD),下面具体看看怎么操作:
先写一个工具类,这个工具类有两个方法,(一个用来获取数据库的连接,也就是connection,另一个自然是关闭这个连接)
不妨叫这个工具类MyDBUtils.java
package JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MyDBUtils
{
//设置连接地址
private static String url = "jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=utf-8";
//mysql用户名
private static String user = "root";
//mysql密码
private static String passwd = "123456";
//返回一个connection对象
public static Connection getCon() throws Exception
{
//加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
Connection connection = DriverManager.getConnection(url,user,passwd);
//返回连接对象
return connection;
}
public static void close(Connection connection) throws SQLException
{
//关闭连接
connection.close();
}
}
上面的MyDBUtils
里面的属性和方法都写成了静态,方便我们下面调用。
好了,工具类写好了,看下具体怎么增删改查吧。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class CURD
{
public void insert(String[] args) throws Exception
{
//获取连接对象
Connection connection = DriverManager.getCon();
//要执行的sql语句
String sql = "update stu set name = '小红' where name = '小明' ";
PreparedStatement pt = connection.prepareStatement(sql);
//返回值a表示受影响的行数,如果a > 0,表示插入成功
int a = st.executeUpdate(sql);
System.out.println(a);
pt.close();
connection.close();
}
public void query() throws SQLException
{
//这里为了简化,查询user表里所有的内容
String sql = "select * from user;";
PreparedStatement pt = connection.prepareStatement(sql);
ResultSet rs = pt.executeQuery(sql);
//如果ResultSet中有数据
if(rs.next()==true)
{
System.out.printf("查询成功\n");
//此表有三个字段
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
while (rs.next())
{
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
}
else
System.out.printf("查询失败\n");
rs.close();
pt.close();
connection.close();
}
public static void delete(int id) throws SQLException, ClassNotFoundException
{
Connection connection = DriverManager.getCon();
String sql = "delete from user where id=?";
PreparedStatement pt = connection.prepareStatement(sql);
pt.setInt(1,id);
//如果删除成功,受影响行数为1
int success = pt.executeUpdate();
if(success > 0)
System.out.printf("删除成功\n\n");
else
System.out.printf("删除失败\n\n");
pt.close();
connection.close();
}
public static void insert(int id, String username,String passwd) throws SQLException, ClassNotFoundException
{
Connection connection = DriverManager.getCon();
String sql = "insert into user values (?,?,?)";
PreparedStatement pt = connection.prepareStatement(sql);
pt.setString(1, id);
pt.setString(2, name);
pt.setString(3, pass);
int success = pt.executeUpdate();
if(success > 0)
System.out.printf("插入成功\n\n");
else
System.out.printf("插入失败\n\n");
pt.close();
connection.close();
}
}
注意:mysql
8.0版本不加serverTimezone=UTC&characterEncoding=utf-8
这一段会抛出异常,报错说是因为时区原因。还有com.mysql.jdbc.Driver
要写成com.mysql.cj.jdbc.Driver
。
在查询方法中,先关闭ResultSet
,再关闭PreparedStatement
,最后再关闭Connection
,遵循先打开后关闭的原则。
在上面的SQL
语句中,有些语句带了“?”,这个“?”是占位符,可以后面再设定这个问号的具是什么,可以不用写死SQL
语句,更灵活。
在jdbc
中,我们用PreparedStatement
,而不用Statement
,相比之下,PreparedStatement
比Statement
更优秀,现在没人用Statement
,有以下几个原因:
一.代码的可读性和可维护性
用
Statement
,sql语句中没有占位符,带来的不便就是字符串的拼接,稍不留神就容易出错,而且代码可读性很低。PreparedStatement尽最大可能提高性能
PreparedStatement是预编译的,对于批量处理可以大大提高效率,
最重要的一点是极大地提高了安全性
体现就是防
SQL
注入,Statement
是做不到这一点的。
Apache DBUtils
commons-dbutils
是 Apache
组织提供的一个开源 JDBC
工具类库,它是对JDBC
的简单封装,学习成本极低,并且使用dbutils
能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils
成为很多不喜欢hibernate
的公司的首选。
commons-dbutilsAPI
介绍:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
org.apache.commons.dbutils.DbUtils
Apache DBCP
C3P0
c3p0是一个数据库连接池,为什么需要数据库连接池?数据库连接的创建和关闭需要消耗很多的资源,如此往复,很不划算,所以我们需要一个连接池来管理我们的连接对象。
待更….