hello,我是~小鹿,对你有帮助可以收藏随时找到这里哦
【Java, MySQL】JDBC ,Java代码操作MySQL
1. 引入驱动包,作为项目的依赖
这里我们使用中央仓库
中央仓库链接
https://mvnrepository.com/
1). 在这里搜索mysql
进去之后可以看到很多版本的数据库驱动包
数据库驱动包的版本要和数据库服务器的版本一致 ( 小版本不要求, 大版本得一致 )
点击:
之后可以看到很多版本的驱动包
2). 选择驱动包
这里我使用了5.1.49
( 这里我的数据库服务器是5.7版本的 是小版本 , 选择47,48,49之类都可以 )
点击进入后 点击红框位置下载驱动包
得到:
3). 将 jar 包拷贝项目中
打开IDEA , 创建了一个名为 JDBC 的新项目, 然后:
输入lib ( library 原意是图书馆 在这里是库的意思)
将刚刚下载的 jar 包复制 , 选中刚创建好的 lib 这个目录 , 粘贴
4). 将 jar 包导入项目中
右击 lib 选择 Add as Library…
然后点击ok
导入成功
2. Java代码操作MySQL
在src中创建 .java文件 编写代码
创建类名为JDBCDemo1
代码示例: 插入操作:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCDemo1 {
public static void main(String[] args) throws SQLException {
//首先有一个jdbcdemo数据库 中有一个 student表(id,name), 往里面插入一个数据.
//1. 创建"数据源" 数据源=>数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false");
//设置了URL之后,还需要设置用户名和密码
((MysqlDataSource)dataSource).setUser("root");//大家都是root
((MysqlDataSource)dataSource).setPassword("123456");//密码是安装数据库的时设置的密码
//2.和数据库建立连接
Connection connection = dataSource.getConnection();//这里需要抛异常
//3. 构造SQL语句
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL语句 , 返回值就是"这次操作影响到几行"
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5.释放必要的资源,关闭连接
statement.close();//注意顺序 后创建的先关闭
connection.close();//先创建的后关闭
}
}
代码示例: 插入操作的讲解
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCDemo1 {
public static void main(String[] args) throws SQLException {
//假定有一个jdbcdemo数据库中有一个student表(id,name), 往里面插入一个数据.
//1. 创建"数据源" 数据源=>数据库服务器在哪
DataSource dataSource = new MysqlDataSource();//向上转型
//DataSource: JDBC 的interface
//MysqlDataSource(): MySQL驱动包提供的类 这个类就实现了DataSource interface
//设置URL:
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false");
//向下转型又回来了
//目的是为了使用setUrl()方法,这个方法是子类才有的
//URL 唯一资源定位符,通常使用URL来描述网络的一个资源的位置
//mysql本体是服务器,相当于是网络上的资源
//或者:
// MysqlDataSource dataSource = new MysqlDataSource();
// dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false");
//这种写法完全可以,不要任何转型 直接这么写
/**
* 按照上述转型的写法 本意是希望 "MysqlDataSource" 这个类 不要扩散到代码的其他部分
* 目的是想降低mysql驱动包,和咱们项目代码之间的耦合关系,避免后续更换数据库的时候,有太大的成本
*
* 不过当前代码比较简单 此时也不太涉及"耦合不耦合"的事情
* 所以这里直接写的方法也,问题
*/
/**
* "jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false"
* jdbc:mysql : url是一个啥样类型/用途的url jdbc:mysql就是说是给jdbc的mysql使用的
* 127.0.0.1 : ip地址 127.0.0.1是一个特殊的ip地址 特指你自己这个主机
* 如果你的java代码和数据库服务器整齐不太主机上,就需要写对应数据库服务器的ip地址了
* 如何查看一台机器的ip地址:打开cmd 输入ipconfig
* 3306 : 端口号 用来区分主机上的应用程序的 (进程)
* jdbcdemo : 数据库名
* characterEncoding=utf8 : 统一字符集是utf8
* useSSL=false : 表示数据库服务器和客户端之间的通信要不要加密
* 不写也行 但还是写上,有的人这里不写连不上数据库
* (不写是默认加密的,有的人的电脑里的证书头问题,导致加密连接无法进行)
*/
//设置了URL之后,还需要设置用户名和密码
((MysqlDataSource)dataSource).setUser("root");//大家都是root
((MysqlDataSource)dataSource).setPassword("123456");//安装数据库的时候 设置的密码
//2.和数据库建立连接
Connection connection = dataSource.getConnection();//这里需要抛异常
//注意! 导入 Connection java.sql 这个包, 别的不行
//3. 构造SQL语句
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
/**
* 本身SQL语句 是String类型的
* JDBC提供了Statement(语句) 对象, 让我们把String转换成Statement再转发给服务器执行
* 但是 一般会使用PreparedStatement(预处理的语句) 对象来代替Statement
*
* Statement是把sql原封不动的直接发给数据库服务器,数据库服务器自己负责解析SQL
* PreparedStatement 会先在客户端这边初步解析一下SQL(验证语法格式是否符合要求啥的..),此时
* 服务器就不用做这些检查了,从而降低服务器的负担
*/
//4.执行SQL语句 , 返回值就是"这次操作影响到几行"
int n = statement.executeUpdate();
// executeUpdate() 适用于 插入,修改,删除这些操作 本质都是"写"操作 这里使用insert into 是插入操作
// executeQuery() 适用于查询 本质是"读操作"
System.out.println("n = " + n);
//5.释放必要的资源,关闭连接
statement.close();//注意顺序 后创建的先关闭
connection.close();//先创建的后关闭
/**
* 创建的语句对象 和 连接对象, 都会持有一些计算机的硬件/软件上的资源, 这些资源不用了就应该要及时释放
* java中虽然有"垃圾回收"机制,自动释放内存 但是计算机的资源不仅仅是内存
* 比如 connection 使用到其他的资源
* 这些其他的资源就需要手动释放,一般都会提供close方法 专门负责释放资源的方法
*/
}
}
运行结果:
代表这次操作影响了student这个表中的一行
在MySQL中查询这个表:
插入的数据能够运行时动态的变化 代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCDemo1 {
//插入的数据能够运行时 动态的变化
public static void main(String[] args) throws SQLException {
//假定有一个数据库jdbcdemo中一个student表(id,name), 往里面插入一个数据.
//让用户通过控制台来输入学号和姓名
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号: ");
int id = scanner.nextInt();
System.out.println("请输入姓名: ");
String name = scanner.next();
//1. 创建"数据源" 数据源=>数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false");
//设置了URL之后,还需要设置用户名和密码
((MysqlDataSource)dataSource).setUser("root");//大家都是root
((MysqlDataSource)dataSource).setPassword("123456");//安装数据库的时候 设置的密码
//2.和数据库建立连接
Connection connection = dataSource.getConnection();//这里需要抛异常
//3. 构造SQL语句
String sql = "insert into student values(?,?)";
// ? 是一个占位符,占据一个位置后,后续 PreparedStatement 会把变量的数值带入到 ? 中 从而完成动态数值的插入
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);// 1 代表第一个'?' ,注意是从1开始计
statement.setString(2,name);
//4.执行SQL语句 , 返回值就是"这次操作影响到几行"
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5.释放必要的资源,关闭连接
statement.close();//注意顺序 后创建的先关闭
connection.close();//先创建的后关闭
}
}
运行:
在MySQL中查询这个表:
查询操作的讲解
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCDemo2 {
public static void main(String[] args) throws SQLException {
//查询数据库jdbcdemo 中 student表
//1. 创建"数据源" 数据源=>数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//大家都是root
((MysqlDataSource)dataSource).setPassword("123456");//安装数据库的时候 设置的密码
//2.和数据库建立连接
Connection connection = dataSource.getConnection();//这里需要抛异常
//3. 构造SQL语句
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行查询操作
//要使用 executeQuery (代表读操作),返回值是一个 ResultSet 类型的对象, 表示一个"表格"
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合
while(resultSet.next()){
//获取到这一行的 学号 列
int id = resultSet.getInt("id");
//获取到这一行的 姓名 列
String name = resultSet.getString("name");
System.out.println("id: " + id + ",name: " + name);
}
//6.释放必要的资源,关闭连接
statement.close();
connection.close();
}
}
运行结果:
动态的查询操作 (查询某一行)
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCDemo2 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的学号: ");
int studentId = scanner.nextInt();
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbcdemo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//大家都是root
((MysqlDataSource)dataSource).setPassword("123456");//安装数据库的时候 设置的密码
Connection connection = dataSource.getConnection();//这里需要抛异常
String sql = "select * from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,studentId);
//执行查询操作, 要使用 executeQuery ,返回值是一个 ResultSet 类型的对象, 表示一个"表格"
ResultSet resultSet = statement.executeQuery();
//遍历结果集合
while(resultSet.next()){
//获取到这一行的 学号 列
int id = resultSet.getInt("id");
//获取到这一行的 姓名 列
String name = resultSet.getString("name");
System.out.println("id: " + id + ",name: " + name);
}
statement.close();
connection.close();
}
}
运行: