输出映射
输出简单类型
目的:我想知道一列中以haha开头的有几个
<!--COUNT(*) 函数返回在给定的选择中被选的行数。-->
<select id="queryCount" parameterType="string" resultType="int">
SELECT count(*) from tt_user WHERE username like #{name};
</select>
@Test
public void test8() throws IOException {
int haha1 = dao.queryCount("haha%");
System.out.println(haha1);
}
输出POJO对象&POJO列表
把一行数据映射到一个POJO对象中
- 解释起来略有点麻烦:(可以把这些细细碎碎的知识做成镜像放进脑袋存起来,下次用的时候加载就好了┭┮﹏┭┮)
给出一个正式的解释,需要查询的列名和映射的属性名一致。
你从SQL里边拿出来的东西,我们称他为零食堆,你用来存放这个零食堆的POJO类型,我们叫他一个包,如果这个包是原生类型(和SQL中属性一一对应的那个POJ类)(里面详细的记录了所有的零食种类[对应数据库属性])(我们叫他原生包),那么零食堆会完全保存这个原生类型的包中。你读这个包可以把零食全部读出来。
如果你新定义了一个POJO,并且用这个新包来存放零食堆,那么只有在新包中记录了零食堆中的零食种类的情况下,零食堆才会保存进新包中(有多少条零食种类保存进去多少零食),如果新包和原生包一条也不重合,那么读这个新包就会报NULL。新包强转旧包类型就会报错。
新包
public class Teacher {
//重合的一条
String username;
int tid;
}
...
- 旧包
public class User {
String id ;
//重合的一条
String username;
}
- sql 语句
<select id="findUserById" parameterType="int" resultType="com.bamzhy.bean.Teacher">
SELECT * FROM tt_user WHERE id=#{id};
</select>
结果:userById=Teacher{username=’haha3’, tid=0}
- 如果查询的sql的列名有别名,那么使用这个别名
<select id="findUserById" parameterType="int" resultType="com.bamzhy.bean.Teacher">
SELECT id as tid,username,password,email,age FROM tt_user WHERE id=#{id};
</select>
这个id的别名是tid,那么装包的时候可以把id以tid的名称装入进新包里头。
结果:userById=Teacher{username=’haha3’, tid=2}
输出映射是一个ResultMap
使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。但是需要声明一个resultMap,来对列名和属性名进行映射。
- 发现一个问题,从配置文件是整体被解析的,如果你更改了alias的对应信息,没有修改之前的代码,那么就会报错。
(提醒你不用的别瞎改,改完了不知道哪儿错最蛋疼)
<resultMap id="map1" type="com.bamzhy.bean.Haha1">
<id property="col0" column="id"/>
<result property="col1" column="username"/>
<result property="col2" column="password"/>
<result property="col3" column="email"/>
<result property="col4" column="age"/>
</resultMap>
<select id="findUserById2" parameterType="int" resultMap="map1">
SELECT id,username,password,email,age FROM tt_user WHERE id=#{id};
</select>
resultMap的type里填的POJO
package com.bamzhy.bean;
public class Haha1 {
@Override
public String toString() {
return "Haha1{" +
"col0='" + col0 + '\'' +
", col1='" + col1 + '\'' +
", col2='" + col2 + '\'' +
", col3='" + col3 + '\'' +
", col4='" + col4 + '\'' +
'}';
}
String col0;
String col1;
String col2;
String col3;
String col4;
}
Haha1{col0=’1’, col1=’haha1’, col2=’12345’, col3=’12345@qq.com’, col4=’19191019’}
- 值得一提的是ResultMap 里边自定义的id标签和properties定义的id有什么区别呢?
答案是:id标签可以作为唯一标识在缓存等其他方面使用。
动态SQL标签
Mybatis它提供了一些动态sql标签,可以让程序员更快的进行mybatis的开发,这些动态sql可以增强sql的可重用性及灵活性 ;
自动根据你传入的参数生成SQL语句。
< where>标签
<select id="findUserById2" parameterType="int" resultMap="map1">
SELECT id,username,password,email,age FROM tt_user
<where>
id=#{id}
</where>
</select>
< if test=” “>标签
- _parameter替代parameterType的int,表示刚输入的某个参数
if可以对输入的参数进行判断,而test可以指定表达式
<select id="findUserById" parameterType="int" resultType="user">
SELECT id as tid,username,password,email,age FROM tt_user
<where>
<if test="_parameter!=null">
id=#{id};
</if>
</where>
</select>
- 如果是输入POJO里的一个参数(id是user里边参数),直接用参数名就行,不用加POJO名
<select id="queryByMultiConditions" parameterType="user" resultType="user">
SELECT * FROM tt_user
<where>
<if test="id==1">
id like #{id};
</if>
</where>
</select>
< sql>片段
<sql id="instead">
<where>
<if test="id!=1">
id like #{id};
</if>
</where>
</sql>
<select id="queryByMultiConditions" parameterType="user" resultType="user">
SELECT * FROM tt_user
<include refid="instead"></include>
</select>
使用SQL片段,并且设置好id,在需要的地方使用< include refid=” 设置好的id”>,这样可以减少相同代码的数量。
for each遍历
-case1: 一个现成的数组 a{1,2,3}
<delete id="findUserById3">
DELETE FROM tt_user
<where>
<foreach collection="array" item="id">
OR id = #{id}
</foreach>
</where>
</delete>
@Test
public void test10() throws IOException {
int [] a={1,2,3};
dao.findUserById3(a);
}
- case 2:ArrayList[]
<delete id="findUserById3">
DELETE FROM tt_user
<where>
<foreach collection="list" item="id">
OR id = #{id}
</foreach>
</where>
</delete>
@Test
public void test10() throws IOException {
List<Integer> objects = new ArrayList<>();
objects.add(9);
dao.findUserById3(objects);
}
- case3 :POJO里的集合
public class VO {
ArrayList<Integer> ids;
}
<delete id="findUserById3" parameterType="com.bamzhy.bean.VO">
DELETE FROM tt_user
<where>
<foreach collection="ids" item="id">
OR id = #{id}
</foreach>
</where>
</delete>
@Test
public void test11(){
VO vo= new VO();
ArrayList<Integer> ids=new ArrayList<>();
ids.add(1);
ids.add(2);
vo.setIds(ids);
dao.findUserById3(vo);
}
- 里边的open,close是在循环语句前后加上你想加的内容,separater是遍历中加入的语句,
例如你要输入:
delete from tt_user where id=(1,2,3);
你可以输入
<delete id="findUserById3" parameterType="com.bamzhy.bean.VO">
DELETE FROM tt_user
<where>
id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</where>
</delete>