java解析sql语句简书,JDBC基本操作,支持命名参数的SQL语句

import cn.hutool.db.handler.BeanHandler;

import cn.hutool.db.handler.BeanListHandler;

public class JDBCutils {

private static Connection conn = null;

static {

try (InputStream in = new FileInputStream("src/jdbc.properties");) {

Properties properties = new Properties();

properties.load(in);

String driver = properties.getProperty("jdbc.driver");

String url = properties.getProperty("jdbc.url");

String username = properties.getProperty("jdbc.username");

String password = properties.getProperty("jdbc.password");

//1.加载驱动程序

Class.forName(driver);

//2. 获得数据库连接

conn = DriverManager.getConnection(url, username, password);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public static Connection getConnection() {

return conn;

}

public static E beanHandler(ResultSet resultSet, Class clazz) throws SQLException {

BeanHandler handler = new BeanHandler(clazz);

return handler.handle(resultSet);

}

public static List beanListHandler(ResultSet resultSet, Class clazz) throws SQLException {

BeanListHandler handler = new BeanListHandler(clazz);

return handler.handle(resultSet);

}

public static void setParameter(PreparedStatement preparedStatement, Object... param) throws SQLException {

if (preparedStatement != null && param != null) {

for (int x = 0; x < param.length; x++) {

preparedStatement.setObject(x + 1, param[x]);

}

}

}

public static void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {

try {

if (resultSet != null) {

resultSet.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

try {

if (preparedStatement != null) {

preparedStatement.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

try {

if (connection != null) {

connection.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

简单的数据库查询:

public class BaseDao {

private final Class> clazz;

public BaseDao(Class> clazz) {

this.clazz = clazz;

}

public List findByNative(String sql, Map param) {

Connection connection = JDBCutils.getConnection();

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

ParamSql paramSql = new ParamSql(sql, clazz);

preparedStatement = connection.prepareStatement(paramSql.getParseSql());

paramSql.setParameter(preparedStatement, param);

resultSet = preparedStatement.executeQuery();

return JDBCutils.beanListHandler(resultSet, clazz);

} catch (SQLException e) {

e.printStackTrace();

} finally {

JDBCutils.close(resultSet, preparedStatement, connection);

}

return null;

}

public List findByNative(String sql, Object... param) {

Connection connection = JDBCutils.getConnection();

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

ParamSql paramSql = new ParamSql();

preparedStatement = connection.prepareStatement(sql);

paramSql.setParameter(preparedStatement, param);

resultSet = preparedStatement.executeQuery();

return JDBCutils.beanListHandler(resultSet, clazz);

} catch (SQLException e) {

e.printStackTrace();

} finally {

JDBCutils.close(resultSet, preparedStatement, connection);

}

return null;

}

public T getOneByNative(String sql, Map param) {

Connection connection = JDBCutils.getConnection();

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

ParamSql paramSql = new ParamSql(sql, clazz);

preparedStatement = connection.prepareStatement(paramSql.getParseSql());

paramSql.setParameter(preparedStatement, param);

resultSet = preparedStatement.executeQuery();

return JDBCutils.beanHandler(resultSet, clazz);

} catch (SQLException e) {

e.printStackTrace();

} finally {

JDBCutils.close(resultSet, preparedStatement, connection);

}

return null;

}

public T getOneByNative(String sql, Object... param) {

Connection connection = JDBCutils.getConnection();

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

ParamSql paramSql = new ParamSql();

preparedStatement = connection.prepareStatement(sql);

paramSql.setParameter(preparedStatement, param);

resultSet = preparedStatement.executeQuery();

return JDBCutils.beanHandler(resultSet, clazz);

} catch (SQLException e) {

e.printStackTrace();

} finally {

JDBCutils.close(resultSet, preparedStatement, connection);

}

return null;

}

public int update(String sql, Map param) {

Connection connection = JDBCutils.getConnection();

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

ParamSql paramSql = new ParamSql(sql);

preparedStatement = connection.prepareStatement(paramSql.getParseSql());

paramSql.setParameter(preparedStatement, param);

return preparedStatement.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

} finally {

JDBCutils.close(resultSet, preparedStatement, connection);

}

return -1;

}

}

解析sql:

public class ParamSql {

private final String sql;

private final Class> clazz;

private static final Map PARAM_KEY_MAP = new HashMap<>();

private static final String REGEX = ":(\\w*)";

private static final String REPLACEMENT = "\\?";

private static final String SELECT = "SELECT";

private static final Pattern PATTERN_SQL = Pattern.compile(REGEX);

public ParamSql() {

this.sql = null;

this.clazz = null;

}

public ParamSql(String sql) {

this.sql = sql;

this.clazz = null;

}

public ParamSql(String sql, Class> clazz) {

this.sql = sql;

this.clazz = clazz;

}

public String getParseSql() {

if (sql == null || sql.length() == 0) {

throw new IllegalArgumentException("sql is null");

}

PARAM_KEY_MAP.clear();

Matcher m = PATTERN_SQL.matcher(sql);

int idx = 1;

while (m.find()) {

String field = m.group(1);

if (field == null || field.length() == 0) {

throw new IllegalArgumentException("query param field is null");

}

PARAM_KEY_MAP.put(idx++, field);

}

String parseSql = sql.replaceAll(REGEX, REPLACEMENT);

if (parseSql.toUpperCase().indexOf(SELECT) < 0) {

if (clazz != null) {

parseSql = sqlField(parseSql);

}

}

return parseSql.toUpperCase();

}

public void setParameter(PreparedStatement statement, Map param) throws SQLException {

if (!PARAM_KEY_MAP.isEmpty()) {

if (param == null || param.isEmpty()) {

throw new IllegalArgumentException("param is null");

}

}

for (Map.Entry entry : PARAM_KEY_MAP.entrySet()) {

Integer idx = entry.getKey();

String field = entry.getValue();

if (!param.containsKey(field)) {

throw new IllegalArgumentException("not param field [" + field + "]");

}

statement.setObject(idx, param.get(field));

}

}

public void setParameter(PreparedStatement preparedStatement, Object[] param) throws SQLException {

if (preparedStatement != null && param != null) {

for (int x = 0; x < param.length; x++) {

preparedStatement.setObject(x + 1, param[x]);

}

}

}

private String sqlField(String sql) {

Field[] fields = clazz.getDeclaredFields();

StringBuilder sbd = new StringBuilder(SELECT).append(" ");

int x = 1;

for (Field field : fields) {

sbd.append(toUnderline(field.getName()));

if (x < fields.length) {

sbd.append(" ,");

} else {

sbd.append(" ");

}

x++;

}

return sbd.toString() + sql;

}

private String toUnderline(String str) {

if (str == null || str.length() == 0) {

return null;

}

StringBuilder sbd = new StringBuilder();

for (int i = 0; i < str.length(); i++) {

char c = str.charAt(i);

if (Character.isUpperCase(c)) {

sbd.append("_");

}

sbd.append(c);

}

return sbd.toString();

}

}

注:请根据自己的实际情况进行调整

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值