MyBatis主配置文件&映射配置文件的配置 Ⅱ

输出映射

输出简单类型

目的:我想知道一列中以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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个优秀的 ORM 框架,提供了许多方便的配置和使用方式。下面是一个简单的 MyBatis 配置文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> ``` 其中,`environments` 元素定义了环境,可以包含多个环境,通过 `default` 属性指定默认环境。`environment` 元素定义了环境的具体配置,包括事务管理器和数据源。在上面的示例中,使用了 `JDBC` 类型的事务管理器和 `POOLED` 类型的数据源。 `mappers` 元素定义了映射器,可以包含多个映射器,通过 `resource` 属性指定映射器文件的路径。在上面的示例中,使用了 `com.example.mapper.UserMapper.xml` 文件作为映射器。 如果在配置文件中出现错误,MyBatis 会在启动时抛出异常。常见的错误包括: - `org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration`:XML 文件格式错误或者 MyBatis 版本不兼容。 - `org.apache.ibatis.exceptions.PersistenceException: Error getting driver instance for jdbc driver`:数据库驱动类名错误或者数据库驱动未加载。 - `org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)`:映射器文件的路径错误或者映射器文件中的语句 ID 错误。 这些错误都可以通过仔细检查配置文件和相关代码来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值