zoukankan      html  css  js  c++  java
  • JDBC

    JDBC的开发步骤

     1.实现驱动注册(DriverManager)

     2.建立连接

     3.创建以及发送SQL指令

     4.获取以及处理响应

     5.释放资源

    增删改查案例

    public static void insert(int deptno,String dname,String loc) throws Exception{
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn =  DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/db1711",
                    "root",
                    "123456");
            Statement stmt = conn.createStatement();
            String sql = "INSERT INTO dept VALUES("+deptno+",'"+dname+"','"+loc+"')";
            int num = stmt.executeUpdate(sql);
            System.out.println(num);
            stmt.close();
            conn.close();
            
        }

    public static void delete(int deptno) throws Exception{
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn =  DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/db1711",
                    "root",
                    "123456");
            Statement stmt = conn.createStatement();
            String sql = "delete from dept where deptno = "+deptno+"";
            int nums = stmt.executeUpdate(sql);
            System.out.println(nums);
            stmt.close();
            conn.close();
        }

    public static void update(int deptno,String loc) throws Exception{
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn =  DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/db1711",
                    "root",
                    "123456");
            Statement stmt = conn.createStatement();
            String sql = "update dept set deptno = "+deptno+" where loc = '"+loc+"'";
            int nums = stmt.executeUpdate(sql);
            System.out.println(nums);
            stmt.close();
            conn.close();
        }

    public static void query() throws Exception{
            // 1.借助DriverManager实现驱动的注册(mysql驱动就在DriverManager中管理)
                    //DriverManager.registerDriver(new Driver());
                    //   反射(DriverManager.registerDriver()注册的唯一方法),注册驱动
                    Class.forName("com.mysql.jdbc.Driver");
                    
                    // 2.建立连接
                    // jdbc:mysql://localhost:3306/db1711
                    // 协议:子协议://IP:端口/数据库
                    Connection conn =  DriverManager.getConnection(
                            "jdbc:mysql://localhost:3306/db1711",//url统一资源定位符(路径)和mysql DBMS的哪个数据库建立连接
                            "root",//user用户
                            "123456");//password密码
                    // 查看是否连接成功
                    // System.out.println(conn);//com.mysql.jdbc.JDBC4Connection@4d405ef7
                    
                    // 3.发送sql指令
                    String sql = "select * from emp";
                    // 创建Statement的实现类的对象
                    Statement stmt = conn.createStatement();
                    // executeUpdate():增删该,返回的是int类型,影响的行数,0是失败
                    // executeQuery():查询,返回的是结果集
                    ResultSet rs = stmt.executeQuery(sql);
                    
                    // 4.结果集的处理()
                    // rs.next():boolean类型,游标,没有值的话返回false
                    while(rs.next()) {//遍历每一行的数据
                        // 依次获取每一列的数据
                        int empno = rs.getInt("empno");
                        String ename = rs.getString("ename");
                        System.out.println(empno+"	"+ename);
                    }
                    
                    // 5.释放资源
                    rs.close();
                    stmt.close();
                    conn.close();
        }

    登录的问题

    SQL注入

    // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.建立连接
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/bd1711",
                    "root", 
                    "root");
            //3.发送sql,  ?占位符
            String sql = "select * from user where uname = ? and password = ? ";
            //支持sql的预编译(语法检查,语义检查   ...  查询)
            PreparedStatement ps = conn.prepareStatement(sql);
            //赋值
            ps.setString(1, name);
            ps.setString(2, pwd);
            //发送命令
            ResultSet rs = ps.executeQuery();
            //4.处理响应结果
            if(rs.next()){
                System.out.println("登陆成功");
            }else{
                System.out.println("登录失败");
            }
            //5.释放资源
            rs.close();
            ps.close();
            conn.close();
    
    1.    preparestatement能够避免sql的注入攻击,安全性更高。
    2.    preparedStatment实现预编译,因此在批量的数据操作中减少语法检查的时间,效率高。
    3.    在批处理中,preparedstatement只能批量处理单一类型的操作;statement可以一次处理增删改等多种类型的操作。
    
    //使用preparedStatement实现批处理
    // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.建立连接
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/bd1711",
                    "root", 
                    "root");
            //3.发送sql
            String sql = "delete from user where uid = ?";
            //预编译
            PreparedStatement ps = conn.prepareStatement(sql);
            //赋值
            ps.setInt(1, 1);
            ps.addBatch();
            
            ps.setInt(1, 2);
            ps.addBatch();
            
            //4.执行和处理响应
            int[] rows = ps.executeBatch();
            System.out.println(Arrays.toString(rows));
            
            //5.释放资源
            ps.close();
            conn.close();
    
    //使用Statement实现批处理
    String sql2 = "insert";
            String sql3 = "delete";
            Statement stmt = conn.createStatement();
            stmt.addBatch(sql2);
            stmt.addBatch(sql3);
            stmt.executeBatch();

    开发DAO

    data access object

    分层开发(实现代码复用)

    DAO主要负责与数据库之间的交互。

    问题:

    1.硬编码:配置文件

    如何使用外部配置文件:

      properties配置文件:

    //创建properties对象
                Properties properties =new Properties();
                //将propertes文件加载为流
                InputStream is = EmpDao2.class
                                    .getClassLoader()
                                    .getResourceAsStream("jdbc.properties");
                //加载
                properties.load(is);
                //通过key值获取value值
                String driver = properties.getProperty("driver");
                String url = properties.getProperty("url");
                String user = properties.getProperty("user");
                String pwd = properties.getProperty("pwd");
                // 1.注册驱动
                Class.forName(driver);
                conn = DriverManager.getConnection(url,user,pwd);

    封装BASEDAO

    封装basedao

    package dao;
    
    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import util.JdbcUtils;
    
    /**
     * 
     * @author Administrator
     * 所有的dao的父类(通用的增删改查)
     */
    public class BaseDao {
    
        protected Connection conn = null;
        protected PreparedStatement ps = null;
        protected ResultSet rs = null;
        
        //通用的增删改emp  dept user
            //1.insert  update delete    /  emp   dept    user :    sql   ?  ?
            //2.赋值的参数的个数和类型不能确定     Object[] 
        public int executeUpdate(String sql,Object[] params){
            int rows = 0;
            try {
                //2.获取连接
                conn = JdbcUtils.getConnecton();
                //3.发送sql指令
                //预编译
                ps = conn.prepareStatement(sql);
                //赋值
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1, params[i]);
                }
                //处理
                rows = ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                JdbcUtils.closeRes(rs, ps, conn);
            }
            return rows;
        }
        
        //通用查询
        public<T> List<T> executeQuery(String sql,Object[] params,Class<T> clz){
            //定义集合
            List<T> lists = new ArrayList<>();
            try {
                //1.获取连接
                conn=JdbcUtils.getConnecton();
                //2.发送sql
                ps = conn.prepareStatement(sql);
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1, params[i]);
                }
                ResultSet rs = ps.executeQuery();
                //元数据:解释数据的数据
                ResultSetMetaData md = rs.getMetaData();
                //查询的字段的总数
                int count = md.getColumnCount();
                //3.处理
                while(rs.next()){//遍历一行就需要创建一个对象进行封装
                    //创建t对象  (调用t的class对象创建t对象,调用无参构造创建对象) 
                    T t = clz.newInstance();
                    //获取每个字段的值(遍历获取每行中每个字段的值)
                    for(int i=0;i<count;i++){
                        //先获取字段名称
                        String name = md.getColumnName(i+1);
                        //根据字段名称获取字段的值
                        Object value = rs.getObject(name);
                        //根据字段名称获取相应的属性,将字段的值赋给属性
                        Field field = clz.getDeclaredField(name);
                        //设置允许赋值
                        field.setAccessible(true);
                        //赋值
                        if(value!=null){
                         field.set(t, value);
                        }
                    }
                    //添加到list集合
                    lists.add(t);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                JdbcUtils.closeRes(rs, ps, conn);
            }
            return lists;
        }
        
        
        
        
    }

    调用basedao

    package dao;
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    import entity.Emp;
    import util.JdbcUtils;
    
    public class EmpDao3  extends BaseDao{
    
        //查询所有
        public List<Emp> queryAll(){
            String sql = "select * from emp";
            Object[] params = {};
            return executeQuery(sql, params, Emp.class);
        }
        
        //增加
        public int insert(Emp emp){
            String sql = "insert into emp(empno,ename,deptno) values(?,?,?)";
            Object[] params = { emp.getEmpno(),emp.getEname(),emp.getDeptno() };
            return executeUpdate(sql, params);
        }
        
        public int delete(int empno){
            String sql = "delete from emp where empno=? ";
            Object[] params = { empno };
            return executeUpdate(sql, params);
        }
        
        public static void main(String[] args) {
            EmpDao3 dao = new EmpDao3();
            System.out.println(dao.queryAll());
        }
    }
  • 相关阅读:
    使用element-ui是下拉筛选选择
    vue 组件传值
    vue element 地址联动的使用
    vux scroller
    实时监听组件中路由的变化
    vuex的使用
    对移动端滚动高度的获取
    【转】ACM 取石子问题
    【转】ACM博弈知识汇总
    EOJ 2857 编辑距离
  • 原文地址:https://www.cnblogs.com/kwzblog/p/12016120.html
Copyright © 2011-2022 走看看