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());
    }
}
原文地址:https://www.cnblogs.com/kwzblog/p/12016120.html