【JDBC、Mybatis初级知识点】

【JDBC、Mybatis初级知识点】

2020.9.28 coin

/*JDBC基本流程:
        1.加载驱动 (选择连接哪一个数据库)
        2.获取连接 (连接数据库)
        3.准备sql
        4.封装处理块
        5.发送并执行sql,获取结果集
        6.处理数据
        7.关闭资源
*/
public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {
        //1.加载驱动 (选择连接哪一个数据库)
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.获取连接 (连接数据库)
        Connection conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:XE",
                "SCOTT",
                "TIGER"
        );
        //3.准备sql
        String sql = "select * from dept";
        //4.封装处理块   Statement 静态处理块
        Statement state =conn.createStatement();
        //5.发送并执行sql,获取结果集 executeQuery->返回值结果集  查询  executeUpdate 更新->返回值影响行数
        ResultSet result = state.executeQuery(sql);
        //6.处理数据
        while (result.next()){
            //getObject
            int deptno = result.getInt(1);
            String dname = result.getString(2);
            String loc = result.getString(3);
            System.out.println(deptno+"-->"+dname+"-->"+loc);
        }
        //7.关闭资源
        result.close();
        state.close();
        conn.close();

    }
}


/*

	jdbc 的优化
        1)异常的抛出
        2)配置文件的定义 数据库的基础连接信息

     注意: 执行增删改操作 的时候,事务默认 自动提交 autoCommit
*/
public class JDBCDemo02 {

    public static void main(String[] args) {
        Properties pro = new Properties();
        try {
            pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //1.加载驱动
        try {
            Class.forName(pro.getProperty("driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        Connection conn = null;
        Statement state = null;
        try {
            //2.获取连接
            conn = DriverManager.getConnection(
              pro.getProperty("url"),
              pro.getProperty("username"),
              pro.getProperty("password")
            );

            //3.准备sql
            String sql = "delete from dept where deptno = 70";

            //4.封装处理块
            state = conn.createStatement();

            //5.发送并执行sql  --> 查询->结果集     更新->影响行数
            int rows = state.executeUpdate(sql);

            //6.处理数据
            if(rows<=0){
                System.out.println("不成功");
            }else{
                System.out.println("成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.关闭
            if(state!=null){
                try {
                    state.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

/*
    用户模块
     注册 ->插入
     登录 ->查询
     修改 -> 更新
     注销 -> 删除

    静态处理块:  sql语句通过字符串 的连接符自己拼接
        可能会出现sql注入

    预处块: -->推荐使用
        1.预先编译 ,效率高
        2.预防sql注入的情况
 */
public class UserDemo {

    public static void main(String[] args) {
        if(reg("xiaopei1hao","654321")){
            System.out.println("注册成功");
        }else{
            System.out.println("注册失败");
        }

        //login("laopei","12356  or 1=1");

    }

    //登录
    //1.根据这个用户名字 和密码一起查询,如果有结果,登录成功,否则登录失败
    //2.根据用户名查询,查询到结果与参数密码去比对是否相同
    public static void login(String uname,String pwd){
        Connection conn = null;
        //Statement  state = null;
        PreparedStatement state = null; //预处理块
        ResultSet result = null;

        try {
            //连接
            conn = JDBCUtils.getConnection();
           /*
           静态处理块
           //sql
            String sql = "select * from t_user where username  = '"+uname+"' and password ="+pwd;
            //处理块
            state  = conn.createStatement();
            //执行
            result = state.executeQuery(sql);*/

           //预处理块
            String  sql = "select *  from t_user where username = ? and password = ?";

            state = conn.prepareStatement(sql);

            //为?赋值
            state.setString(1,uname);
            state.setObject(2,pwd);

            result = state.executeQuery();

            //处理结果
            if(result.next()){
                System.out.println("登录成功");
            }else{
                System.out.println("登录失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(result,state,conn);
        }

    }


    //注册
    public static boolean reg(String uname,String pwd){
        Connection conn = null;
        Statement  state = null;
        boolean flag = true;
        try {
            //连接
            conn = JDBCUtils.getConnection();
            //sql
            String sql = "insert into t_user values('"+uname+"',"+pwd+")";
            //处理块
            state  = conn.createStatement();
            //执行
            int rows = state.executeUpdate(sql);
            //处理结果
            if(rows<=0){
                flag =  false;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(state,conn);
        }
        return flag;
    }
}

/*
    BaseDao -->了解
    通过数据库访问对象 对数据操作行为的封装
        1.更新 excuteUpdate  -> 影响函数  结果成功与否boolean
        2.查询 excuteQuery  -> 结果集  结果存储着多个某种类型对象的集合
            结果集中存放条数据 -> java中的多个对应类型的对象


    注意:
        数据库中的number类型的数据,在Java中默认转为BigDecimal类型的数据  1)javabean类 的属性类型改为BigDecimal  2)判断转换一下把BigDecimal转为int|double
        字段名默认大写,可以添加别名控制

 */
public class BaseDao<T> {

    //查询  返回值 : List<T>   参数:  String sql ,Class cls,Object ...args
    public List<T> testQuery(String sql ,Class<T> cls,Object ...args){
        //创建一个集合
        List<T> list  =  new ArrayList<>();

        Connection conn = null;
        PreparedStatement state  = null;
        ResultSet result = null;
        ResultSetMetaData data = null;


        try {
            //获取 连接
            conn = JDBCUtils.getConnection();

            //封装预处理块
            state = conn.prepareStatement(sql);

            //为?赋值
            if(args.length !=0 && args!=null){
                for(int i=0;i<args.length;i++){
                    state.setObject(i+1,args[i]);
                }
            }

            //执行sql ,得到结果集
            result = state.executeQuery();

            //通过结果集获取结果集的原信息对象
            data = result.getMetaData();
            //通过原信息对象就能够获取 字段的个数  --> 循环为属性赋值循环几次
            int count = data.getColumnCount();

            //处理数据
            //1)遍历判断是否有数据,操作每一条 数据
            while(result.next()){
                //2)如果有一个调数据,就代表需要构建一个对应 类型 的对象
                T obj = cls.newInstance();

                //3)为对象 的所有属性赋值
                //循环为对象的所有属性赋值
                //循环操作为对象的每一个属性赋值
                for(int i=1;i<=count;i++){
                    //a.获取字段的值|属性的值
                    Object value =  result.getObject(i);
                    String  columnName =  data.getColumnName(i);
                    //如果数据为BigDecimal证明在数据库中是Number类型 -> 转为Integer类型
                    if(value instanceof BigDecimal){
                        value = ((BigDecimal) value).intValue();
                    }

                    //b.获取属性
                    Field field = cls.getDeclaredField(columnName);

                    //忽略权限问题
                    field.setAccessible(true);

                    //c.为这个属性赋值
                    field.set(obj,value);

                }
                //把对象加入集合
                list.add(obj);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.release(result,state,conn);
        }



        //返回这个集合
        return list;
    }


    //更新操作  返回值 : boolean  参数: String sql,Object  ...args(为?赋值的)
    public  boolean testUpdate( String sql,Object  ...args){
        boolean flag = false;  //表示结果
        Connection conn = null;
        PreparedStatement state  = null;

        try {
            //获取连接
            conn = JDBCUtils.getConnection();
            //封装sql 预处理快
            state = conn.prepareStatement(sql);
            //为?赋值 args->值  sql->state
            //遍历args,拿到每一个参数赋值
            if(args.length !=0 && args!=null){
                for(int i=0;i<args.length;i++){
                    state.setObject(i+1,args[i]);
                }
            }

            //执行sql
            int rows = state.executeUpdate();

            if(rows>0){
                flag = true;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(state,conn);
        }

        return flag;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值