4.4JDBC

4.1 体系架构

4.2连接步骤

  1. 导入jar包
  2. 注册驱动程序
  3. 数据库URL配置
  4. 创建连接对象

4.3 URL配置

  • 常用方法:通过连接池进行配置

4.4 sql注入与PrepareStatement

4.4.1 注入原理

  • 通过字符串拼接or,使得条件为真
    String username ="admin"; 
    String password=" 'abc' or 1=1 "; 
    String sql="select * from users where username= '"+username+"' and password= "+password;

4.4.2 PrepareStatement防止注入原理

  • 通过对占位符赋值,防止字符串拼接,同时对单引号做了转义处理,如"abc 'or' 1 = 1",这样查找的结果为空,而不是将or 1=1作为查询条件

4.5 连接池

4.5.1 分类

  1. DBCP连接池
  2. C3P0连接池
  3. Druid连接池

4.5.2 比较

4.5.3 配置文件

  • 连接池直接读取配置文件,可使代码简洁
    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/xxx(具体的数据库名)?serverTimezone=UTC
    username=xxx
    password=xxx
    #初始化连接数量
    initialSize=5
    # 最大连接数量
    maxActive=10
    # 最大等待时间
    maxWait=3000

4.5.4 Druid流程(封装工具类)

    private static DataSource ds;
    static {
        try {
            //  2.加载配置文件
            Properties pro = new Properties();
            pro.load(Demo1.class.getClassLoader().getResourceAsStream("druid.properties"));
            //  3.获取连接对象
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.6 JDBC流程

查找

    private Connection conn ;
    private PreparedStatement ps;
    private ResultSet rs;
    
    try {
            //  1.定义sql
            String sql = "select * from airinfo where dest=?";
            //  2.获取连接
            conn=getConnection();
            ps = conn.prepareStatement(sql);
            //  3.赋值sql
            ps.setString(1, dest);
            //  4.执行sql
            rs = ps.executeQuery();
            //  5.获取查询结果
            map=new HashMap<>();
            while (rs.next()) {
                AirInfo a = new AirInfo();
                a.setId(rs.getInt("id"));
                a.setNum(rs.getString("airnum"));
                a.setDest(rs.getString("dest"));
                a.setDepartDate(rs.getDate("departDate"));
                map.put(rs.getInt("id"), a);
            }
            return map;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        } finally {
            close(rs, ps, conn);
        }

更新(删除,插入类似)

    try {
            //  1.定义Sql
            String sql = "update airinfo set airnum=?,dest=?,departDate=? where id=?";
            //  2.获取连接
            conn=getConnection();
            ps = conn.prepareStatement(sql);
            //  3.赋值sql
            ps.setString(1, a.getNum());
            ps.setString(2, a.getDest());
            java.sql.Date d = new java.sql.Date(a.getDepartDate().getTime()+1000*60*60*24);//util日期转换为sql日期
            ps.setDate(3, d);
            ps.setInt(4, a.getId());
            //  4.执行sql
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(ps, conn);
        }
  • DQL与DML的区别在于PrepareStatement的执行
  • DQL查询语句是ps.excuteQuery()
  • DML管理语句是ps.excute()
posted @ 2021-04-25 22:51  芥纳须弥  阅读(77)  评论(0)    收藏  举报