A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 奔跑的蜗牛006 于 2018-5-9 15:59 编辑

JDBC的概述

JDBC:java数据库连接,是一种执行SQL语句的javaAPI.
JDBC是以后学习框架的基础;
驱动数据库:
    驱动:两个设备(应用之间通信的桥梁)
JDBC的入门:
    驱动都是以Jar包引入
1.创建数据库
2.创建项目,引入Jar包
3.JDBC代码

加载驱动---DriverManager源代码中static代码块中注册驱动了,不需要手动再注册.
获得连接---(java和数据库建立连接)PreparedStatement之CRUD的步骤:
//导入jar包
//创建工具类JDBCUtils
//创建配置文件(key=value)
//创建Test测试类(增删改查CRUD),查询与其他三个不太一样.1.        创建工具类Utils@Test
public void demo1() {
    //定义变量
    private static final String driverClassName;
    private static final String url;
    private static final String username;
    private static final String password;
    static{
        //创建配置文件对象
        Properties properties = new Properties();
        try{
            //加载配置文件,找到配置文件位置
            properties.load(new FileInputStream("src/db.properties"));
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }
        //获得变量
        driverClassName=properties.getProperty("driverClassName");
        url=properties.getProperty("url");
        username=properties.getProperty("username");
        password=properties.getProperty("password");
    }
   
    //注册驱动的方法
    public static void  loadDriver(){
        try{
             Class.forName("driverClassName");
         }catch(ClassNotFoundException e){
               e.printStackTrace();
         }
    }
   
    //获得连接的方法
    public static Connection getConnection(){
        //定义连接
        Collection conn=null;
        try{
            //调用注册驱动的方法
            loadDriver();
            //获得连接
            conn=DriverManager.getConnection(url,username,password);
        }catch(Exception e){
            e.printStackTrace();
        }
        return conn;
    }
    //释放资源方法
    public static void release(Statement stmt,Connection conn){
        if(stmt!=null){
            try{
                stmt.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            stmt=null;
        }
        if(conn!=null){
            try{
                conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            conn=null;
        }
    }
    //查询使用---方法重载ResultSet结果集
    public static void release(ResultSet rs,Statement stmt,Connection conn){
        if(rs!=null){
            rs.close();
        }catch(SQLException e){
            e.printStackTrace();
        }
        rs=null;
    }
    //后边还有两个方法跟上边的一样就不写了.
}2.PreparedStatement之CURD的保存操作,执行SQL使用executeUpdate(),查询操作用executeQuery()
@Test
public void demo1{
    //定义对象
    Connection conn=null;
    PreparedStatemnt pstmt=null;
    try{
        //调用自建的工具类获得连接
        conn=JDBCUtils.getConnection();
        //编写SQL
        String sql="insert into user values(null,?,?,?,?)";
        //获得操作SQL的对象---预编译+sql
        pstmt=conn.prepareStatement(sql);
        //设置参数
        pstmt.setString(1,"eee");
        pstmt.setString(2,"ddd");
        pstmt.setString(3,"旺财");
        pstmt.setInt(4,34);
        //执行SQL,影响的行数
        int num=pstmt.executeUpdate();
        //判断
        if(num>0){
            System.out.println("保存成功!")
        }else{
            System.out.println("保存失败!")
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        //调用方法释放资源
        JDBCUtils.release(pstmt,conn);
    }
}3 .        提取配置文件.        db.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web_test3   ---(locakhost:3306是本机地址,可以省略)
username=root                             ---用户名
password=123                              ---数据库密码
开发中:    对扩展是开放的,对修改源码是关闭的.
工具类中使用静态方法是可以直接用类名+方法名调用,而非静态方法需要创建对象才可以调用.
先使用静态定义变量,然后再静态代码块赋值.
解耦合:static静态代码块配置信息提取到外部配置文件
配置文件格式: 扩展名是.properties
    属性文件  内容key(变量名)=value(赋值)
    XML文件
提取配置文件步骤:
    内容key(变量名)=value(赋值)
    创建属性文件对象
    加载.load文件,文件输入流(文件在哪)
    获得变量:   对象 .getPropery
演示SQL注入漏洞(statement不行)
    1.  '用户名' or 1=1    or或者的意思
    2.   'aaa' --         ---把密码注释掉了
解决漏洞:
    PreparedStatement
    ?代表变量,设置参数1代表第一个?,2代表第二个?
preparedStatement保存的步骤:
获得连接
编写SQL语句(where后用?代替变量)
预编译SQL,获得操作SQL对象(使用preparedStatement)传入sql
设置参数setString/Int()
执行SQL语句(括号中不再加sql)
打印查询数据(遍历),使用列名(变量名),如果有别名,就用别名替代.
查询需要ResultSet结果集,需要遍历(while,问自己有没有下一个),查询使用excuteQuery()
while(rs.next()){           System.out.println(rs.getInt("id")+rs.getString("username")+rs.getString("password")+rs.getInt("age")+rs.getString("nickname"));
}
增删改CRUD不需要ResultSet,执行SQL使用executeUpdate()
Statement 和 Preparedment的区别:(面试中)
    1.Preparedment有预编译的步骤
    2.Statement有注入漏洞
编写SQL模糊查询:String sql="select*from user where nickname like ?";
设置参数:pstmt.setString(1,"%小%");---&写在这里JDBC的批量处理操作:
    批量插入


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马