JDBC的基础操作
JDBC编程
@[toc]
在实际工作中,很多时候还是使用代码来操作SQL语句的
API : Application Programming Interface 引应用程序编程接口
提供了一组类/方法,让程序员调用
但是,做数据库的厂商很多,Oracle MySQL SQLite SQL Server, 不同种类的数据库,提供的API不一样,这样就增加了学习的成本以及替换数据库的成本
Java为了解决上述的问题,就提供了一套统一风格的数据库操作 API(JDBC), 让数据库厂商来适配这套Java的API,这样子程序员只要掌握这一套Java 的API就能操作各种数据库,这一套API就是JDBC(java database connection)
JDBC环境搭建
下载驱动包
当然要先下载驱动包才能使用
建议去中央仓库
直接搜索 mysql
驱动包有很多的版本,要保证和数据库的大版本对得上
我这里使用的是MySQL 5.7版本 ,所以只要选择5系列就行了
这个驱动包本质上就是一个压缩包,是以.jar为后缀的文件 ,成为jar包
jar包 点进去就是一堆.class文件,(java编译生成的二进制文件)
jar包是java发布程序的一种 常见手段(因为有很多的.class文件,随意打成一个jar包就会很方便)
将驱动包导入到项目中
创建一个lib(库)(必须要与 src同一级)
将驱动包粘贴到lib里面,右键lib,点击add as library就导入成功
开始进行JDBC
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
public class JDBC {
public static void main(String[] args) {
//创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
DataSource dataSource = new MysqlDataSource();//向上转型
((MysqlDataSource) dataSource).setURL();//向下转型(需要强制转型)
//这里的set操作不是DataSource的,而是MysqlDataSource,所以要向下转型,转成MysqlDataSource才能调用set方法(父类-->子类:向下转型)
}
}
对于 DataSource dataSource = new MysqlDataSource();
DataSource 是标准库JDBC的一个接口,MysqlDataSource来自于自己导入的jar包
每种数据库有都会提供对应的类来实现DataSource接口–也就是new 后面的对象
此处用到了向上转型–子类对象转为(指向)父类对象 实例:Animal b=new Bird(); Bird继承于Animal DataSource是父类,MysqlDataSource是具体的子类这里也是用到了多态的概念
封装: 将实现的细节隐藏起来,让调用者不必考虑细节,直接调用即可
多态:将实现类的类型也隐藏起来了,调用者不仅不要考虑细节,类型也不要管了
MysqlDataSource dataSource1 = new MysqlDataSource(); dataSource1.setURL(); //要是直接这样写,MysqlDataSource就会出现,导致MySQL与项目的耦合性就会提高 //要是以后迁移数据库有就会有很多的修改,维护成本高,所以还是上面的向上转型写法更好
写代码追求的是"高内聚,低耦合"
耦合性
一个大的程序,里面有很多的部分,要是这些部分之间的关联性比较强,那就是耦合性高
反之,耦合性低,我们追求的就是部分与部分之间要减少关联–低耦合
内聚性
简单来说,内聚就是将相关的代码写到一起
举一个实际的例子:将所有的衣服全都放到衣柜里面,不至于同一件,西一件,这就是高内聚
URL
URL 统一资源定位符 俗称网址
ip地址描述了网络上主机的位置
127.0.0.1 是一个特殊的ip地址,表示本机,无论本机是什么,都可以用127.0.0.1 来表示本机 , 这个ip地址也叫做环回ip/环回地址
端口号是用来区分主机上不同的应用程序的
ip地址确定主机位置,但是一台主机上面有很多的程序,就由端口号来区分不同的程序
3306是mysql的默认端口号
由上面可以看出,DataSource描述了在哪里能找到数据库的位置
URL能体现出数据库服务器的位置,以及 数据库的名称
在连接数据库的时候,Connection connection= dataSource.getConnection();
这里的Connection用的是标准库里面的
String sql = "insert into student values(1,'张三')";//注意:这里varchar插入格式是单引号 PreparedStatement statement = connection.prepareStatement(sql); //PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析 //但是解析过程还是很消耗资源的,服务器要处理很多的客户端请求,很忙,所以就将一部分解析的工作交给客户端 //自己进行解析,数据库就省去了解析的过程,就节省了资源消耗,提高了处理效率
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//通过JDBC操作数据库,往数据库中插入一条数据
public class JDBC {
public static void main(String[] args) throws SQLException { //数据库中常见的异常
//1.创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
DataSource dataSource = new MysqlDataSource();
//DataSource 是标准库JDBC的一个接口,MysqlDataSource来自于自己导入的jar包
//每种数据库有都会提供对应的类来实现DataSource接口--也就是new 后面的对象
//此处用到了向上转型--子类对象转为(指向)父类对象 实例:Animal b=new Bird(); Bird继承于Animal
//DataSource
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
//向下转型(需要强制转型) 这里的set操作不是DataSource的,而是MysqlDataSource
//所以要向下转型,转成MysqlDataSource才能调用set方法
((MysqlDataSource) dataSource).setUser("root");//用户名
((MysqlDataSource) dataSource).setPassword("1111");//密码
//2. 让代码和数据库服务器进行连接
Connection connection= dataSource.getConnection();//连接数据库 getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
//3.构造要执行的SQL语句
//先通过字符串描述出要执行的sql语句,再通过PrepareStatement对象来接收sql语句
String sql = "insert into student values(1,'张三')";//注意:这里是单引号
PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
//4.执行SQLp[发送请求 & 读取响应]
//executeUpdate 对应插入修改删除操作,返回值表示这次SQL操作影响的行数
//executeQuery 对应查询操作,返回值是返回的临时的临时表数据
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;
//通过JDBC操作数据库,往数据库中插入一条数据
public class JDBC {
public static void main(String[] args) throws SQLException {
//1.创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");//用户名
((MysqlDataSource) dataSource).setPassword("1111");//密码
//2. 让代码和数据库服务器进行连接
Connection connection = dataSource.getConnection();//连接数据库 getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
//3.构造要执行的SQL语句
String sql = "insert into student values(1,'张三')";//注意:这里varchar的格式是单引号
PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
//4.执行SQLp[发送请求 & 读取响应]
int n = statement.executeUpdate();
System.out.println("n = "+ n);
//5,完成之后,就需要关闭释放相关资源
statement.close();
connection.close();
}
}
JDBCInsert
public static void main(String[] args) throws SQLException {
//1.创造数据源对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");//用户名
((MysqlDataSource) dataSource).setPassword("1111");//密码
//2. 让代码和数据库服务器进行连接
Connection connection = dataSource.getConnection();//连接数据库 getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
//3.构造要执行的SQL语句
//[用户自己输入数据]
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要插入的学号");
int id = scanner.nextInt();
System.out.println("请输入要插入的姓名");
String name = scanner.next();
String sql = "insert into student values(?,?)";// ? 是 占位符,只是占个位置,之后会被替换掉
PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
statement.setInt(1,id);// 1 表示 替换第一个?
statement.setString(2,name);// 2 表示替换第二个?
//4.执行SQL[发送请求 & 读取响应]
int n = statement.executeUpdate();
//System.out.println("statement" + statement);
//System.out.println("n = "+ n);
//5,完成之后,就需要关闭释放相关资源
statement.close();
connection.close();
}
其实,插入修改删除都是一样的操作,这三者的执行用的都是executeUpdate,只是sql的语句不一样而已
JDBCUpdate
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 JDBCUpdate {
public static void main(String[] args) throws SQLException {
//1.创建一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1111");
//2.和数据库进行连接
Connection connection = dataSource.getConnection();
//3.构造SQL语句
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要修改的同学的学号:");
int id = scanner.nextInt();
System.out.println("请输入修改后的姓名:");
String name = scanner.next();
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);//代表第一个?,是String类型的
statement.setInt(2,id);
//4.执行SQL语句
int n = statement.executeUpdate();
System.out.println("n= " + n);
//5.关闭释放资源
statement.close();
connection.close();
}
}
JDBCDelete
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 JDBCDelete {
public static void main(String[] args) throws SQLException {
//1,创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1111");
//2.连接数据库
Connection connection = dataSource.getConnection();//Connection是Java.sql的
//写SQL语句 解析
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要删除的学生id:");
int id = scanner.nextInt();
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);//解析
statement.setInt(1,id);
//4.执行sql语句
int n = statement.executeUpdate();
System.out.println("n= " + n);
//5.资源的关闭释放
statement.close();
connection.close();
}
}
JDBCSelect
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 JDBCSelect {
public static void main(String[] args) throws SQLException {
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1111");
//2.连接数据库
Connection connection = dataSource.getConnection();
//3.构造sql语句
String sql = "select * from student where id = ? ";//条件查询
PreparedStatement statement = connection.prepareStatement(sql);//解析
statement.setInt(1,2);//前面的数字一定要从1开始,后面是表中的id,即要查询的id数字
//4.执行SQL语句
//查询结果要用executeQuery来完成
//返回结果是ResultSet 结果集 类似于表的数据结构
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合
while (resultSet.next()) {
//每次循环就会将每一行id 和 name 取出
int id = resultSet.getInt("id");//getXXX里面放到是列名
String name = resultSet.getString("name");
System.out.println("id = "+ id +",name= "+ name );
}
//5.资源的关闭与释放
resultSet.close();//resultSet也是资源
statement.close();
connection.close();
}
}
- 点赞
- 收藏
- 关注作者
评论(0)