JDBC基础操作

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值