首先声明,java新手,最近新学的jdbc,感觉细节众多,琐碎每次忘记都需要去查,就自己写篇写点东西用来记录一下,方便自己查阅,小小新手,如有错误敢情看官不吝斧正。
1.1jdbc简介
JDBC(Java DateBase connectivity)Java数据库简介技术
具体说就是通过Java连接数据库,并对数据库中数据进行增删改查等操作的技术
1.2jdbc相关的API
JDBC要通过Java代码操作数据库,JDBC中定义了各种操作数据库的接口和类。Driver 驱动接口,定义了Java如何和数据库获取连接
DriverManager 工具类 提供了管理驱动的便捷能力,可以获取和数据库的连接
Connection 连接接口 代表了Java和数据库之间的联系
PrepareStatement (statement)发送SQL语句的工具接口 该类型的对象用于向数据库发送一条SQL语句
ResultSet 结果集接口 该类型的对象表示一条查询SQL的结果
1.3 jdbc 是规范不是实现
从根本上来说,JDBC是一种规范,它提供了一整套完整的接口,允许便携式访问底层数据库,因此可以轻松的用
| | 为什么JDBC只有接口,没有提供实现? 不同数据库底层技术不同,不少数据库是闭源的,源代码不公开的,Sun公司无力为所有数据库提供具体实现,只 ?能提供接口而由数据库厂商提供具体实现,Sun公司只是制定了JDBC标准,各个数据库厂商根据标准提供具体实???? 现。 |
JDBC编写适用于各种数据库的程序
2.0 jdbc的编程
2.1 jdbc的编程步骤
??????? 首先jdbc操作数据库和Navicat操作数剧效果基本一致,操作数据库的步骤也是大同小异,将两者做下对比。
具体步骤:
1.加载驱动
2.获取连接
3.准备一个发送sql的工具
4.发送SQL
5.处理结果集
6.释放资源
准备工作
- 准备开发工作(搭建开发环境)
需要在项目中引入数据库驱动jar包(jar包:针对class文件的压缩格式包含了多个带包的class文件,类似于普 通吗文件打包完之后的zip,rar)
idea
将mysql-connector-java-8.0.23.jar添加到项目中
1.右键选中项目,新建一个lib文件夹,将jar包复制到lib中 2.选中jar包,add as
类似于
编码:
public class JDBCTest01 {
public static void main(String[] args) throws Exception {
//1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String username="root"; String password="root";
//url参数用来确定连接的数据库信息
/*
* 数据库机器IP
* 端口号:port
* 数据库名db_name
* 连接的参数 编解码集,时区
* url格式:jdbc:mysql://ip:port//db_name?k=v参数...
* */
String url="jdbc:mysql://localhost:3306/baizhi? userUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=Asia/Shanghai";
Connection conn = DriverManager.getConnection(url, username, password);
//3.准备发送SQL的工具
String sql="INSERT INTO t_person VALUES(null,'王五',19,'男','199999999','大学城')";
PreparedStatement pstm = conn.prepareStatement(sql);
//4.发送执行SQL
//有一个返回值update 是告知我们表中数据有多少行发生了变化
int update = pstm.executeUpdate(); System.out.println("被影响的条数"+update);
//5.处理结果集(如果有)
//6.释放资源
//后使用的资源先释放
pstm.close();
conn.close();
}
}
类似的相应的增删改查都可以仿照改写,只是注意执行增删改语句和查询语句的方法不一样
增删改:使用的是发送SQL工具的executeUpdate()
?????????????? 获得的是一个int的返回值
查询:使用的是发送SQL工具的executeQuery()
??????????????? 获得的是
结果集处理:
?
注意:两种结果集数据处理方式,使用序列号获取和使用列名获取,我们推荐使用列名获取。
案例演示:
public class JDBCTest03 {
public static void main(String[] args) throws Exception {
//1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建和数据库之间的连接
String username="root"; String password="root";
String url="jdbc:mysql://localhost:3306/baizhi?userUnicode=true&characterEncoding=UTF- 8&userSSL=false&serverTimezone=Asia/Shanghai";
Connection conn = DriverManager.getConnection(url, username, password);
//3.准备一个发送SQL的工具
String sql="select * from t_person"; PreparedStatement pstm = conn.prepareStatement(sql);
//4.发送并执行SQL
ResultSet rs = pstm.executeQuery();
//5.处理结果集
/*
* getXxx("列名"):获取到指定列的值 Xxx为数据类型
* getXxx(序列号):获取到指定顺序的列的值
*
* */
while (rs.next()){
int personId = rs.getInt("person_id");
String personName = rs.getString("person_name"); int age = rs.getInt("age");
String sex = rs.getString(4); String mobile = rs.getString(5);
String address = rs.getString(6);
System.out.println("personId="+personId+",personName="+personName+",age="+age+",sex="+sex+",mob
ile="+mobile+",address="+address);
}
//6.释放资源rs.close();
pstm.close();
conn.close();
}
}
关于这里的一些小的细节,可以参照
https://blog.csdn.net/weixin_45802913/article/details/120694804
3.数据绑定
数据绑定:将用户输入的数据,绑定到SQL语句当中
JDBC 执行的SQL中的数据要根据用户的输入发生变化,比如 登录功能背后的查询SQL要根据用户名不同,执行不同的条件,这个就需要将用户输入的数据绑定到SQL语句中。
绑定数据的方式有2种:
??????? 字符串拼接、 占位符绑定
3.1字符串拼接
本质上就是通过Java字符串拼接的语法构造出正确的SQL语句
- 在需要数据的地方,使用变量名进行替换
- 在变量名前添加"+ 在变量名后添加+"
- 如果拼接的是字符串的话,那么需要在"+之前添加' 在+"之后添加'
代码实例:
static int loginSys(Connection conn) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名:");
String adminName = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
String sql = "select admin_name, password from admin where admin_name = '"+adminName+"'and password = '"+password+"'";
PreparedStatement pstm = conn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
int flag = 0;
while (rs.next()){
flag = 1;
String AdminName = rs.getString("admin_name");
String PassWord = rs.getString("password");
System.out.println("用户名:" + AdminName + "密码:" + PassWord);
}
System.out.println(rs.next());
if (flag == 1){
return 1;
}
else{ return 0;}
}
3.2占位符拼接
?占位符是JDBC 中一种特殊语法,专门用于参数绑定使用步骤:
- 在需要数据的地方,使用?代替(占位)
- 在发送SQL之前,通过pstm。setXxx方法给?赋值
?代码示例:
public Student findStudent(String name) {
Student stu = new Student();
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
conn = JDBCUtils.getConnection();
String sql = "select student_id, student_name, sex, class_id from t_student where student_name = ?";
try {
pstm = conn.prepareStatement(sql);
pstm.setString(1,name);
rs = pstm.executeQuery();
if ( rs != null){
while (rs.next()){
stu.setStudentId(rs.getString("student_id"));
stu.setStudentName(rs.getString("student_name"));
stu.setSex(rs.getString("sex"));
stu.setClassId("class_id");
stu.toString();
}
}else{
stu = null;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
finally {
if (null != conn || pstm != null || rs != null){
JDBCUtils.free(rs,null,conn,pstm);
}
}
return stu;
}
?3.3字符串拼接和?占位符拼接的 区别
|