MyBatis和原生JDBC


在做后端项目的时候,我一开始想用MyBatis来读取数据库数据,但是因为查询的表名众多,所以想直接用原生JDBC来查询和处理数据库数据,所以这里记录一下MyBatis和原生JDBC查询的优缺点和具体实现。

MyBatis

  MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  因为不想创建太多的实体类,所以我在项目里没有使用MyBtis,但我后来发现,MyBatis也可以不用创建对象并实现,因为MyBatis的查询原理是查询出来的数据会封装为一个map,将字段名作为key值,数据作为value值。我还没有深究这个方法,可以参考这个链接

MyBatis在SpringBoot里的运用

  我在之前讲SpringBoot框架搭建的时候就已经介绍了MyBatis的简单使用,这里附一篇MyBatis的使用详解:https://www.cnblogs.com/stars-one/p/11537439.html

原生JDBC

按照JDBC的六大步骤来创建连接,步骤都是固定的,最大的不同就是对查询数据resultSet的处理,我这里的查询语句是查询表的所有数据:

public static JSONArray queryDataByTableName(String moduleSort,String tableName) {
        Connection connect = null;
        Statement statement = null;
        ResultSet resultSet = null;
        JSONArray dataResult = null;
        try {
            //第一步:注册驱动
            //第一种方式:类加载(常用)
            //Class.forName("oracle.jdbc.OracleDriver");

            //第二种方式:利用Driver对象
            Driver driver = new OracleDriver();
            DriverManager.deregisterDriver(driver);
            //第二步:获取连接
            //第一种方式:利用DriverManager(常用)
            //connect = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "你的oracle数据库用户名",
            // "用户名密码");
            //第二种方式:直接使用Driver
            Properties pro = new Properties();
            pro.put("user", moduleSort);
            pro.put("password", moduleSort);
            connect = driver.connect("jdbc:oracle:thin:@10.1.161.130:1521:orcl", pro);
            //测试connect正确与否
            System.out.println(connect);
            //第三步:获取执行sql语句对象
//               第一种方式:statement
            statement = connect.createStatement();
//               //第二种方式:PreStatement
//               PreparedStatement preState = connect.prepareStatement(" select  * from view1");
            String sql = "select * from " + tableName;
            //第四步:执行sql语句
            //第一种方式:
            System.out.println("数据库语句:" + sql);
            resultSet = statement.executeQuery(sql);
            //第二种方式:
//               preState.setInt(1, 2);//1是指sql语句中第一个?,  2是指第一个?的values值
//               //resultSet = preState.executeQuery();        //执行查询语句
//               //查询任何语句,如果有结果集,返回true,没有的话返回false,注意如果是插入一条数据的话,虽然是没有结果集,返回false,但是却能成功的插入一条数据
//               boolean execute = preState.execute();
//               System.out.println(execute);
            //第五步:处理结果集
            JsonHandler jsonHandler = new JsonHandler();
            dataResult = jsonHandler.handle(resultSet);
//            for (Object a :dataResult){
//
//                System.out.println(a.toString());
//            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //第六步:关闭资源
            try {
                if (resultSet != null) resultSet.close();
                if (statement != null) statement.close();
                if (connect != null) connect.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return dataResult;
    }

第五步处理结果集(查询表的所有数据)的代码:

public class JsonHandler {
    public JSONArray handle(ResultSet rs)  throws SQLException {
        //创建一个JSONArray对象
        JSONArray jsonArray = new JSONArray();
        //获得ResultSetMeataData对象
        ResultSetMetaData rsmd = rs.getMetaData();

        //逐条读取
        while (rs.next()) {
            //定义json对象
            JSONObject obj = new JSONObject();
            //判断数据类型&获取value
            getType(rs, rsmd, obj);
//            System.out.println(obj.toString());
            obj.remove("SHAPE");

            //将对象添加到JSONArray中
            jsonArray.add(obj);
        }
        return jsonArray;
    }

    private void getType(ResultSet rs, ResultSetMetaData rsmd,
                         JSONObject obj) throws SQLException {
        int total_Columns = rsmd.getColumnCount();     //总列数
        for (int i = 0; i < total_Columns; i++) {
            String columnName = rsmd.getColumnLabel(i + 1);
            if (obj.containsKey(columnName)) {  //如果有重名,则新建列
                columnName += "1";
            }
            try {
                switch (rsmd.getColumnType(i + 1)) {        //判断表的字段类型
                    case java.sql.Types.ARRAY:
                        obj.put(columnName, rs.getArray(columnName));
                        break;
                    case java.sql.Types.BIGINT:
                        obj.put(columnName, rs.getInt(columnName));
                        break;
                    case java.sql.Types.BOOLEAN:
                        obj.put(columnName, rs.getBoolean(columnName));
                        break;
                    case java.sql.Types.BLOB:
                        obj.put(columnName, rs.getBlob(columnName));
                        break;
                    case java.sql.Types.DOUBLE:
                        obj.put(columnName, rs.getDouble(columnName));
                        break;
                    case java.sql.Types.FLOAT:
                        obj.put(columnName, rs.getFloat(columnName));
                        break;
                    case java.sql.Types.INTEGER:
                        obj.put(columnName, rs.getInt(columnName));
                        break;
                    case java.sql.Types.NVARCHAR:
                        obj.put(columnName, rs.getNString(columnName));
                        break;
                    case java.sql.Types.VARCHAR:
                        obj.put(columnName, rs.getString(columnName));
                        break;
                    case java.sql.Types.TINYINT:
                        obj.put(columnName, rs.getInt(columnName));
                        break;
                    case java.sql.Types.SMALLINT:
                        obj.put(columnName, rs.getInt(columnName));
                        break;
                    case java.sql.Types.DATE:
                        obj.put(columnName, rs.getDate(columnName));
                        break;
                    case java.sql.Types.TIMESTAMP:
                        obj.put(columnName, rs.getTimestamp(columnName));
                        break;
                    default:
                        obj.put(columnName, rs.getString(columnName));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

接下来对得到的数据再Service里处理后传到Controller就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值