11.03Mybatis标签

标签内容

  • select标签
  • insert标签
  • update标签
  • delete标签

标签的含义:

  1. 标签定义了SQL语句是查询、修改等操作。
  2. 定义了Mapper接口当中方法的返回值类型
  3. 定义了Mapper接口中的参数类型

Mybatis的组合工作流程:

  • .xml文件--->定义SQL语句、接口调用方法的返回值、参数类型
  • 接口--->定义可执行的方法和接收接口的对象
  • 实现类--->三步走--->SqlSessionFactory接口获取配置文件(全局的Mybatis配置文件)、SqlSession获取接口、调用接口当中的方法

select标签

select示例:

<select id="selectAllWebsite" resulType="com.junkingboy.bean.website" parameterType="string">
    SELECT id, name, url FROM website WHERE `name` LIKE CONCAT('%', #{name}, '%');
</select>

说明:

  • idselectAllWebsite的映射语句
  • 参数类型为string
  • 返回值类型为指定路径下的JavaBean对象

注意:

  • 为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对 MySQL 数据库和 JavaBean 采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。
  • mybatis中使用#{参数名}进行参数传递。对于JDBC会被标识为?
String sql = "SELECT id, name, url FROM website WHERE `name` LIKE CONCAT('%', ?, '%')";
Pre
select标签常用属性

属性名称

描 述

备注

id

它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用

如果命名空间+id不唯一,那么 MyBatis 抛出异常

parameterType

表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数

支持基本数据类型和 JavaBean、Map 等复杂数据类型

resultType

SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一

-

resultMap

它是映射集的引用,与 <resultMap>resultTyperesultMap 之一

是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等

flushCache

用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存

默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存

useCache

启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中

-

timeout

用于设置超时参数,单位是秒(s),超时将抛出异常

-

fetchSize

获取记录的总条数设定

默认值是数据库厂商提供的 JDBC 驱动所设置的条数

statementType

告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement)--->通常定义为PreparedStatement

-

resultSetType

这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新)

-

上述是传递一个参数进行查询。如果需要查询多个字段则有三种实现方法:

  • 使用Map传递参数
  • 使用注解传递参数
  • 使用JavaBean传递参数
使用Map传递参数

Mybatis框架:

<!--根据name和url进行模糊查询-->
<select id="selectWebsiteByMap" resultType="com.junkingboy.bean.website" paramterType="map">
    SELECT id, name, url FROM website
    WHERE name LIKE CONCAT('%', #{name}, '%')
    AND url LIKE CONCAT('%', #{url}, '%');
</select>

WebsiteMapper接口:

public List<Website> selectWebsiteByMap(Map<String, String> params);

测试方法:

@Test
    public void testGetInformationByName() {
        Map<String, String> paramsMap = new HashMap<String, String>();

        /*添加参数*/
        paramsMap.put("name", "你好");
        paramsMap.put("url", "junkingboy.com");

        /*调用方法传递参数*/
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("xml/mybatis-config.xml");
        }catch (Exception e) {
            e.printStackTrace();
        }
        //加载配置文件
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
        //打开连接
        SqlSession ss = ssf.openSession();
        //获取websiteMapper接口当中的方法
        WebsiteMapper wm = ss.getMapper(WebsiteMapper.class);
        //执行方法获取结果集
        List<Website> websiteList = wm.selectWebsiteByName(paramsMap);

        //打印结果集
        for (Website wb :
                websiteList) {
            System.out.println(wb);
        }

        //提交事务、关闭资源
        ss.commit();
        ss.close();
    }
使用注解传递参数

使用Mybatis的注解@Param()传递参数:

<!--使用Mybatis的注解进行参数传递-->
    <select id="selectWebsiteByAn" resultType="com.junkingboy.bean.Website">
        SELECT id, name, url FROM javawebtest.website
        WHERE name LIKE CONCAT('%', #{name}, '%')
        AND url LIKE CONCAT('%', #{url}, '%');
    </select>

WebsiteMapper接口:

/*使用注解的方式通过WebsiteMapper接口发送SQL语句*/
    public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);
//@Param注解传递字段(对应的查询字段)、参数类型、参数名
//把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数
/*
如果参数过多就会导致代码过于复杂
*/
使用JavaBean传递参数

Mybatis

<!--使用JavaBean对象进行参数传递-->
    <select id="selectWebsiteByBean" resultType="com.junkingboy.bean.Website">
        SELECT id, name, url FROM javawebtest.website
        WHERE name LIKE CONCAT('%', #{name}, '%')
          AND url LIKE CONCAT('%', #{url}, '%');
    </select>

websiteMapper接口:

/*使用JavaBean对象传递参数*/
    public List<Website> selectWebsiteByBean(Website website);

测试方法:

@Test
    public void tesgGetInformationByBean() {
        //创建对象
        Website site = new Website();
        site.setName("你好");
        site.setUrl("junkingboy.com");

        /*调用方法传递参数*/
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("xml/mybatis-config.xml");
        }catch (Exception e) {
            e.printStackTrace();
        }
        //加载配置文件
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
        //打开连接
        SqlSession ss = ssf.openSession();
        //获取websiteMapper接口当中的方法
        WebsiteMapper wm = ss.getMapper(WebsiteMapper.class);
        //执行接口中的方法获取结果集
        List<Website> websiteList = wm.selectWebsiteByBean(site);

        //打印结果集
        for (Website ws :
                websiteList) {
            System.out.println(ws);
        }

        //提交事务
        ss.commit();
        //关闭资源
        ss.close();
    }

注意:

  • 实际应用中不会采用Map的方式进行参数传递,因为会丧失业务可读性,导致后续代码难以扩展和维护。
  • 参数个数<=5使用注解传参
  • 参数个数>5使用JavaBean对象进行传参

insert标签

insert示例:

<!--插入操作-->
    <insert id="addWebsite" parameterType="string">
        INSERT INTO javawebtest.website(name)
        VALUES(#{name});
    </insert>

WebsiteMapper接口定义:

/*参数为 Sting 类型的字符串;返回值为 int 类型*/
    /*定义插入操作*/
    public int addWebsite(String name);

测试方法:

@Test
    public void testInsertInformation() {
        String name = "帅气俊";
        /*调用方法传递参数*/
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("xml/mybatis-config.xml");
        }catch (Exception e) {
            e.printStackTrace();
        }
        //加载配置文件
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
        //打开连接
        SqlSession ss = ssf.openSession();
        //获取websiteMapper接口当中的方法
        WebsiteMapper wm = ss.getMapper(WebsiteMapper.class);
        //执行接口中的方法获取结果集
        int i = wm.addWebsite(name);
        System.out.println("共插入了" + i + "条数据!");
    }
insert标签常用属性

属性名称

描述

备注

id

它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用

如果命名空间+ id 不唯一,那么 MyBatis 抛出异常

parameterType

传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。

支持基本数据类型和 JavaBean、Map 等复杂数据类型

keyProperty

将插入操作的返回值赋给 PO 类的某个属性,通常为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。

-

useGeneratedKe

设置是否使用 JDBC 提供的 getGenereatedKeys() 方法,获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。

该属性值设置为 true 后,会将数据库生成的主键回填到请求对象中,以供其他业务使用。

flushCache

该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。

-

timeout

该属性用于设置执行该操作的最大时限,如果超时,就抛异常。

-

databaseId

取值范围 oracle、mysql 等,表示数据库厂家;元素内部可通过 <if test="_databaseId = 'oracle'"> 来为特定数据库指定不同的 sql 语句。

MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。

keyColumn

设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。

-

insert标签传递参数的方式

insert标签传递参数的方式和select标签传递参数方式一样。不做过多的赘述

主键自动回填

功能描述:

将刚刚生成的主键回填到请求对象当中。

使用属性:

keyProperty

useGeneratedKeys

WebsiteMapper.xml示例:

<!--添加一个网站信息,回填主键值给id属性-->
    <insert id="addWebsite" parameterType="com.junkingboy.bean.Website" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO javawebtest.website(name, url)
        VALUES(#{name}, #{url});
    </insert>

WebsiteMapper接口:

/*添加网站信息*/
    public int addWebsite(Object object);

测试方法:

@Test
    public void testInsertInformationGetId() {
        /*接口方法为传递一个Object对象*/
        Website site = new Website();
        site.setName("Lucifer");
        site.setAge(22);
        site.setCountry("Chinese");
        site.setUrl("junkingboy.com");

        //执行插入
        /*调用方法传递参数*/
        InputStream is = null;
        SqlSessionFactory ssf = null;
        SqlSession ss = null;
        WebsiteMapper wm = null;
        try {
            is = Resources.getResourceAsStream("xml/mybatis-config.xml");
        }catch (Exception e) {
            e.printStackTrace();
        }
        try {
            //加载配置文件
            ssf = new SqlSessionFactoryBuilder().build(is);
            //打开连接
            ss = ssf.openSession();
            //获取websiteMapper接口当中的方法
            wm = ss.getMapper(WebsiteMapper.class);
            //执行接口中的方法获取结果集
            int num = wm.addWebsite(site);
            System.out.println("添加了" + num + "条记录!");
            System.out.println("回填的主键为:" + site.getId());
        }catch (Exception e) {
            /*回滚数据*/
            ss.rollback();
            e.printStackTrace();
        }
    }
自定义主键

场景:

针对数据库不支持自动递增主键或者取消了主键自动递增的规则的情况

使用属性:

<selectKey>

示例xml

添加一个网站,#{name}com.junkongboy.bean.Website 的属性值

<!--插入一个网站数据,#{name}为其属性值-->
    <insert id="insertWebsite" parameterType="com.junkingboy.bean.Website">
        <!--先使用selectKey标签定义属性,再定义sql-->
        <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
            SELECT if(max(id) is null, 1, max(id) + 1) as newId
            FROM javawebtest.website;
        </selectKey>
        INSERT INTO javawebtest.website(id, name, url)
        VALUES(#{id}, #{name}, #{url});
    </insert>

<selectKey>标签属性说明:

  • keyProperty:指定主键值对应的Bean类的属性
  • order:
  • BEFORE:表示先执行<selectKey>标签内的语句,再执行插入语句。
  • AFTER:表示先执行插入语句,再执行<selectKey>标签内的语句。

update标签

update示例:

<!--修改一个网站的数据-->
    <update id="updateWebsite" parameterType="string">
        UPDATE javawebtest.website SET name = #{name};
    </update>

WebsiteMapper接口方法:

/*修改网站信息*/
    int updateWebsite(String name);

测试方法:

@Test
    public void testUpdateInformation() {
        String name = "帅气俊";

        //获取WebsiteMapper接口当中的方法
        InputStream is = null;
        SqlSessionFactory ssf = null;
        SqlSession ss = null;
        WebsiteMapper wm = null;
        try {
            is = Resources.getResourceAsStream("xml/mybatis-config.xml");
        }catch (Exception e) {
            e.printStackTrace();
        }
        try {
            //加载配置文件
            ssf = new SqlSessionFactoryBuilder().build(is);
            //打开连接
            ss = ssf.openSession();
            //获取WebsiteMapper接口当中的方法
            wm = ss.getMapper(WebsiteMapper.class);
            /*
            getMapper是一个泛型方法,获取到WebsiteMapper的泛型
             */
            //执行方法
            int i = wm.updateWebsite(name);
            System.out.println("修改了" + i + "条数据!");
        }catch (Exception e) {
            /*数据回滚*/
            ss.rollback();
            e.printStackTrace();
        }
    }
update标签常用属性

属性名称

描述

备注

id

它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用

如果命名空间+ id 不唯一,那么 MyBatis 抛出异常

parameterType

传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。

支持基本数据类型和 JavaBean、Map 等复杂数据类型

flushCache

该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。

-

timeout

该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。

-

statementType

执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。

-

update标签传递参数的方式

update标签传递参数的方式和select标签传递参数方式一样。

delete标签

delete标签示例:

<!--删除一个正规的网站-->
    <delete id="deleteWebsite" parameterType="string">
        DELETE FROM javawebtest.website
        WHERE name = #{name};
    </delete>

WebsiteMapper接口内容:

/*删除网站信息*/
    int deleteWebsite(String name);

方法测试类:

@Test
    public void testDeleteInformation() {
        String name = "帅气俊";

        //获取WebsiteMapper接口当中的方法
        InputStream is = null;
        SqlSessionFactory ssf = null;
        SqlSession ss = null;
        WebsiteMapper wm = null;
        try {
            is = Resources.getResourceAsStream("xml/mybatis-config.xml");
        }catch (Exception e) {
            e.printStackTrace();
        }
        try {
            //加载配置文件
            ssf = new SqlSessionFactoryBuilder().build(is);
            //打开连接
            ss = ssf.openSession();
            //获取WebsiteMapper接口当中的方法
            wm = ss.getMapper(WebsiteMapper.class);
            /*
            getMapper是一个泛型方法,获取到WebsiteMapper的泛型
             */
            //执行方法
            int i = wm.deleteWebsite(name);
            System.out.println("删除了" + i + "条数据!");
        }catch (Exception e) {
            /*数据回滚*/
            ss.rollback();
            e.printStackTrace();
        }
    }
delete标签常用属性

属性名称

描述

备注

id

它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用

如果命名空间+ id 不唯一,那么 MyBatis 抛出异常

parameterType

传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。

支持基本数据类型和 JavaBean、Map 等复杂数据类型

flushCache

该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。

-

timeout

该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。

-

statementType

执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。

-

delete标签传递参数的方式

delete标签传递参数的方式和select标签传递参数方式一样。