精华内容
下载资源
问答
  • mybatis注解动态sql
    千次阅读
    2022-03-12 10:36:54

    在 Mybatis 中,使用注解可以很方便的进行sql操作,但很多动态 SQL 都是由 xml 配置实现的。而随着 SpringBoot的逐渐发展,越来越多的配置由配置文件转成注解的形式。其中包括动态 SQL 。

    Mybatis 的注解中,使用太过长的sql语句看起来很不美观。

    @Select("SELECT title from book_tbl where id = #{id}")
    

    如果想要在 mapper 中进行非必要关键字的查询时就需要使用动态 SQL,与 xml 配置不同的是,@Select注解中 SQL 语句必须以 <script> 标签包裹。

    @Select("<script>"+
    			"SELECT id " +
                "from book_tbl" +
                "<where>" +
                "<if test 'company_id != null'>" +
                "and company_id = #{company_id}" +
                "</if>" +
                "<if test 'title != null'>" +
                "and title like CONCAT('%',#{title},'%')" +
                "</if>" +
                "</where>" +
                "ORDER BY create_time desc,rank desc" +
            "</script>")
    

    感谢大家的耐心阅读,如有建议请私信或评论留言

    更多相关内容
  • java工程,练习通过MyBatis注解的方式配置SQL映射器,实现动态SQL.
  • mybatis注解动态sql详解

    2021-01-17 18:02:34
    关于mybatis已经给大家讲过很多次了,下面要接着给大家介绍mybatis注解动态sql的内容,一起来了解一下mybatis注解开发之三种动态sql吧。1、脚本sql对于XML配置方式的动态SQL这里的话就不怎么讲了,下面的内容是用的...

    关于mybatis已经给大家讲过很多次了,下面要接着给大家介绍mybatis注解动态sql的内容,一起来了解一下mybatis注解开发之三种动态sql吧。

    1、脚本sql

    对于XML配置方式的动态SQL这里的话就不怎么讲了,下面的内容是用

    3388abc3aad837181032fe0ba43c237f.png的方式将他照搬过来,用注解来实现。

    这个比较适用于xml配置转换到注解配置。

    其实,可以很明显的看出,在java当中写xml可读性和维护性真的是比较的差的,尤其是在SQL非常长的时候,超级的麻烦。

    2、在方法中构建sql

    这里的话,我们借用内部类来生成动态SQL。

    增改删有对应的@InsertProvider、@UpdateProvider、@DeleteProvider。

    这样的话会更加的清晰一些,它比较的适合用于查询语句不是特别的长,条件不多的场景。

    但是,在写非常长的SQL的时候,这样的方式也是会比较的麻烦,写到不想写了。@Mapper

    public interface MybatisDao

    {

    //使用UserDaoProvider类的findUserById方法来生成sql

    @SelectProvider(type = UserDaoProvider.class, method = "findUserById")

    public List  findUserById(User user);

    class UserDaoProvider

    {

    public String findUserById(User user)

    {

    String sql = "SELECT * FROM user";

    if (user.getId() != null)

    {

    sql += " where id = #{id}";

    }

    return sql;

    }

    }

    3、结构化SQL

    这里的话,将前面的内部类进行了一下改造。public String findUserById(User user)

    {

    return new SQL()

    {

    {

    SELECT("id,name");

    SELECT("other");

    FROM("user");

    if (user.getId() != null)

    {

    WHERE("id = #{id}");

    }

    if (user.getName() != null)

    {

    WHERE("name = #{name}");

    }

    //从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接

    }

    }.toString();

    }

    上面的一些例子都只是一些很基础的用法介绍,假如你还想了解更多的用法,请继续关注奇Q工具网的常见问题栏目来进行了解吧。

    推荐阅读:

    展开全文
  • 在用mabatis的时候是觉得已经很方便了,但是碰到动态sql语句,就有点蒙了,昨天刚写完我的动态sql,遇到了不少问题,百度了很多波,好多文章对于like limit涉及的不是很多。在这里做一下记录 问题背景 我需要在...

    写在前面

    在用mabatis的时候是觉得已经很方便了,但是碰到动态的sql语句,就有点蒙了,昨天刚写完我的动态sql,遇到了不少问题,百度了很多波,好多文章对于like limit涉及的不是很多。在这里做一下记录

    问题背景

    我需要在下面这张表里,根据 pname 和 typeId 查找这张表里的数据。可是pname 这个字段我是不一定每次都会有的

    select count(*) from product where typeId = #{typeId} (and pname like #{pname})
    //后面括号内我需要动态sql实现
    

    在这里插入图片描述

    解决问题

    一:like

    我觉得用script标签包裹写不方便阅读,就用了java类去写
    在这里插入图片描述
    这里 like 后的 pname 需要加上 “%%”
    我在ServceImpl层加工了 pname

    pname = "%"+pname+"%"
    

    java类使用

    先新建一个java类
    由于给mabatis传参,会自动封装成key-value的形式

    public List<Product> findByPage(@Param("typeId") int typeId,@Param("start") int start,@Param("pageSize") int pageSize,@Param("pname") String pname);
    

    所以可以在新建的java类中用Map来获得参数
    在这里插入图片描述
    然后 new SQL()
    在这里插入图片描述

    二: limit

    我发现java类中,我找不到limit关键字,于是在另一个需要 limit 的动态sql语句中用script标签包裹。
    在这里插入图片描述

    @Select("<script> " +
                "select * " +
                "from product where" +
                "<if test = \"typeId != 0\"> typeId = #{typeId} </if>" +
                "<if test = \"pname != null and pname.length() > 0\"> AND pname like #{pname} </if>" +
                "LIMIT #{start},#{pageSize} "
                "</script>")
           
    

    这样写是经过测试是不行的,只能把 limit 放在判断里才会执行。

    展开全文
  • Mybatis 注解开发 + 动态SQL

    千次阅读 2022-03-27 20:26:31
    Hello 大家好我是橙子同学,今天分享注解Mybatis注解开发+动态sql 目录 每文一铺垫(今天有小插曲哦) 注解开发 添加@Insert 删除@Delete 查询@Select 修改@Update 实现结果集封装@Result 实现一对一结果...

    Hello 大家好我是橙子同学,今天分享注解Mybatis注解开发+动态sql

    目录

    每文一铺垫(今天有小插曲哦)

    注解开发

    添加 @Insert

    删除 @Delete

    查询 @Select

    修改 @Update

             实现结果集封装  @Result

            实现一对一结果集封装 @one

            实现多对多结果集封装 @Many  

    动态SQL

            标签 <set>  <if>

            标签<where>

            标签<foreach>

            标签<choose>

            标签 <when>

    收尾


    每文一铺垫(今天有小插曲哦)

        先说一个小插曲,因为 橙子同学确实是快要找实习了,这几天宅在家就想着试试水,毕竟没接触过,也不知道这个圈子的包容性强不强,今天早晨可能没太睡醒,一冲动就给很多公司投递了简历(包括阿里和字节),因为有一个“一键投递”功能,所以我就点了,大概中午的时候接到了一个hr的电话,刚接到电话感觉这个人不太靠谱,因为他说话嗯啊的,还在打哈欠,每问一个问题之前要想好久,说好几个“就是……就是……”,感觉他比我紧张,传达给我的信息就是想要我独立开发一个小程序,前端+后端都是我完成,我的印象里这个东西不应该是分工合作的么,做前端的做页面,做后端的搞功能,这要是一个人做不会累死么(可能是我了解的不多),经过几分钟的聊天之后,他加了我的微信,然后发给了几张拼多多首页,然后一个电话过来,问我这个页面用代码怎么写,此时此刻小橙的内心已经很激动了,因为第一次遇见这样的,好像上来就面试一样,反正我就把我脑子里的东西尽量表达出来,最后的最后他说“好的,了解了,再见” 。不出意外——凉凉了。但是这次给我的感觉就是 hr能不能 睡醒了再沟通,都表达不清楚自己想要的是什么;另外我的技术有待提升,这个圈子是不会给菜鸟机会的,难过的一天……

    好啦步入主题:注解开发+动态SQL

    注解开发

         在之前的Mybatis基础开发操作的时候,我们的sql语句是写在映射文件里的,映射文件提供了“增、删、改、查”标签,然后将映射文件与接口连接,在测试类中调用接口中的方法,今天介绍的注解开发省去了在映射文件中的操作,让我们的代码更加清晰而且简洁。

    添加 @Insert

    直接在接口“脑袋上”添加注解@Insert,把SQL语句写在后面

    补充:@Options 在添加属性的同时获取  属性值

        //添加
        @Insert("insert into tb_person values(null,#{name},#{age},#{sex})")
       @Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
         void addPerson(Person person);

    在测试类里测试一下

    @Before 是指测试代码执行前先执行的内容

    每个测试都需要读取配置文件;获取sqlSession工厂对象;创建dao接口的代理对象;所以我们把他们抽出来放在@Before里,就不需要每次都写啦~

    @After   测试代码执行后,执行的内容

    关闭操作 释放资源

    public class MyTest {
        private SqlSession sqlSession ;
        private PersonMapper mapper;
        @Before
        public void before(){
            sqlSession = MyBatisUtils.getSqlSession();
            mapper = sqlSession.getMapper(PersonMapper.class);
        }
        @After
        public void after(){
            sqlSession.close();
        }
    
    
        @Test
        public void test1(){
            Person person = new Person();
            person.setName("李易峰");
            person.setAge(23);
            person.setSex("男");
            mapper.addPerson(person);
            System.out.println(person);
        }
    
    }

    “李易峰”就添加成功啦

    删除 @Delete

        //删除
        @Delete("delete from tb_person where id=#{id}")
        void deleteById(Integer id);

    查询 @Select

        //查询
        @Select("select * from tb_person where id=#{id}")
        Person findById(Integer id);

     修改 @Update

        //修改
        @Update("update tb_person set name=#{name},age=#{age},sex=#{sex} where id=#{id}")
        void updatePerson(Person person);

    实现结果集封装  @Result

    一对一关联查询

    接口

    public interface IdCardMapper {
        @Select("select * from idcard where id=#{id}")
        public IdCard findById(Integer id);
    }

    实现一对一结果集封装 @one

      @Results(id = "personAndCard",value = {
                @Result(id = true,property = "id",column = "id"),
                @Result(property = "name",column = "name"),
                @Result(property = "age",column = "age"),
                @Result(property = "idCard",column = "card_id",one = @One(select = "com.mapper.IdCardMapper.findById"))
        })
        @Select("select * from person where id=#{id}")
        Person findById(Integer id);

    实现多对多结果集封装 @Many  

    接口

    public interface OrderMapper {
        @Select("select * from tb_order where user_id=#{uid}")
        List<Order> findByUserId(Integer uid);
    }
    public interface UserMapper {
        @Results(id = "userAndOrder",value = {
                @Result(id = true,property = "id",column = "t_id"),
                @Result(property = "name",column = "t_name"),
                @Result(property = "age",column = "t_age"),
                @Result(property = "orders",column = "t_id",
                        many = @Many(select = "com.mapper.OrderMapper.findByUserId"))
        })
        @Select("select * from tb_user where t_id=#{id}")
        User findById(Integer id);
    }

     

          增删改查 关联查询 都实现啦,但是有没有注意到,有的部分很麻烦,比如在增加、修改,需要更新数据的时候,需要把所有的字段都修改,很不方便,橙子只想修改年龄,但是“姓名”“性别”“ID”……都需要传进来修改,很麻烦,字段少的情况下,可以,忍忍就过去了,十几二十几个字段那岂不是太头痛了,所以接下来介绍解决这个问题的方法:动态SQL

    动态SQL

        动态sql的理念很简单,“哪里不会点哪里~”简单来说就是需要哪个字段 诶,咱就去拼接哪个字段,不用的就不管啦,简单介绍一下动态sql标签。

    标签<set>  <if>

    大家对于<if>标签肯定不陌生,很容易理解,条件判断嘛,<set> 修改  举个栗子:

    如果name不为null ,筛选用户名 ;

    如果gender不为null ,筛选性别 ;

    如果age不为null ,筛选年龄;

    如果……

     标签<where>

    结合之前的sql思考,可知这个标签,就是拼接筛选条件,举个栗子:

    如果name不为null ,筛选用户名 ;

    如果gender不为null ,筛选性别 ;

    如果age不为null ,筛选年龄;

    如果……

    标签<foreach >

    与JavaScript中的foreach类似,进行遍历操作

    属性如下

       collection:代表要遍历的集合元素,注意编写时不要写#{}
        open:代表语句的开始部分
        close:代表结束部分
        item:代表遍历集合的每个元素,生成的变量名
        sperator:代表分隔符

    举个栗子:

    <!--根据多个id查询用户信息-->
    <select id="findUsersByIds" resultType="user" >
        SELECT *from USER
        <where>
            <foreach collection="array"  open="and id in (" close=")" separator="," item="uid">
                #{uid}
            </foreach>
        </where>
    </select>

    标签<choose>

     此标签解释来源:https://www.jianshu.com/p/9f97543b6b2e

      有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系。

    choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

    标签<when> 

    类似于 switch ,按照已经筛选好的条件,当 when 中有条件满足的时候,就会执行 choose,当所有的条件都不满足的时候就执行 otherwise

    注解中可以使用动态sql么?可以,当然可以。

    用添加字段  举个栗子

     @Update("<script>" +
                "update tb_person " +
                "<set>" +
                "<if test='name!=null'>" +
                "name=#{name}," +
                "</if>" +
                "<if test='age!=null'>" +
                "age=#{age}," +
                "</if>" +
                "<if test='sex!=null'>" +
                "sex=#{sex}" +
                "</if>" +
                "</set>" +
                "where id=#{id}" +
                "</script>")
        void updatePerson2(Person person);

     哇,头痛,没有提示,简直是手撕sql啊,但凡有一个符号写错了,直接报错,还找不到,还有比这更闹心的么?橙子要说了,还不如用映射文件呢,对啊,那么这个地方,记笔记,可以使用注解+映射文件结合。

    在映射文件里面写动态sql

    <?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文件所在路径 -->
    <mapper namespace="com.mapper.PersonMapper">
        <update id="updatePerson3" parameterType="Person" >
            update tb_person
            <set>
                <if test="name!=null">
                    name=#{name},
                </if>
                <if test="age!=null">
                    age=#{age},
                </if>
                <if test="sex!=null">
                    sex=#{sex}
                </if>
            </set>
            where id=#{id}
        </update>
    
    </mapper>

    接口里和以前一样

    void updatePerson3(Person person);

    收尾

        其实对于动态SQL中的有些标签,我理解的也有些模糊,所以可能有的地方写的不是太清楚,欢迎大家指正,包括在写的过程中我也去查询了其他人是怎么写的,但是主要还是来源于上课老师大大传授给我的,有部分内容也引用了老师的, 跪求我的主讲老师不会刷到我的博客哈哈哈哈,

        上期说这期还有一级缓存,二级缓存和和延迟加载, 写完这些我发现太多了,那就继续再往后推一推吧~~

       趁着小橙还没火,还不赶紧关注 吼吼吼吼~~

    展开全文
  • MyBatis利用动态SQL进行批量操作
  • mybatis-动态sql

    2022-06-12 09:56:03
    mybatis动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类:2.1 if以修改功能为例,演示if的用法 1)mapper层(即Dao层) 2)在service层增加对应的...
  • 14. 使用MyBatis注解配置SQL

    千次阅读 2022-02-26 12:56:58
    14. 使用MyBatis注解配置SQL 1.MyBatis常用注解 @Insert:实现新增,代替了 @Delete:实现删除,代替了 @Update:实现更新,代替了 @Select:实现查询,代替了 @Result:实现结果集封装,代替了 @...
  • mybatis注解实现动态sql

    千次阅读 2019-05-03 20:54:02
      在整合ssm的时候,遇到一个多表联合(多表,多条件组合,分页)查询的问题,需要自定义mapper.xml,  但本人又比较反感写xml文件,总感觉配置文件没有注解来的简洁,于是用到了 “注解实现动态sql” ,所以总结一下...
  • mybatis_动态SQL

    千次阅读 2022-04-18 18:30:59
    动态sql是指sql语句可动态的变化 /** * 通过条件查询员工信息【条件不确定】 private Integer id; //员工id private String lastName; //员工姓名 private String email; //员工邮箱 private Double salary; ...
  • Mybatis注解上实现动态SQL及in查询
  • Mybatis注解SQL语句

    千次阅读 2021-06-29 14:45:43
    //注意事项: 映射文件和注解二选一 @Select("select * from demo_user where id = #{id}") User findUserById(int id); Test中 @Autowired private UserMapper userMapper; //根据ID查询数据 @Test public ...
  • Mybatis注解实现SQL语句

    千次阅读 2022-02-24 14:43:11
    Mybatis注解实现SQL语句 增 @Insert("insert into blog values(null,'河师大报', '魏欣', '2022-02-23', '99')") void insertBlog(); 删 @Delete("delete from blog where id =4") void deleteBlog(); 查 @...
  • Mybatis解析动态sql原理分析

    千次阅读 2019-01-10 08:47:27
    比如这段动态sql代码: &lt;update id="update" parameterType="org.format.dynamicproxy.mybatis.bean.User"&gt; UPDATE users &lt;trim prefix="SET" ...
  • mybatis动态sql及分页

    2022-06-12 08:53:57
    mybatis动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类:以修改功能为例,演示if的用法 1)mapper层(即Dao层) 2)在service层增加对应的方法 3...
  • 相信很多同学很少遇见这种,也很少用到这种,因为这种写法有点恶心。但是遇到了就要解决啊,网上搜了一堆,都是int,不知道是有意还是无意的,例子如下: @Select("<script>" + "select a.* from pub_info ...
  • Mybatis 动态SQL 实现方式 第一种方式 在 mapper 的 interface类中使用注解的方式实现: 需要使用 ”) List selectAreaByCondition(Map<String,Object> map); 这种方式在写法上面和 XML 中的写法是一样,...
  • MyBatis动态拼接SQL

    2017-04-08 14:19:28
    MyBatis动态拼接SQL
  • Mybatis中以注解开发的方式使用动态sql拼接语句 Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL ...
  • Mybatis动态SQL实现更新操作

    千次阅读 2021-01-27 12:25:23
    动态SQL实现更新操作 在之前例子中,更新时需要传入所有参数,当某一参数为null时,会导致更新错误,如下图 注释掉某些参数: 未传参的结果为null了,显然不是我们想实现的 因此需要用到if set标签: 1、if...
  • mybatis的xml配置中实现动态sql是非常容易的,只需要使用<where>标签以及<if>标签嵌套就行了,但是如果使用注解开发的话就是另外的一种方式,只需要在我们需要书写的sql语句中加上一个<script>&...
  • MyBatis注解sql及映射

    2021-06-13 00:30:37
    MyBatis注解sql及映射 MyBatis支持使用注解来配置映射的sql语句,这样可以省掉映射器xml文件 一、映射语句 1、insert 比如入门实例中的: public int insert(User user) throws Exception; <insert id="insert" ...
  • 注意:此处只写了foreach的最核心部分,动态sql 注解开发需要在最外层嵌套<script>标签,并且对里面的一些引号进行转意(最下方有示例) select * from user where 1=1 and <foreach item="id" collection=...
  • mybatis注解sql

    2021-03-16 11:00:42
    /** * 传入sql 获取 List> * @param sql * @return */ List> superManagerSelect(String sql); /** * 根据项目id,获取没有填写中标信息的包 * @param projectId * @return */ @Select(" select t.package_id, t....
  • MyBatis的注解版的动态SQL_天元白手的博客-CSDN博客_mybatis注解动态sql
  • --Mybatis动态SQL中使用Like语句--> select * from person where name like "%"#{name}"%"<!--推荐使用--> orcale数据库试用第一种sql读取错误,第二种成功 select * from person where name like '%'|...
  • 这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下  Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,...
  • mybatis动态sql-新增与更新

    千次阅读 2022-03-19 14:43:08
    记录一个简单的mybatis动态sql例子 新增 <?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"> ...
  • @Select("<script>" +"SELECT department_user_id FROM bx_well_department_user WHERE department_user_id IN " + "<foreach item='item' index='index' collection='list' open='(' separator=',' ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,594
精华内容 46,637
关键字:

mybatis注解动态sql