精华内容
下载资源
问答
  • MyBatis-Plus 分页查询以及自定义sql分页

    万次阅读 多人点赞 2019-06-12 17:53:46
    四、自定义sql分页查询 有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的, 先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。...

    一、引言

    分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。

    物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。

    逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。

    那么MP中的物理分页怎么实现呢? 往下看往下看

    二、配置

    创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。

    /**
     * @Auther: IT贱男
     * @Date: 2019/6/12 15:06
     * @Description: MybatisPlus配置类
     */
    @Configuration
    public class MyBatisPlusConfig {
    
        /**
         * 分页插件
         * @return
         */
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }

    三、具体分页实现

    MP的Wrapper提供了两种分页查询的方式,源码如下

        /**
         * 根据 entity 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件
         * @param queryWrapper 实体对象封装操作类
         */
        IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。

        /**
         * 分页查询
         */
        @Test
        public void selectByPage() {
            QueryWrapper<User> wrapper = new QueryWrapper();
            wrapper.like("name", "雨").lt("age", 40);
    
            Page<User> page = new Page<>(1,2);
    
            //IPage<User> userIPage = userMapper.selectPage(page, wrapper);
    
            IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);
    
    
            System.out.println("总页数"+mapIPage.getPages());
            System.out.println("总记录数"+mapIPage.getTotal());
            List<Map<String, Object>> records = mapIPage.getRecords();
            records.forEach(System.out::println);
        }

    以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。

    DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ? 
    DEBUG==> Parameters: %雨%(String), 40(Integer)
    TRACE<==    Columns: COUNT(1)
    TRACE<==        Row: 2
    DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,? 
    DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
    TRACE<==    Columns: id, name, age, email, manager_id, create_time
    TRACE<==        Row: 2, 张雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
    TRACE<==        Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
    DEBUG<==      Total: 2
    总页数1
    总记录数2

    现在我们有需求只要查询数据即可, 不关心总记录数等,如果使用默认的方式就消耗不必要的性能。那么解决办法也是很简单的,只需要在创建page对象时传入第三个参数为false即可

     Page<User> page = new Page<>(1,2,false);

    四、自定义sql分页查询

    有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,

    先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。

    步骤一:在mapper文件中,编写对应的分页查询接口。

    步骤二:在xml中编写对应的sql语句,小编这里演示的 “${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。 

        /**
         * 自定义sql分页
         * @param page
         * @param queryWrapper 看这里看这里,如果自定义的方法中需要用到wrapper查询条件,需要这样写
         * @return
         */
        IPage<User> selectMyPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.demo.mapper.UserMapper">
    
        <select id="selectMyPage" resultType="com.example.demo.model.User">
            SELECT * FROM user ${ew.customSqlSegment}
        </select>
    
    </mapper>
       /**
         * 自定义sql分页查询
         */
        @Test
        public void selectByMyPage() {
            QueryWrapper<User> wrapper = new QueryWrapper();
            wrapper.like("name", "雨").lt("age", 40);
            Page<User> page = new Page<>(1,2);
            IPage<User> mapIPage = userMapper.selectMyPage(page, wrapper);
    
            System.out.println("总页数"+mapIPage.getPages());
            System.out.println("总记录数"+mapIPage.getTotal());
            List<User> records = mapIPage.getRecords();
            records.forEach(System.out::println);
        }

    五、多表sql分页查询

    看评论有小伙伴反馈多表连接查询怎么分页,其实道理都是一样的。

    小编以简单的为主,sql如下: his_ipd_encounter、his_user 两张表

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.demo.mapper.UserMapper">
    
        <select id="selectByHisName" resultType="java.lang.String">
            select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
        </select>
        
    
    </mapper>

    mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象

    
    /**
     * <p>
     * 用户 Mapper 接口
     * </p>
     *
     * @author IT贱男
     * @since 2019-06-14
     */
    public interface UserMapper extends MyMapper<User> {
    
    
        /**
         * 多表查询分页
         * @param page
         * @return
         */
        IPage<String> selectByHisName(IPage<User> page);
    }
    

    测试如下:通过查看日志,执行的sql加了分页条件的。

       @Test
        public void select(){
            // 创建分页参数
            Page<User> page = new Page<>(1,2);
            IPage<String> result = userMapper.selectByHisName(page);
            // 获取数据
            List<String> records = result.getRecords();
            records.forEach(System.out::println);
            System.out.println("总页数 = "+ result.getPages());
        }
    
    ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.
    INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)
    select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
    DEBUG==>  Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid 
    DEBUG==> Parameters: 
    TRACE<==    Columns: COUNT(1)
    TRACE<==        Row: 117
    DEBUG==>  Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,? 
    DEBUG==> Parameters: 0(Long), 2(Long)
    TRACE<==    Columns: realname
    TRACE<==        Row: 胡伯云
    TRACE<==        Row: 安元慧
    DEBUG<==      Total: 2
     Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisName
    Execute SQL:
        com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce
    
    胡伯云
    安元慧
    总页数 = 59
    

     

    展开全文
  • .Net core中对dataTable不像.net ...所以这里需要自己去对于dataTable处理(也是在.Net core中执行自定义sql的核心) public class EfService : IEfService { public IConfiguration _Configuration; public s...

    .Net core中对dataTable不像.net framework中那么支持,

    所以这里需要自己去对于dataTable处理(也是在.Net core中执行自定义sql的核心)

    public class EfService : IEfService
        {
            public IConfiguration _Configuration;
    
            public string _ConnectionString;
    
            public EfService(IConfiguration configuration)
            {
                this._Configuration = configuration;
                this._ConnectionString = _Configuration.GetConnectionString("DbConnectionString");
            }
    
            #region 查询集合
    
            public List<T> QueryList<T>(string sql, Dictionary<string, object> dicPara = null) where T : class
            {
                var dataList = new List<T>();
                var dt = QueryDataTable(_ConnectionString, sql, dicPara);
                var columns = GetColumns(dt);
                foreach (DataRow row in dt.Rows)
                {
                    var data = row.ItemArray;
                    var dic = new Dictionary<string, object>();
                    for (int i = 0; i < data.Length; i++)
                    {
                        var value = data[i];
                        if (!IsEmpty(value))
                        {
                            var columnName = columns[i];
                            dic.Add(columnName, value);
                        }
                    }
                    var model = DictionaryToModel<T>(dic);
                    dataList.Add(model);
                }
    
                return dataList;
            }
    
            public List<T> QueryList<T>(string connectionString, string sql, Dictionary<string, object> dicPara = null) where T : class
            {
                var dataList = new List<T>();
                var dt = QueryDataTable(connectionString, sql, dicPara);
                var columns = GetColumns(dt);
                foreach (DataRow row in dt.Rows)
                {
                    var data = row.ItemArray;
                    var dic = new Dictionary<string, object>();
                    for (int i = 0; i < data.Length; i++)
                    {
                        var value = data[i];
                        if (!IsEmpty(value))
                        {
                            var columnName = columns[i];
                            dic.Add(columnName, value);
                        }
                    }
                    var model = DictionaryToModel<T>(dic);
                    dataList.Add(model);
                }
    
                return dataList;
            }
    
            #endregion
    
            #region 查询DataTable
    
            public DataTable QueryDataTable(string connectionString, string sql, Dictionary<string, object> dicPara)
            {
                var dt = new DataTable();
                using (var conn = new SqlConnection(connectionString))
                {
                    if (conn.State != ConnectionState.Open) conn.Open();
                    using (var comm = new SqlCommand(sql, conn))
                    {
                        comm.Parameters.Clear();
                        if (dicPara != null && dicPara.Any()) comm.Parameters.AddRange(CreateSqlParameter(dicPara));
                        using (var da = new SqlDataAdapter(comm))
                        {
                            da.Fill(dt);
                        }
                    }
                }
                return dt;
            }
    
            public SqlParameter[] CreateSqlParameter(Dictionary<string, object> dicPara)
            {
                var paraList = new List<SqlParameter>();
                foreach (var model in dicPara)
                {
                    string key = model.Key;
                    if (!key.StartsWith("@")) key = "@" + key;
                    paraList.Add(new SqlParameter(key, model.Value));
                }
                return paraList.ToArray();
            }
    
            #endregion
    
            #region 辅助方法
    
            public string[] GetColumns(DataTable dt)
            {
                var columns = new List<string>();
                foreach (DataColumn dc in dt.Columns)
                {
                    columns.Add(dc.ColumnName);
                }
                return columns.ToArray();
            }
    
            public bool IsEmpty(object value)
            {
                return value is DBNull;
            }
    
            public T DictionaryToModel<T>(IDictionary dic) where T : class
            {
                var json = JsonConvert.SerializeObject(dic);
                return JsonConvert.DeserializeObject<T>(json);
            }
    
            #endregion
        }

     

    测试调用:

    public class EfCoreController : Controller
        {
            public LingbugDbContext _DbContext;
    
            public IEfService _EfCoreService;
    
            public EfCoreController(LingbugDbContext dbContext, IEfService efService)
            {
                this._DbContext = dbContext;
                this._EfCoreService = efService;
            }
    
            public IActionResult Index()
            {
                #region 新增
    
                //var user = _DbContext.UserInfo.Add(new UserInfo()
                //{
                //    Name = "李四",
                //    Sex = "女",
                //    Status = true,
                //    CreateDate = DateTime.Now,
                //    LastUpdateDate = DateTime.Now
                //});
                //int count = _DbContext.SaveChanges();
    
                #endregion
    
                #region 扩展efcore执行自定义sql - 查询
    
                //var conn = _DbContext.Database.GetDbConnection().ConnectionString;
                //var result = _EfCoreService.QueryList<UserInfo>(conn, @"SELECT * FROM dbo.UserInfoForEfCore");
                //return Content(JsonConvert.SerializeObject(result));
    
                #endregion
    
                #region 扩展efcore执行自定义sql - 增删改
    
                var conn = _DbContext.Database.GetDbConnection().ConnectionString;
                var result = _DbContext.Database.ExecuteSqlCommand(@"UPDATE dbo.UserInfoForEfCore SET Name = '王五',Birthday = GETDATE(),LastUpdateDate = GETDATE() WHERE Id = 1001");
                return Content(result.ToString());
    
                #endregion
    
                #region 执行自定义sql
    
                //var result = _EfCoreService.QueryList<UserInfo>(@"SELECT * FROM dbo.UserInfoForEfCore");
                //return Content(JsonConvert.SerializeObject(result));
    
                #endregion
            }
        }

     

    至于那些EFCore,配置文件以及服务的依赖注入,这里我就不细说了,不懂的可以去看我其他博客,有详细操作讲解

    Ending~

    展开全文
  • 织梦自定义sql查询

    2013-04-10 15:47:14
    织梦自定义sql查询,sql标签查询自定义,用于任何模板
  • gorm框架自定义sql

    2020-10-17 14:13:35
    gorm框架自定义sql 使用gorm框架自定义sql // db为数据库连接 db := ws.rt.MySQL db.Model(BizFeeSubRuleHouse{}).Where("sub_rule_id = ?", subRuleID).Pluck("house_id", &scope)

    gorm框架自定义sql

    使用gorm框架自定义sql

    // db为数据库连接
    db := ws.rt.MySQL
    db.Model(BizFeeSubRuleHouse{}).Where("sub_rule_id = ?", subRuleID).Pluck("house_id", &scope)
    
    展开全文
  • Django自定义sql

    2020-03-19 20:39:44
    # 自定义sql def query(sql, *args): from django.db import connection # with语句相当与cursor= connection.cursor() 和 cursor.close(),简化了语句 with connection.cursor() as cursor: ...

    创建.py文件,单独创建类,方便调用

    # 自定义sql
    def query(sql, *args):
        from django.db import connection
    
        # with语句相当与cursor= connection.cursor() 和 cursor.close(),简化了语句
        with connection.cursor() as cursor:
            cursor.execute("sql语句", "args参数")  # 运行sql语句,args是否传参
            # 通过[col[0] for col in cursor.description]与[dict(zip(columns, row)) for row in cursor.fetchall()]得到列表桃字典
            columns = [col[0] for col in cursor.description]
            res = [dict(zip(columns, row)) for row in cursor.fetchall()]
            return res
    

    调用

    # from App.tools import query
    
        # data = query("select * from user") # 得到元组套元组
        # 带参数
        # data = query("select * from user where uid=%s",10)
        # print(data)
        return HttpResponse("ok")
    
    展开全文
  • JPA自定义sql

    2020-10-08 13:37:59
    JPA的接口定义可以继承的接口有 Repository (总接口) CrudRepository (CRUD...自定义sql 浩瀚的网络中,你我的相遇也是种缘分,看你天资聪慧、骨骼精奇,就送你一场大造化吧,能领悟多少就看你自己了。㊙传承之地?
  • 主要介绍了MyBatisPlus 自定义sql语句的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • MyBatis-Plus 自定义sql语句

    万次阅读 多人点赞 2019-06-12 15:55:39
    一、引言 Good Good Study,Day Day Up,老铁点个关注,涨个粉,么么哒~~~ MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧。 二、配置 自定义...
  • 基于jquery js自定义sql条件查询.rar
  • mybatis执行自定义SQL

    万次阅读 2018-03-28 15:44:20
    需求总是千千万,苦海无涯,总结为上。用generatorSqlmap-increase生成的XML(mapper),DAO,POJO已经能完成基本的数据库操作。※ generatorSqlmap-increase 自动生成...下面就列举一个通过mybatis执行自定义SQL1,XM...
  • DataSnap通过自定义sql查询数据
  • Nutz 自定义SQL

    2018-05-22 10:55:22
    在使用Nutz时,需要用到一些自定义SQL,这里记一下已经运行通过的一些例子。 判断用户是否存在 SELECT 1 返回boolean public boolean existUser(String userId) { Sql sql = Sqls.create(&amp;quot;...
  • mybatis 自定义SQL

    千次阅读 2014-09-26 10:16:49
    mybatis自定义SQL步骤:
  • 主要介绍了Django框架orM与自定义SQL语句混合事务控制操作,结合实例形式分析了同一个方法里面既有ORM又有自定义SQL 语句的情况下事务控制相关操作技巧,需要的朋友可以参考下
  • 这里写自定义目录标题JPA自定义sql is not mapped 报错 JPA自定义sql is not mapped 报错 在用注解写jpa的自定义sql语句时,需要注意的是sql语句的字段,和表名,都需要使用pojo类里面的属性名和类名,否则将会报错 ...
  • springdata jpa自定义sql

    2020-04-20 23:29:05
    自定义sql需要加上nativeQuery=true
  • datax之自定义sql

    千次阅读 2019-07-05 16:40:15
    例如写入方表B有字段(b,c) ,读入方表A有字段(a),需求是将表A的a字段按照某...querySql里面可以自定义sql语句,你查询出来的字段你可以定义别名,别名的类型和写入方的字段名称和类型一致,就能做到自定义映射。 ...
  • 基于WinCC V6.2的VB脚本操作自定义SQL数据库rar,基于WinCC V6.2的VB脚本操作自定义SQL数据库
  • JEECG 开发文档系列 ——JEECG 数据权限自定义SQL表达式用法说明
  • 天心ERP自定义SQL及套版使用说明 天心ERP自定义SQL及套版使用说明
  • Mybatis执行自定义sql

    千次阅读 2019-07-08 09:27:03
    SSM框架中,实体层-Mapper(Dao)层-severice层-controller层...所以怎样在原先系统的框架衍生出灵活的数据库操作,该怎么写在mapper里面反射出来,这个自定义sql并没有和任何实体字段完全一样,所以无法用实体接收当...
  • 在mybatis中执行自定义SQL语句。 本次仍使用spring boot,其中关于引入mybatis和数据库配置不再说明。 UserInfoMapper.xml 映射文件 <!-- 自定义SQL语句 --> <select id="mySelect" resultType="map" ...
  • 主要介绍了MybatisPlus自定义Sql实现多表查询的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • flowable 如何自定义sql

    千次阅读 2019-11-08 14:46:56
    场景: 在实际项目中,有可能你会自己写一些sql,但是你又不想写过多的dao,service xml的时候,我们可以利用flowable自身的自定义sql实现 实现这一场景,我们一般有两种方式。 1、配置xml的形式 1.1、编写xml文件 ...
  • activity自定义sql语句

    2018-11-21 11:08:01
    //自定义sql语句中的值写法:#{值的key},可以理解成key-value形式 //通过parameter方法为sql中定义的 “#{值的key}”赋值,key前后要保持一致 String sql="select * from " +managementS...
  • 1.XML中执行自定义SQL、 https://blog.csdn.net/u012427355/article/details/80654806 2.注解执行自定义SQL @Select("${_parameter}") @Results({ @Result(column = "id", property = "id"), @Resu...
  • Spring Boot Jpa 自定义SQL

    2021-01-14 10:44:50
    Spring Boot Jpa 自定义SQL 自定义查询语句的几种方式 使用@Query注解public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.emailAddress = ?1") ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,130
精华内容 9,652
关键字:

自定义sql