(一) 软件配置
开发工具:IDEA2019.3.5
jdk版本:jdk-9.0.4
数据库:MySQL Server 5.5
相关Jar包:mysql-connector-java-5.1.37-bin
(二) 步骤
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar ①复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 ②右键–>Add As Library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回结果
- 处理结果
- 释放资源
(三) 具体实现
public class JdbcDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//4.定义sql语句
String sql = "SELECT COUNT(*) a FROM book";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql,查询数据库的数据条数
ResultSet rs = stmt.executeQuery(sql);
//7.处理结果
if(rs.next())
System.out.println(rs.getInt("a"));
//8.释放资源
stmt.close();
conn.close();
}
}
(四)关于JDBC中的四个类的说明
1. DriverManager:驱动管理对象
①注册驱动:告诉程序该使用哪一个数据库驱动jar
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
故mysql5之后的驱动jar包可以省略注册驱动的步骤。
②获取数据库连接:
* 方法:static Connection getConnection(String url, String user, String password)
* 参数:
* url:指定连接的路径
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
* 例子:jdbc:mysql://localhost:3306/db3
* user:用户名
* password:密码
2. Connection:数据库连接对象
①获取执行sql 的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
②管理事务:
3. Statement:执行sql的对象
4. ResultSet:结果集对象,封装查询结果
(五) 抽取工具类
上面java连接数据库的代码非常简单,但实际使用起来代码重复度过高,每次都要注册连接,释放资源,故抽取一个工具类来获取连接释放连接。具体代码过程如下
properties文件
注意url的数据库名
user和password改为自己的数据库的账号密码
url=jdbc:mysql:///test
user=root
password=root
driver=com.mysql.jdbc.Driver
工具类代码
public class JDBCUtils {
//静态代码块只能访问静态变量
private static String url;
private static String user;
private static String password;
private static String driver;
//静态代码块只在类加载时被执行一次
static{
try {
Properties pro=new Properties();
//获取src路径下的文件
ClassLoader classLoader=JDBCUtils.class.getClassLoader();
URL res=classLoader.getResource("jdbc.properties");
String path = res.getPath();
pro.load(new FileReader(path));
//加载文件
url=pro.getProperty("url");
//获取数据赋值
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection()throws SQLException{
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(Statement stmt,Connection conn){
//stmt和conn不可放在同一个try-catch块中,因为如果stmt关闭出错会导致conn无法关闭
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//释放资源
public static void close(ResultSet rs,Statement stmt, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
表
USE `test`;
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL,
`price` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `book`(`id`,`name`,`price`) values (1,'mysql数据库',99.9),(2,'oracle数据库',88.8);
测试方法
写的比较草,建议自己写个测试类测试
public class TestJdbc {
private Connection conn=null;
private Statement stmt=null;
private ResultSet rs=null;
@Before
public void getConnection(){
try {
conn=JDBCUtils.getConnection();
stmt=conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
@After
public void close(){
JDBCUtils.close(rs,stmt,conn);
}
@Test
public void findAll() {
List list = new ArrayList<Book>();
String sql="select * from book";
//执行sql
try {
rs = stmt.executeQuery(sql);
//遍历结果集,封装对象,装载集合
Book book = null;
while (rs.next()) {
//获取数据
int id = rs.getInt("id");
String name = rs.getString("name");
double price = rs.getDouble("price");
// 创建emp对象,并赋值
book = new Book();
book.setId(id);
book.setName(name);
book.setPrice(price);
//装载集合
list.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(list);
}
@Test
public void update(){
String sql="UPDATE book SET price="+77.7+" WHERE id=1";
//执行sql
int flag= 0;
try {
flag = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
if(flag==1){
System.out.println("更新成功");
}
else {
System.out.println("更新失败");
}
}
@Test
public void delete(){
String sql="DELETE FROM book WHERE id="+3;
//执行sql
int flag= 0;
try {
flag = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
if(flag==1){
System.out.println("删除成功");
}
else {
System.out.println("删除失败");
}
}
@Test
public void addBook(){
String sql="INSERT INTO book VALUES (3,'redis',55.5)";
//执行sql
int flag= 0;
try {
flag = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
if(flag==1){
System.out.println("添加成功");
}
else {
System.out.println("添加失败");
}
}
}