JDBC实现简单的增删改查
一、JDBC的简单介绍
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口 -----百度
JDBC
是 java
定义的一个规范,与关系型数据库交互的一个规范,不同的数据库厂商根据这个规范进行了不同的实现,例如 MySql
实现的链接, Oracle
实现的链接, 还有 SqlServer
实现的等等。有了这个规范方便了我们的程序员针对不同数据库的开发成本,不用再去单独的查每个厂家的 API
了,进而简化我们的开发。
二、项目创建
- 开发工具
idea
数据库mysql5.7
- jdk版本
1.8
- 环境就是 最最简单的一个java类 man 方法
- 代码结构
- 这里注意没有用Maven,所以记得把
jar包
手动的引用到项目中 - 准备数据库用户表
user
,里面有id,name,age, sex
等字段id
为自增主键
三、 具体的代码实现
好了闲话不多说了开始上代码
1. 加载数据库的链接
/**
* 获取数据库的链接
* 1. 加载数据库的驱动,注意这里高版本的驱动的包路径有了改变
* 2. 获取数据库的连接,这里需要三个参数
* a. 数据库的链接地址,这里有一些版本的链接是需要加上时区的指定的,我这里没有加
* b. 数据库的用户名
* c. 数据库用户的密码
*/
private static Connection getConnection(){
try {
// 1. 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取数据库的连接,这里需要三个参数
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return null;
}
2. 实现插入操作 insert
/**
* 插入的语句
*/
private static void insert(){
// 获取数据库的链接
Connection connection = getConnection();
// 这里的sql语句可以直接拼接成最终的sql语句,也可以把参数用?占位符代替,等会再传入。
String sql = "insert into user values (null,?,?,?)";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"许三多");
preparedStatement.setInt(2,38);
preparedStatement.setString(3,"男");
int i = preparedStatement.executeUpdate();
if (i>0) {
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally{
try {
connection.close();
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
3. 实现删除操作 delete
/**
* 删除操作
*/
private static void delete(){
Connection connection = getConnection();
String sql = "delete from user where id = ?";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,2);
//boolean execute = statement.execute(); 发现删除的时候使用 execute() 方法虽然可以执行成功,但是返回的结果是 false
int i = statement.executeUpdate();
if (i>0) {
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
} catch (SQLException throwable) {
throwable.printStackTrace();
}finally {
//@TODO 这里关闭资源
}
}
4. 实现修改操作 update
/**
* 根据sql语句去更新的代码
*/
private static void update(){
Connection connection = getConnection();
String sql = "update user set name = ?, sex = ? where id = ?";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(1,"郝思嘉");
statement.setObject(2,"女");
statement.setObject(3,1);
int i = statement.executeUpdate();
if (i>0) {
System.out.println("更新完成");
}else{
System.out.println("更新失败");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
//@TODO 在这里进行资源的关闭
}
}
5. 实现查询操作 select
/**
* 根据条件去查询的语句
*/
private static void select(){
//1,通过JDBC的模板连接上数据库
Connection con = getConnection();
//2,编写sql语句
String sql="select * from user where age = ?";
PreparedStatement pstm = null;
ResultSet rs = null;
try {
//3.预编译需要执行的sql
pstm = con.prepareStatement(sql);
//prepareStatement中占位符?,通过setXXX(index,values)来进行设置,index从1开始,
pstm.setInt(1, 12);
//执行sql并返回查询结果
rs = pstm.executeQuery();
// 储存数据,这里可以用实体类处理,但是我这里为了减少代码就直接使用map了
List<Map<String,Object>> list = new ArrayList<>();
while(rs.next()){
Map<String, Object> map = new HashMap<>();
map.put("name",rs.getString("name"));
map.put("age",rs.getInt("age"));
map.put("sex",rs.getString("sex"));
list.add(map);
}
System.out.println(list.toString());
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
// 关闭链接
con.close();
pstm.close();
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
我已经测试过了,这里就不展示测试结果了,请自行测试
6. 完整的代码
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author logic
*/
public class JdbcTest01 {
public static void main(String[] args) {
insert();
delete();
update();
select();
}
/**
* 数据库的链接
* @return 数据库的链接
*/
private static Connection getConnection(){
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 插入的语句
*/
private static void insert(){
Connection connection = getConnection();
// 这里的sql语句可以直接拼接成最终的slq语句,也可以把参数用?占位符代替,等会再传入。
String sql = "insert into user values (null,?,?,?)";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"许三多");
preparedStatement.setInt(2,38);
preparedStatement.setString(3,"男");
int i = preparedStatement.executeUpdate();
if (i>0) {
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally{
try {
connection.close();
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 根据条件去查询的语句
*/
private static void select(){
//1,通过JDBC的模板连接上数据库
Connection con = getConnection();
//2,编写sql语句
String sql="select * from user where age = ?";
PreparedStatement pstm = null;
ResultSet rs = null;
try {
//3.预编译需要执行的sql
pstm = con.prepareStatement(sql);
//prepareStatement中占位符?,通过setXXX(index,values)来进行设置,index从1开始,
pstm.setInt(1, 12);
//执行sql并返回查询结果
rs = pstm.executeQuery();
// 储存数据,这里可以用实体类处理,但是我这里为了减少代码就直接使用map了
List<Map<String,Object>> list = new ArrayList<>();
while(rs.next()){
Map<String, Object> map = new HashMap<>();
map.put("name",rs.getString("name"));
map.put("age",rs.getInt("age"));
map.put("sex",rs.getString("sex"));
list.add(map);
}
System.out.println(list.toString());
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
// 关闭链接
con.close();
pstm.close();
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 根据sql语句去更新的代码
*/
private static void update(){
Connection connection = getConnection();
String sql = "update user set name = ?, sex = ? where id = ?";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(1,"郝思嘉");
statement.setObject(2,"女");
statement.setObject(3,1);
int i = statement.executeUpdate();
if (i>0) {
System.out.println("更新完成");
}else{
System.out.println("更新失败");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
//@TODO 在这里进行资源的关闭
}
}
/**
* 删除操作
*/
private static void delete(){
Connection connection = getConnection();
String sql = "delete from user where id = ?";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,2);
//boolean execute = statement.execute(); 发现删除的时候使用 execute() 方法虽然可以执行成功,但是返回的结果是 false
int i = statement.executeUpdate();
if (i>0) {
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
} catch (SQLException throwable) {
throwable.printStackTrace();
}finally {
//@TODO 这里关闭资源
}
}
}
自己总是再使用 mybatis 但是一直没有一个机会好好的深入学习一下 myabtis 所以准备好好的阅读一下源码,从最基础的 JDBC 了解一下,记录一下