目录
一、JDBC概述
1.引言
前面的操作,不管是通过DOS还是navicat操作数据库,都是特别麻烦的,特别频繁的复制型的操作
如果使用java代码(软件)去操作数据库,则只需要触发一个指令,内部即可联动性的循环操作SQL语句
2.JDBC概述
什么是JDBC? JDBC其实就是通过java代码操作数据库的一种规范和标准
只需要数据库产品提供相关的驱动,java代码就可以连接上数据库,从而通过java代码操作数据库
3.使用JDBC
先将驱动放入项目中,添加到库,即可使用驱动
mysql的驱动选择: mysql-connector-java-8.0.X 适用于 8.X版本
编写JDBC操作步骤
4.JDBC操作步骤
1.加载驱动
2.获取连接对象
3.创建执行对象
4.执行SQL语句
5.返回结果 查询则返回结果集 DML则返回影响条数
6.关闭数据库
二、JDBC应用案例
1.DML操作
//案例:增删改t_jobs数据
Connection conn = null;
Statement st = null;
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.通过驱动管理器获取连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1?serverTimezone=UTC", "root", "123");
//3.创建执行对象
st = conn.createStatement();
//添加
//String sql = "insert into t_jobs values('MY_IT','IT_1',10000,25000)";
//修改
//String sql = "update t_jobs set min_salary=20000 where job_id='MY_IT'";
//删除
String sql = "delete from t_jobs where job_id='IT_PROG'";
//4.执行SQL操作 5.返回影响条数
int res = st.executeUpdate(sql);
System.out.println("执行update:"+res);
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭数据库的接口为AutoCloseable
DBUtils.closeAll(st,conn); //统一资源关闭
}
统一数据库资源关闭 AutoCloseable...ac(资源类型的可变长参数,用于关闭未知数量的资源)
public static void closeAll(AutoCloseable...ac){ for(AutoCloseable a:ac){ if(a!=null){ try { a.close(); } catch (Exception e) { e.printStackTrace(); } } } }
2.DQL操作
//案例:查询t_jobs数据
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.通过驱动管理器获取连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1?serverTimezone=UTC", "root", "123");
//3.创建执行对象
st = conn.createStatement();
String sql = "select * from t_jobs";
rs = st.executeQuery(sql); //返回结果集--存储记录的集合
while(rs.next()){ //结果集遍历--类似迭代器操作
//参数为字段的字符串; 当获取聚合函数值,可使用整数标记
String job_id = rs.getString("job_id");
String job_title = rs.getString("job_title");
String min_salary = rs.getString("min_salary"); //alt+enter
String max_salary = rs.getString("max_salary");
System.out.println(job_id+"--"+job_title+"--"+min_salary+"--"+max_salary);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭数据库的接口为AutoCloseable
DBUtils.closeAll(rs,st,conn); //统一资源关闭
}
3.整理报错异常
主键约束失败-重复添加主键值(常见) Duplicate entry 'MY_IT' for key 't_jobs.PRIMARY'
没到驱动包或驱动名写错(常见) ClassNotFoundException: com.mysql.cj.jdbc.Driv
url写错了 SQLException: No suitable driver found for jdbc:my://...
用户名或密码写错 SQLException: Access denied for user 'root'@'localhost'
数据库名写错了 SQLSyntaxErrorException: Unknown database '666'
sql语句异常(常见) SQLSyntaxErrorException: You have an error in your SQL syntax
获取的字段名写错 SQLException: Column 'job_i' not found
三、综合案例
1.创建表
创建一张用户表 User
id ,主键、自动增长。
用户名,字符串类型,唯一、非空
密码,字符串类型,非空
手机号码,字符串类型
插入 2 条测试语句
2.实现登录
通过控制台用户输入用户名和密码。
用户输入的用户名和密码作为条件,编写查询 SQL 语句。
如果该用户存在,提示登录成功,反之提示失败。
3.登录应用
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入用户名:");
//next则字符串空格则结束 nextLine允许有空格,例如“zs f”是一个用户名
String username = sc.nextLine();
System.out.print("请输入密码:");
String password = sc.nextLine();
if(login(username,password)){ //调用登录功能
System.out.println("登录成功~~!");
}else{
System.out.println("登录失败~~!");
}
}
private static boolean login(String username, String password) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//2.通过驱动管理器获取连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1?serverTimezone=UTC", "root", "123");
//3.创建执行对象
st = conn.createStatement();
String sql = "select count(*) from user where username='"+username+"' and password='"+password+"'";
rs = st.executeQuery(sql);
if(rs.next()){
//rs.getInt(1):获取第一个字段 count(*)字段 聚合函数:0或大于0
return rs.getInt(1)>0;
}
}catch (Exception e){
e.printStackTrace();
}finally {
DBUtils.closeAll(rs,st,conn);
}
return false;
}