JDBC----Statement安全问题与PrepareStatement

17 篇文章 0 订阅

1. Statement执行 ,其实是拼接sql语句的。  先拼接sql语句,然后在一起执行。 


        String sql = "select * from user where username='"+ username  +"' and password='"+ password +"'";

        UserDao dao = new UserDaoImpl();
        dao.login("admin", "100234khsdf88' or '1=1");
    
        SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1' 
    
        前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。 
        rs = st.executeQuery(sql);

2.PrepareStatement:

> 该对象就是替换前面的statement对象。

1. 相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。


            String sql = "insert into user values(null , ? , ?)";
             ps = conn.prepareStatement(sql);
             
             //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
             ps.setString(1, userName);
             ps.setString(2, password);
 

MyBatis-Plus并没有直接集成Neo4j JDBC驱动,但是可以通过MyBatis-Plus提供的自定义SQL执行器来使用Neo4j JDBC驱动。 首先需要在项目中引入Neo4j JDBC驱动的依赖,可以在Maven中添加以下依赖: ```xml <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-jdbc-driver</artifactId> <version>4.3.1</version> </dependency> ``` 然后在MyBatis-Plus的配置类中配置自定义SQL执行器,示例如下: ```java @Configuration public class MybatisPlusConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> { // 添加自定义SQL执行器 configuration.addInterceptor(new MyNeo4jJdbcInterceptor()); }; } /** * 自定义SQL执行器,使用Neo4j JDBC驱动执行SQL */ private static class MyNeo4jJdbcInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 获取MappedStatement和参数 MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameter = invocation.getArgs()[1]; // 获取SQL语句 BoundSql boundSql = mappedStatement.getBoundSql(parameter); String sql = boundSql.getSql(); // 使用Neo4j JDBC驱动执行SQL try (Connection connection = DriverManager.getConnection("jdbc:neo4j:bolt://localhost:7687", "neo4j", "password"); PreparedStatement statement = connection.prepareStatement(sql)) { // 设置参数 ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameter, boundSql); parameterHandler.setParameters(statement); // 执行SQL if (mappedStatement.getResultSetType() == ResultSetType.DEFAULT) { statement.execute(); } else { throw new RuntimeException("Unsupported result set type: " + mappedStatement.getResultSetType()); } // 返回结果 ResultSet resultSet = statement.getResultSet(); return new MyResultSet(resultSet); } } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // do nothing } } /** * 自定义ResultSet,用于包装Neo4j JDBC驱动返回的ResultSet */ private static class MyResultSet implements ResultSet { private final ResultSet resultSet; public MyResultSet(ResultSet resultSet) { this.resultSet = resultSet; } // 实现ResultSet接口的方法,用于包装Neo4j JDBC驱动返回的ResultSet // ... } } ``` 以上代码中,`MyNeo4jJdbcInterceptor`是自定义的SQL执行器,使用Neo4j JDBC驱动执行SQL。在`intercept`方法中,获取SQL语句和参数,使用Neo4j JDBC驱动执行SQL,并将返回的`ResultSet`包装为`MyResultSet`返回。 需要注意的是,自定义SQL执行器需要添加到MyBatis-Plus的配置中,这里使用了`ConfigurationCustomizer`实现。同时,由于Neo4j JDBC驱动返回的`ResultSet`和MyBatis-Plus默认的`ResultSet`不同,需要自定义`MyResultSet`实现`ResultSet`接口,用于包装Neo4j JDBC驱动返回的`ResultSet`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值