每天技术 总结10.19 mybatis

简单记录一下今天看的一些东西吧。具体的格式以后慢慢来吧。


1     useGeneratedKeys
取值范围true|false
默认值是:false。
含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。

就是个主键自增的设置




2        public String toString()

这是在spring的dao类中看到的写法。是object的方法,任何类都是Object 的子类,故都继承了其方法;

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号

十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

    getClass().getName() + '@' + Integer.toHexString(hashCode())  这句应该是最深刻的了。

用toString函数产生的字符串来输出要输出的东西.





3      MyBatis     foreach


foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,

open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代

到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用

foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的

,主要有一下3种情况:

1.     如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.     如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.     如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array    对象在自己封装的map里面的key

下面分别来看看上述三种情况的示例代码:

1.单参数List的类型:
   
上述collection的值为list,对应的Mapper是这样的
public List dynamicForeachTest(List ids);
测试代码:
    @Test
    public void dynamicForeachTest() {
        SqlSession session = Util.getSqlSessionFactory().openSession();
        BlogMapper blogMapper = session.getMapper(BlogMapper.class);
        List ids = new ArrayList();
        ids.add(1);
        ids.add(3);
        ids.add(6);
        List blogs = blogMapper.dynamicForeachTest(ids);
        for (Blog blog : blogs)
            System.out.println(blog);
        session.close();
    }
2.单参数array数组的类型:
   
上述collection为array,对应的Mapper代码:
public List dynamicForeach2Test(int[] ids);
对应的测试代码:
    @Test
    public void dynamicForeach2Test() {
        SqlSession session = Util.getSqlSessionFactory().openSession();
        BlogMapper blogMapper = session.getMapper(BlogMapper.class);
        int[] ids = new int[] {1,3,6,9};
        List blogs = blogMapper.dynamicForeach2Test(ids);
        for (Blog blog : blogs)
            System.out.println(blog);
        session.close();
    }
3.自己把参数封装成Map的类型
   
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
public List dynamicForeach3Test(Map params);
对应测试代码:
    @Test
    public void dynamicForeach3Test() {
        SqlSession session = Util.getSqlSessionFactory().openSession();
        BlogMapper blogMapper = session.getMapper(BlogMapper.class);
        final List ids = new ArrayList();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        ids.add(6);
        ids.add(7);
        ids.add(9);
        Map params = new HashMap();
        params.put("ids", ids);
        params.put("title", "中国");
        List blogs = blogMapper.dynamicForeach3Test(params);
        for (Blog blog : blogs)
            System.out.println(blog);
        session.close();
    }

上面的这一大段是直接的一个文章。。其实我看到的代码最直接的下面的这个解释,这个解释完美的解决了我的代码中的困惑。。。

情景:查询数据库中文章的相关文章   文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割

查询完一个文章后可以把tags字段构造为一个List 然后利用这个集合作为条件来查询



2.  bind标签



 

3. CONCAT concat实际是字符串链接符 like才是实际的模糊查询

where username LIKE concat(cancat('%',#{username}),'%')

select  USR_NAM like  concat('%',#{name},'%')



5         where  set  if 语句

抱歉。。。下面全部是粘贴的。。。

sql语句where条件中,需要一些安全判断,例如按性别检索,如果传入的参数是空的,此时查询出的结果很可能是空的,也许我们需要参数为空 时,是查出全部的信息。这是我们可以使用动态sql,增加一个判断,当参数不符合要求的时候,我们可以不去判断此查询条件。
 下文均采用MySQL语法和函数(例如字符串链接函数CONCAT

 if标签
 一个很普通的查询:

Xml代码  

[html] view plain copy

         
         


但是此时如果studentName是null或空字符串,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值

为null或等于空字符串,我们就不进行此条件的判断。

修改为:

Xml代码  
[html] view plain copy

         
         


 此时,当studentName的值为null或’’的时候,我们并不进行where条件的判断,所以当studentName值为null或’’值,不附带这

个条件,所以查询结果是全部。

 由于参数是Java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。


   代码中的where标签,请参考3.2.1.

Xml代码  
[html] view plain copy

         
         




查询,姓名中有‘李’,男,生日在‘1985-05-28’,班级在‘20000002’的学生。

Java代码  
[java] view plain copy

    StudentEntity entity = new StudentEntity();      
    entity.setStudentName("李");      
    entity.setStudentSex("男");      
    entity.setStudentBirthday(StringUtil.parse("1985-05-28"));      
    entity.setClassEntity(classMapper.getClassByID("20000002"));      
    List studentList = studentMapper.getStudentListWhereEntity(entity);      
    for( StudentEntity entityTemp : studentList){      
        System.out.println(entityTemp.toString());      
    }     



 where、set、trim标签

 where
当if标签较多时,这样的组合可能会导致错误。例如,like姓名,等于指定性别等:

Xml代码  
[html] view plain copy

         
         




 如果上面例子,参数studentName为null或’’,则或导致此sql组合成“WHERE AND”之类的关键字多余的错误SQL。
 这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。

此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
 上面例子修改为:

Xml代码  
[html] view plain copy

         
         



set
当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔

除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:

Xml代码  
[html] view plain copy

         
         
        UPDATE STUDENT_TBL      
           SET STUDENT_TBL.STUDENT_NAME = #{studentName},      
               STUDENT_TBL.STUDENT_SEX = #{studentSex},      
               STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},      
               STUDENT_TBL.CLASS_ID = #{classEntity.classID}      
         WHERE STUDENT_TBL.STUDENT_ID = #{studentID};      
   
     



 使用set+if标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:

Xml代码  
[html] view plain copy

         
         
        UPDATE STUDENT_TBL      
             
                 
                STUDENT_TBL.STUDENT_NAME = #{studentName},      
           
     
                 
                STUDENT_TBL.STUDENT_SEX = #{studentSex},      
           
     
                 
                STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},      
           
     
                 
                STUDENT_TBL.CLASS_ID = #{classEntity.classID}      
           
     
       
     
        WHERE STUDENT_TBL.STUDENT_ID = #{studentID};      
   
     



3.2.3 trim
 trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

额。。。没看到那么细。慢慢来吧。以后看到了再加上。。




6        MYSQL中LIMIT用法

limit是mysql的语法
select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录


limit字句中是不允许运算的。    有上面的一段就可以理解解决问题了。。至少我的问题解决了。




7         MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接
表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。





打酱油的人生,总得给自己找点事情。。具体的格式啥的以后再慢慢来吧,写下第一篇。以后慢慢来。。其实反正也没人看,。至是给自己一个提醒。

你可能感兴趣的:(每天技术 总结10.19 mybatis)