1.概述
回顾之前连接数据库的方式
DOS指令方式,图形化方式
缺点:只能是简单地SQL语句的测试,无法在项目中操作数据库
引出通过java代码方式连接数据库---JDBC
概述:JDBC是一套连接数据库的标准;具体的实现是由不同的数据库提供的官方词条:Java数据库连接,(Java Database Connectivity,简称JDBC),是Java语言中用来规范客户端程序如何来访问数据的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
1.1JDBC核心思想
1.2JDBC操作步骤
1.3具体应用
安装5.7的数据库,驱动包选择5.X的驱动包
导入驱动包:
- 在项目下新建 lib 文件夹,用于存放 jar 文件。
- 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。
- 选中 lib 文件夹右键 Add as Libraay,点击 OK。
常见的异常问题:
ClassNotFoundException 驱动加载失败
MySQLSyntaxErrorException: 数据库或SQL语句异常
SQLException: Access denied 账户或密码出错
MySQLIntegrityConstraintViolationException 主键冲突
2.DML操作
//案例:给岗位表添加一条数据
public class DMLTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过驱动管理器获取连接对象 alt+enter弹出异常与赋值变量
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1", "root", "123");
//3.通过连接对象获取执行对象
Statement st = conn.createStatement();
//4.进行增删改查操作 增删改:executeUpdate
//String sql = "insert into t_jobs(job_id,job_title,min_salary,max_salary) values('QF_PRA','PRA',13000,18000)";
//String sql = "update t_jobs set min_salary=20000,max_salary=30000 where job_id='QF_PRA'";
String sql = "delete from t_jobs where job_id='QF_PRA'";
//5.反馈结果
int result = st.executeUpdate(sql);
System.out.println("影响的条数:"+result);
//6.关闭资源,先关小的再关大的
DBUtils.closeAll(st,conn);
}
}
3.DQL操作
class Student{
private int id;
private String name;
private int age;
//set/get及构造方法略
}
//查询学生表的数据
public class DQLTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///mydb1", "root", "123");
Statement st = conn.createStatement();
//获取结果集
ResultSet rs = st.executeQuery("select * from student");
List<Student> list = new ArrayList<>();
//循环遍历,获取所有记录(每次循环,都是一条记录
while(rs.next()){
//int id = rs.getInt(1); //1代表第1列;应用场景:聚合查询反馈
int id = rs.getInt("id"); //id:字段名获取值
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id+"-->"+name+"-->"+age);
//应用场景:反馈零散的内容,应该需要对象封装,
list.add(new Student(id,name,age));
}
System.out.println("集合中存储的数据:"+list);
DBUtils.closeAll(rs,st,conn); //关闭资源
}
}
4.安全登录案例
> - 创建一张用户表 User
> - id ,主键、自动增长。
> - 用户名,字符串类型,唯一、非空
> - 密码,字符串类型,非空
> - 手机号码,字符串类型
> - 插入 2 条测试语句
#### 实现登录
> - 通过控制台用户输入用户名和密码。
> - 用户输入的用户名和密码作为条件,编写查询 SQL 语句。
> - 如果该用户存在,提示登录成功,反之提示失败。
public class LoginTest {
public static void main(String[] args) {
System.out.println("请输入用户名");
Scanner sc = new Scanner(System.in);
String username = sc.nextLine(); //获取一行内容
System.out.println("请输入密码");
String password = sc.nextLine();
if(login2(username,password)){ //登录功能
System.out.println("登录成功~!");
}else{
System.out.println("登录失败~!");
}
}
private static boolean login2(String username, String password) {
Connection conn = null;
PreparedStatement prst = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///mydb1", "root", "123");
//PreparedStatement:预处理执行对象 ?为占位符
//好处: 1.安全性高,解决了sql注入问题
//2. 执行性能会更高
//3. 方便进行批处理操作
prst = conn.prepareStatement("select count(*) from user where username=? and password=?");
//参数1:对应第一个占位符? 下标从1开始
prst.setString(1,username);
prst.setString(2,password);
//获取结果集
//sql注入的隐患
rs = prst.executeQuery();
if(rs.next()){
int result = rs.getInt(1); //聚合函数只有一个字段
return result>0; //result不小于0,则返回true
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(rs,prst,conn);
}
return false;
}
private static boolean login(String username, String password) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///mydb1", "root", "123");
st = conn.createStatement();
//获取结果集
//sql注入的隐患 select count(*) from user where username='' or 1=1 # ' and pas...
String sql = "select count(*) from user where username='"+username+"' and password='"+password+"'";
rs = st.executeQuery(sql);
if(rs.next()){
int result = rs.getInt(1); //聚合函数只有一个字段
return result>0; //result不小于0,则返回true
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(rs,st,conn);
}
return false;
}
}