简单记录一下今天看的一些东西吧。具体的格式以后慢慢来吧。
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
测试代码:
@Test
public void dynamicForeachTest() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
List
ids.add(1);
ids.add(3);
ids.add(6);
List
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
2.单参数array数组的类型:
上述collection为array,对应的Mapper代码:
public List
对应的测试代码:
@Test
public void dynamicForeach2Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
int[] ids = new int[] {1,3,6,9};
List
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
3.自己把参数封装成Map的类型
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
public List
对应测试代码:
@Test
public void dynamicForeach3Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
final List
ids.add(1);
ids.add(2);
ids.add(3);
ids.add(6);
ids.add(7);
ids.add(9);
Map
params.put("ids", ids);
params.put("title", "中国");
List
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
上面的这一大段是直接的一个文章。。其实我看到的代码最直接的下面的这个解释,这个解释完美的解决了我的代码中的困惑。。。
情景:查询数据库中文章的相关文章 文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割
查询完一个文章后可以把tags字段构造为一个List
5 where set if 语句
抱歉。。。下面全部是粘贴的。。。
sql语句where条件中,需要一些安全判断,例如按性别检索,如果传入的参数是空的,此时查询出的结果很可能是空的,也许我们需要参数为空 时,是查出全部的信息。这是我们可以使用动态sql,增加一个判断,当参数不符合要求的时候,我们可以不去判断此查询条件。
下文均采用MySQL语法和函数(例如字符串链接函数CONCAT
if标签
一个很普通的查询:
Xml代码
[html] view plain copy
SELECT * from STUDENT_TBL ST
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
但是此时如果studentName是null或空字符串,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值
为null或等于空字符串,我们就不进行此条件的判断。
修改为:
Xml代码
[html] view plain copy
SELECT * from STUDENT_TBL ST
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
此时,当studentName的值为null或’’的时候,我们并不进行where条件的判断,所以当studentName值为null或’’值,不附带这
个条件,所以查询结果是全部。
由于参数是Java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。
代码中的where标签,请参考3.2.1.
Xml代码
[html] view plain copy
SELECT * from STUDENT_TBL ST
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
AND ST.STUDENT_SEX = #{studentSex}
AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
AND ST.CLASS_ID = #{classEntity.classID}
查询,姓名中有‘李’,男,生日在‘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
for( StudentEntity entityTemp : studentList){
System.out.println(entityTemp.toString());
}
where、set、trim标签
where
当if标签较多时,这样的组合可能会导致错误。例如,like姓名,等于指定性别等:
Xml代码
[html] view plain copy
SELECT * from STUDENT_TBL ST
WHERE
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
AND ST.STUDENT_SEX = #{studentSex}
如果上面例子,参数studentName为null或’’,则或导致此sql组合成“WHERE AND”之类的关键字多余的错误SQL。
这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。
此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
上面例子修改为:
Xml代码
[html] view plain copy
SELECT * from STUDENT_TBL ST
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
AND ST.STUDENT_SEX = #{studentSex}
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不能同时存在。
打酱油的人生,总得给自己找点事情。。具体的格式啥的以后再慢慢来吧,写下第一篇。以后慢慢来。。其实反正也没人看,。至是给自己一个提醒。