MyBatis-plus配置自定义SQL(执行用户传入SQL)

序号类型地址
1MySQLMySQL操作之概念、SQL约束(一)
2MySQLMySQL操作之数据定义语言(DDL)(二)
3MySQLMySQL操作之数据操作语言(DML)(三)
4MySQLMySQL操作之数据查询语言:(DQL)(四-1)(单表操作)
5MySQLMySQL操作之数据查询语言:(DQL)(四-2)(多表查询)
6MySQLMySQL操作之数据控制语言:(DC)(五)
7MySQLMySQL操作之数据库函数
8MySQLMySQL管理之数据类型
9MySQLMySQL管理之索引
10MySQLMySQL管理之事务管理
11MySQLMySQL管理之存储过程
12MySQLMySQL管理之视图
13MySQLMySQL管理之数据备份与还原
14MySQLLinux(centos 7.5)服务器安装MySQL
15MyBatisMyBatis从入门到多表关联
16MyBatisMyBatis常用方法
17MyBatisMybatis逆向工程的使用(附文件地址)
18MyBatisspring boot连接Mybatis数据库的配置文件(MySql、SQLserver、Oracle)
19MyBatis-PlusMybatis-Plus使用案例(包括初始化以及常用插件)
20MyBatis-Plusmybatis-plus代码生成器
21MyBatis-Plus自定义SQL
22MyBatis-PlusMybatis-Plus(连接Hive)
23MyBatis-PlusMyBatis-plus配置自定义SQL(执行用户传入SQL)
24MyBatis-PlusMybatis-Plus(Service CRUD 接口)


一、原生MyBatis执行

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import java.sql.SQLException;

public class TestMySql {
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    //    自定义执行SQL
    public void mySql() throws SQLException {
        String sql = "select * from User";
        SqlSession sqlSession = openSession();
        sqlSession.getConnection().prepareStatement(sql);
        closeSession(sqlSession);
    }

    //    开启链接
    private SqlSession openSession() {
        SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
        return sqlSessionFactory.openSession();
    }

    //    关闭链接
    private void closeSession(SqlSession sqlSession) {
        sqlSession.close();
    }
}

二、MyBatis 执行

2.1、调用dao

String sql = "Select * From User";
sqlMapper.explainQuery(sql);

2.2、dao层接口配置

@SqlParser(filter = true)
void explainQuery(String sql);

2.3、dao中xml配置

<update id="explainQuery">
  ${templateName,jdbcType=VARCHAR}
</update>

三、MyBatis-plus中Sql注入器

3.1、编写MyBaseMapper(要添加方法)

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface MyBaseMapper<T> extends BaseMapper<T> {
    List<T> findAll();
}

3.2、编写FindAll(方法具体实现)

import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

public class FindAll extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sqlMethod = "findAll";
        String sql = "select * from " + tableInfo.getTableName();
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
        return this.addSelectMappedStatement(mapperClass, sqlMethod, sqlSource, modelClass, tableInfo);
    }
}

3.3、编写MySqlInjector(注册到MyBatis-plus中)

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;

import java.util.List;

public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList() {
        List<AbstractMethod> methodList = super.getMethodList();
        methodList.add(new FindAll()); // 再扩充自定义的方法
        list.add(new FindAll());
        return methodList;
    }
}

3.4、编写MySqlInjector(注册到MyBatis-plus中)

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;

import java.util.List;

public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList() {
        List<AbstractMethod> methodList = super.getMethodList();
        methodList.add(new FindAll()); // 再扩充自定义的方法
        list.add(new FindAll());
        return methodList;
    }
}

### 2.4、注册到Spring容器

```java
/*** 自定义SQL注入器 */
@Bean
public MySqlInjector mySqlInjector() {
    return new MySqlInjector();
}

3.5、测试

@Test
public void testFindAll() {
    List<User> users = this.userMapper.findAll();
    for (User user : users) {
        System.out.println(user);
    }
}
posted @ 2022-08-03 23:53  ah_lydms  阅读(3462)  评论(0编辑  收藏  举报