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就好了。