JDBC的介绍与使用

介绍

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
    JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
    JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

使用

    以MySQL为例

    添加jar包:mysql-connector-java-x.x.xx-bin.jar

原生JDBC

public static void main(String[] args) throws SQLException {
    //得到mysql的驱动的Class对象
    //1.加载驱动
    //Class.forName("com.mysql.jdbc.Driver");
    //各个数据库都不同
    //jdbc:mysql://[IP][:port]/[database]
    //String url="jdbc:mysql://localhost:3306/teach";
    //2.获取连接
    //Connection con = DriverManager.getConnection(url,"root" ,"123456" );
    Connection con = ConnectionUtil.getConn();
    //3.获取查询管理器对象
    //a.普通查询管理器 b.防注入式查询管理器
    Statement st = con.createStatement();
    //4.编写sql语句 最后不允许加;
    String sql = "SELECT * FROM student";
    String sql1 = "insert into student (no,name,sex)VALUES(110,'黄蓉','女')";
    //5.执行sql语句
    // a.执行DML语句executeUpdate(sql)
    ResultSet set = st.executeQuery(sql);
    //6.解析结果集
    while (set.next()){
        //a.封装对象 尽量不要使用map
        //b.读取列信息
        //通过类型调用不同的get方法 getString(下标,从1开始),  getObject()需要强转
        //getString(列名);
        int no = set.getInt(1);
        String name = set.getString(2);
        String sex = set.getString("sex");
        String birthday = set.getString("birthday");
        String sClass = set.getString(5);
        Student student =new Student(no,name,sex,birthday,sClass,null);
        System.out.println(student);
    }
    set.close();
    // b.执行DQL语句,得到结果集executeQuery(sql)
    int c = st.executeUpdate(sql1);
    System.out.println(c);
    //c.execute() DML,DQL
    //如果你确定了SQL语句的类型 不要使用execute
    boolean l = st.execute(sql);//DML 返回false DQL返回true
    
    //预处理防注入
    //(1).使用防注入的SQL语句不允许连接变量,在有变量的位置使用占位符?替代
    String sql = "SELECT * FROM student WHERE name=? AND password=? ";
    //(2).使用防SQL注入的查询管理器对象PreparedStatement
    PreparedStatement pre =conn.prepareStatement(sql);
    //(3).替换占位符参数,下标从1开始
    pre.setString(1,user);
    pre.setString(2,password);
    //(4).使用防注入之后查询的时候不需要再次带入sql语句
    ResultSet set = pre.executeQuery();
    Student student = null;
    while (set.next()){
        int no = set.getInt(1);
        String sex = set.getString("sex");
        String birthday = set.getString("birthday");
        String sClass = set.getString(5);
        student =new Student(no,user,sex,birthday,sClass,password);
        System.out.println(student);
    }
	//6[7].关闭资源
    con.close();
    st.close();
}

利用配置文件并封装成工具类

db.properties

jdbcDriver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/test
jdbcUser=root
jdbcPassword=123456

public class PropertiesUtil {
    private static Properties pro = new Properties();
    static {
        try {
            pro.load(new FileReader("db.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //获取配置文件中的属性
    public static String getValue(String key){
        return pro.getProperty(key);
    }
}

public class ConnectionUtil {
    static {
        try {
            Class.forName(PropertiesUtil.getValue("jdbcDriver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获得连接方法
    public static Connection getConn() {
        Connection con = null;
        try {
            //各个数据库都不同
            //jdbc:mysql://[IP][:port]/[database]
            //2.获取连接
            con= DriverManager.getConnection(PropertiesUtil.getValue("jdbcUrl")
                    , PropertiesUtil.getValue("jdbcUser"), PropertiesUtil.getValue("jdbcPassword"));
        }catch (SQLException e){
            e.printStackTrace();
        }
        return  con;
    }

    //关闭资源的方法
    public static void close(Connection conn, Statement st, ResultSet set){
        try {
            if(set!=null){
                set.close();
            }
            if(st!=null){
                st.close();
            }
            if(conn!=null){
                conn.close();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值