mybatis 使用自定义sql 语句[通俗易懂]

mybatis 使用自定义sql 语句[通俗易懂]新建一个接口 SqlBaseMapper 封装常用的增删改查 public interface SqlBaseMapper { /** * 查询单条数据返回Map *…

	mybatis 使用自定义sql 语句[数据库教程]

新建一个接口 SqlBaseMapper 封装常用的增删改查

public interface SqlBaseMapper {

    /**
     * 查询单条数据返回Map<String, Object>
     *
     * @param sql sql语句
     * @return Map<String, Object>
     */
    Map<String, Object> sqlSelectOne(String sql);

    /**
     * 查询单条数据返回Map<String, Object>
     *
     * @param sql   sql语句
     * @param value 参数
     * @return Map<String, Object>
     */
    Map<String, Object> sqlSelectOne(String sql, Object value);

    /**
     * 查询单条数据返回实体类型
     *
     * @param sql        sql语句
     * @param resultType 具体类型
     * @return 定义的实体类型
     */
    <T> T sqlSelectOne(String sql, Class<T> resultType);

    /**
     * 查询单条数据返回实体类型
     *
     * @param sql        sql语句
     * @param value      参数
     * @param resultType 具体类型
     * @return 定义的实体类型
     */
    <T> T sqlSelectOne(String sql, Object value, Class<T> resultType);

    /**
     * 查询数据返回
     *
     * @param sql sql语句
     * @return List<Map < String, Object>>
     */
    List<Map<String, Object>> sqlSelectList(String sql);

    /**
     * 查询数据返回
     *
     * @param sql   sql语句
     * @param value 参数
     * @return List<Map < String, Object>>
     */
    List<Map<String, Object>> sqlSelectList(String sql, Object value);

    /**
     * 查询数据返回
     *
     * @param sql        sql语句
     * @param resultType 具体类型
     * @return List<T>
     */
    <T> List<T> sqlSelectList(String sql, Class<T> resultType);

    /**
     * 查询数据返回
     *
     * @param sql        sql语句
     * @param value      参数
     * @param resultType 具体类型
     * @return List<T>
     */
    <T> List<T> sqlSelectList(String sql, Object value, Class<T> resultType);

    /**
     * 插入数据
     *
     * @param sql sql语句
     * @return int
     */
    int sqlInsert(String sql);

    /**
     * 插入数据
     *
     * @param sql   sql语句
     * @param value 参数
     * @return int
     */
    int sqlInsert(String sql, Object value);

    /**
     * 更新数据
     *
     * @param sql sql语句
     * @return int
     */
    int sqlUpdate(String sql);

    /**
     * 更新数据
     *
     * @param sql   sql语句
     * @param value 参数
     * @return int
     */
    int sqlUpdate(String sql, Object value);

    /**
     * 删除数据
     *
     * @param sql sql语句
     * @return int
     */
    int sqlDelete(String sql);

    /**
     * 查询数据返回List<T>
     *
     * @param sql   sql语句
     * @param value 参数
     * @return int
     */
    int sqlDelete(String sql, Object value);


}

代码100分

 

新建一个SqlMapper 实现SqlBaseMapper接口

代码100分/**
 * @author chaild
 * @Date 2020-7-7 14:43:35
 * 自定义SQL查询类
 */
@Component
public class SqlMapper implements SqlBaseMapper {

    /**
     * 使用方式
     *
     * @Autowired private SqlMapper sqlMapper;
     */
    private SqlSession sqlSession;
    private SqlMapper.MSUtils msUtils;

    @Autowired
    SqlSessionFactory sqlSessionFactory;

    public SqlMapper() {
    }

/**这个注解具体意思可以自己去了解一下**/ @PostConstruct
private void init() { this.sqlSession = sqlSessionFactory.openSession(true); this.msUtils = new SqlMapper.MSUtils(sqlSession.getConfiguration()); } private <T> T getOne(List<T> list) { if (list.size() == 1) { return list.get(0); } else if (list.size() > 1) { throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size()); } else { return null; } } /** * 查询单条数据返回Map<String, Object> * * @param sql sql语句 * @return Map<String, Object> */ @Override public Map<String, Object> sqlSelectOne(String sql) { List<Map<String, Object>> list = this.sqlSelectList(sql); return (Map) this.getOne(list); } /** * 查询单条数据返回Map<String, Object> * * @param sql sql语句 * @param value 参数 * @return Map<String, Object> */ @Override public Map<String, Object> sqlSelectOne(String sql, Object value) { List<Map<String, Object>> list = this.sqlSelectList(sql, value); return (Map) this.getOne(list); } /** * 查询单条数据返回实体类型 * * @param sql sql语句 * @param resultType 具体类型 * @return 定义的实体类型 */ @Override public <T> T sqlSelectOne(String sql, Class<T> resultType) { List<T> list = this.sqlSelectList(sql, resultType); return this.getOne(list); } /** * 查询单条数据返回实体类型 * * @param sql sql语句 * @param value 参数 * @param resultType 具体类型 * @return 定义的实体类型 */ @Override public <T> T sqlSelectOne(String sql, Object value, Class<T> resultType) { List<T> list = this.sqlSelectList(sql, value, resultType); return this.getOne(list); } /** * 查询数据返回 * * @param sql sql语句 * @return List<Map < String, Object>> */ @Override public List<Map<String, Object>> sqlSelectList(String sql) { String msId = this.msUtils.select(sql); return this.sqlSession.selectList(msId); } /** * 查询数据返回 * * @param sql sql语句 * @param value 参数 * @return List<Map < String, Object>> */ @Override public List<Map<String, Object>> sqlSelectList(String sql, Object value) { Class<?> parameterType = value != null ? value.getClass() : null; String msId = this.msUtils.selectDynamic(sql, parameterType); return this.sqlSession.selectList(msId, value); } /** * 查询数据返回 * * @param sql sql语句 * @param resultType 具体类型 * @return List<T> */ @Override public <T> List<T> sqlSelectList(String sql, Class<T> resultType) { String msId; if (resultType == null) { msId = this.msUtils.select(sql); } else { msId = this.msUtils.select(sql, resultType); } return this.sqlSession.selectList(msId); } /** * 查询数据返回 * * @param sql sql语句 * @param value 参数 * @param resultType 具体类型 * @return List<T> */ @Override public <T> List<T> sqlSelectList(String sql, Object value, Class<T> resultType) { Class<?> parameterType = value != null ? value.getClass() : null; String msId; if (resultType == null) { msId = this.msUtils.selectDynamic(sql, parameterType); } else { msId = this.msUtils.selectDynamic(sql, parameterType, resultType); } return this.sqlSession.selectList(msId, value); } /** * 插入数据 * * @param sql sql语句 * @return int */ @Override public int sqlInsert(String sql) { String msId = this.msUtils.insert(sql); return this.sqlSession.insert(msId); } /** * 插入数据 * * @param sql sql语句 * @param value 参数 * @return int */ @Override public int sqlInsert(String sql, Object value) { Class<?> parameterType = value != null ? value.getClass() : null; String msId = this.msUtils.insertDynamic(sql, parameterType); return this.sqlSession.insert(msId, value); } /** * 更新数据 * * @param sql sql语句 * @return int */ @Override public int sqlUpdate(String sql) { String msId = this.msUtils.update(sql); return this.sqlSession.update(msId); } /** * 更新数据 * * @param sql sql语句 * @param value 参数 * @return int */ @Override public int sqlUpdate(String sql, Object value) { Class<?> parameterType = value != null ? value.getClass() : null; String msId = this.msUtils.updateDynamic(sql, parameterType); return this.sqlSession.update(msId, value); } /** * 删除数据 * * @param sql sql语句 * @return int */ @Override public int sqlDelete(String sql) { String msId = this.msUtils.delete(sql); return this.sqlSession.delete(msId); } /** * 查询数据返回List<T> * * @param sql sql语句 * @param value 参数 * @return int */ @Override public int sqlDelete(String sql, Object value) { Class<?> parameterType = value != null ? value.getClass() : null; String msId = this.msUtils.deleteDynamic(sql, parameterType); return this.sqlSession.delete(msId, value); } /** * 进行预编译 */ private class MSUtils { private Configuration configuration; private LanguageDriver languageDriver; private MSUtils(Configuration configuration) { this.configuration = configuration; this.languageDriver = configuration.getDefaultScriptingLanguageInstance(); } private String newMsId(String sql, SqlCommandType sqlCommandType) { StringBuilder msIdBuilder = new StringBuilder(sqlCommandType.toString()); msIdBuilder.append(".").append(sql.hashCode()); return msIdBuilder.toString(); } private boolean hasMappedStatement(String msId) { return this.configuration.hasStatement(msId, false); } private void newSelectMappedStatement(String msId, SqlSource sqlSource, final Class<?> resultType) { MappedStatement ms = (new MappedStatement.Builder(this.configuration, msId, sqlSource, SqlCommandType.SELECT)).resultMaps(new ArrayList<ResultMap>() { { this.add((new org.apache.ibatis.mapping.ResultMap.Builder(com.culturalCenter.placeManage.mapper.SqlMapper.MSUtils.this.configuration, "defaultResultMap", resultType, new ArrayList(0))).build()); } }).build(); this.configuration.addMappedStatement(ms); } private void newUpdateMappedStatement(String msId, SqlSource sqlSource, SqlCommandType sqlCommandType) { MappedStatement ms = (new MappedStatement.Builder(this.configuration, msId, sqlSource, sqlCommandType)).resultMaps(new ArrayList<ResultMap>() { { this.add((new org.apache.ibatis.mapping.ResultMap.Builder(com.culturalCenter.placeManage.mapper.SqlMapper.MSUtils.this.configuration, "defaultResultMap", Integer.TYPE, new ArrayList(0))).build()); } }).build(); this.configuration.addMappedStatement(ms); } private String select(String sql) { String msId = this.newMsId(sql, SqlCommandType.SELECT); if (this.hasMappedStatement(msId)) { return msId; } else { StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql); this.newSelectMappedStatement(msId, sqlSource, Map.class); return msId; } } private String selectDynamic(String sql, Class<?> parameterType) { String msId = this.newMsId(sql + parameterType, SqlCommandType.SELECT); if (this.hasMappedStatement(msId)) { return msId; } else { SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType); this.newSelectMappedStatement(msId, sqlSource, Map.class); return msId; } } private String select(String sql, Class<?> resultType) { String msId = this.newMsId(resultType + sql, SqlCommandType.SELECT); if (this.hasMappedStatement(msId)) { return msId; } else { StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql); this.newSelectMappedStatement(msId, sqlSource, resultType); return msId; } } private String selectDynamic(String sql, Class<?> parameterType, Class<?> resultType) { String msId = this.newMsId(resultType + sql + parameterType, SqlCommandType.SELECT); if (this.hasMappedStatement(msId)) { return msId; } else { SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType); this.newSelectMappedStatement(msId, sqlSource, resultType); return msId; } } private String insert(String sql) { String msId = this.newMsId(sql, SqlCommandType.INSERT); if (this.hasMappedStatement(msId)) { return msId; } else { StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql); this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.INSERT); return msId; } } private String insertDynamic(String sql, Class<?> parameterType) { String msId = this.newMsId(sql + parameterType, SqlCommandType.INSERT); if (this.hasMappedStatement(msId)) { return msId; } else { SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType); this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.INSERT); return msId; } } private String update(String sql) { String msId = this.newMsId(sql, SqlCommandType.UPDATE); if (this.hasMappedStatement(msId)) { return msId; } else { StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql); this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.UPDATE); return msId; } } private String updateDynamic(String sql, Class<?> parameterType) { String msId = this.newMsId(sql + parameterType, SqlCommandType.UPDATE); if (this.hasMappedStatement(msId)) { return msId; } else { SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType); this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.UPDATE); return msId; } } private String delete(String sql) { String msId = this.newMsId(sql, SqlCommandType.DELETE); if (this.hasMappedStatement(msId)) { return msId; } else { StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql); this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.DELETE); return msId; } } private String deleteDynamic(String sql, Class<?> parameterType) { String msId = this.newMsId(sql + parameterType, SqlCommandType.DELETE); if (this.hasMappedStatement(msId)) { return msId; } else { SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType); this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.DELETE); return msId; } } } }

 

然后做一个 数据连接工厂类

SqlSessionFactoryConfig
代码100分/**
 * @author chaild
 * @Date 2020年6月23日18:25:22
 *  创建SQL连接工厂类
 * */
@Configuration
public class SqlSessionFactoryConfig {
    @javax.annotation.Resource
    DruidDataSource dataSource;

    @Bean
    @Primary
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);//更多参数请自行注入
        bean.setPlugins(new Interceptor[]{new SqlInterceptor()});
        Resource[] resources = new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/*.xml");
        bean.setMapperLocations(resources);
        return bean.getObject();
    }
}

 

使用示例:

@Autowired 
private SqlMapper sqlMapper;

###selectList

//查询,返回List<Map>
List<Map<String, Object>> list = sqlMapper.selectList("select * from country where id < 11");

//查询,返回指定的实体类
List<Country> countryList = sqlMapper.selectList("select * from country where id < 11", Country.class);

//查询,带参数
countryList = sqlMapper.selectList("select * from country where id < #{id}", 11, Country.class);

//复杂点的查询,这里参数和上面不同的地方,在于传入了一个对象
Country country = new Country();
country.setId(11);
countryList = sqlMapper.selectList("<script>" +
        "select * from country " +
        "   <where>" +
        "       <if test="id != null">" +
        "           id &lt; #{id}" +
        "       </if>" +
        "   </where>" +
        "</script>", country, Country.class);
##复杂查询使用map传入参数   
 Map<String,String> map=new HashMap<>();
map.put("id","21321312312312312");
map.put("status","1");
sqlMapper.sqlSelectList("select * from tb_admin where id=#{id} and status=#{status}",map,Admin.class);


###selectOne 查询单条数据

Map<String, Object> map = sqlMapper.selectOne("select * from country where id = 35");

map = sqlMapper.selectOne("select * from country where id = #{id}", 35);

Country country = sqlMapper.selectOne("select * from country where id = 35", Country.class);

country = sqlMapper.selectOne("select * from country where id = #{id}", 35, Country.class);
###insert,update,delete

###insert 插入数据
int result = sqlMapper.insert("insert into country values(1921,‘天朝‘,‘TC‘)");

Country tc = new Country();
tc.setId(1921);
tc.setCountryname("天朝");
tc.setCountrycode("TC");
//注意这里的countrycode和countryname故意写反的
result = sqlMapper.insert("insert into country values(#{id},#{countrycode},#{countryname})"
                          , tc);


###update 更新使用
result = sqlMapper.update("update country set countryname = ‘天朝‘ where id = 35");

tc = new Country();
tc.setId(35);
tc.setCountryname("天朝");

int result = sqlMapper.update("update country set countryname = #{countryname}" +
           " where id in(select id from country where countryname like ‘A%‘)", tc);


##delete 删除使用
result = sqlMapper.delete("delete from country where id = 35");
result = sqlMapper.delete("delete from country where id = #{id}", 35);

 

 

如果实现 了 Interceptor 类进行SQL二次处理封装,会报二次编译的问题 

 

mybatis 使用自定义sql 语句

原文地址:https://www.cnblogs.com/Mr-lin66/p/13378304.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7088.html

(0)
上一篇 2023-03-27
下一篇 2023-03-27

相关推荐

  • DbUTils「建议收藏」

    DbUTils「建议收藏」DBUTILS dbutils是apeach公司 封装了jdbc的jar包用来 便捷操作数据库: 核心类:QueryRunnner > 核心方法:query()查询 update()增删改 具体使用…

    2023-04-01
    168
  • mysql水平拆分_MySQL多表查询

    mysql水平拆分_MySQL多表查询一、背景 老大安排要对某张大容量表进行分割,根据年份分割成多张表。 二、水平分割 水平拆分是指数据表行的拆分,表的行数超过百万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。 定义规则分表后

    2022-12-26
    163
  • 如何安装Jupyter

    如何安装JupyterJupyter是一个基于Web的交互式计算环境,可通过电子邮件、微信、Dropbox、GitHub等方式共享计算文档。它支持多种编程语言,包括Python、R、Julia等。本文将重点介绍如何在Python环境下安装Jupyter。

    2024-08-21
    28
  • Python字典的快速值检索方法

    Python字典的快速值检索方法Python字典是一种可变容器,可以存储任意类型的值。每个值都与唯一的键相关联,通过该键可以快速访问该值。Python字典使用哈希表实现,因此,字典中的元素是无序的,但是可以通过键快速访问值。

    2024-02-16
    84
  • Python List Get方法详解

    Python List Get方法详解List是Python自带的一种基本数据类型,可以存放各种类型的数据。List在Python中的使用非常广泛,是一个重要的数据结构。Python List Get方法可以用来获取List中的元素。

    2024-03-30
    91
  • [20210831]bbed读取数据块6.txt[通俗易懂]

    [20210831]bbed读取数据块6.txt[通俗易懂][20210831]bbed读取数据块6.txt–//前一段时间使用自己写的脚本读取数据块,遇到1个小问题,就是字段串超长就仅仅显示1段。–//实际上bbed最大显示宽度是300,我测试最大显示2

    2023-04-21
    149
  • Python 编写的 Button 交互组件

    Python 编写的 Button 交互组件Button 是一种常见的交互组件,用户通过点击按钮来触发特定事件。在 Python 中,我们可以使用不同的库来创建各种不同的 Button,例如 tkinter 和 PyQt 等。

    2024-01-20
    95
  • tiflash性能_替代flash

    tiflash性能_替代flashTiFlash 这个项目的核心思路与和 TiDB 一样:持续听取用户反馈、持续改进、持续优化、高速迭代。最近几周陆续有数十家用户已经率先体验了 TiFlash,测试的过程中很多同学注意到一个现象,短…

    2023-02-21
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注