MyBatis学习03----增删改查--高级结果映射

本节知识点:

MyBatis 的SQL映射文件提供select、insert、 update、 delete 等元素来实现SQL语句的映射。

➢SQL 映射文件的根节点是mapper元素,需指定namespace来区别于其他的mapper,保证全局唯一,且其名称必须要跟接口同名,作用是绑定DAO接口,即面向接口编程。

SQL 映射文件的select的返回结果类型的映射可以使用resultMapresultType,但不能同时使用。

关于MyBatis的SQL语句参数入参,对于基础数据类型的参数数据,使用@Param注解实现参数入参;复杂数据类型的参数直接入参即可。

resultMap 的associationcollection可以实现高级结果映射。


目录

 

一、使用MyBatis实现条件查询

二、使用MyBatis实现增删改查操作

1、dao层接口

2、dao层SQL映射文件

3、测试

4、使用@Param注解实现多参数入参

三、使用resultMap实现高级结果映射

1、基本配置项

2、association映射(处理一对一关联关系)

3、collection映射(处理一对多关联关系)

 

四、resultMap自动映射级别和MyBatis缓存

1、自动映射级别

2、缓存


一、使用MyBatis实现条件查询

案例:https://blog.csdn.net/weixin_42661709/article/details/109717021

注意点:select的resultType/resultMap属性只能二选一

resultType属性直接表示返回类型,包括基础数据类型和复杂数据类型。

               (用resultType做自动映射时,字段名和POJO的属性名必须一致,不一致需要给字段起别名)

resultMap属性则是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上;

                 它的应用场景一般是:数据库字段信息与对象属性不一致,或者需要做复杂的联合查询以便自由控制映射结果。

                 引用示例如下:

<!--resultMap="userList" 这里就是引用的id为userList的resultMap-->
<select id="getUserList"  resultMap="userList" parameterType="User">
   select user.* from study_tests.user
</select>
<resultMap type="User" id="userList">
        <!--property是对象的属性名  column数据库里的字段(如这里的用户名就不一致)-->
        <result property="id" column="id"/>
        <result property="name" column="userName"/>
        <result property="password" column="password"/>
</resultMap>

 

 

二、使用MyBatis实现增删改查操作

insert 、 delete 、 update 均没有resultType属性,只有select操作需要对返回结果类型(resultType/resultMap)进行相应的指定

前面的配置工作(导包、核心配置,可参考MyBatis学习01)完成后,增删改查操作都是先写好接口,然后根据接口  再在mapper映射文件里写好对应的select、insert 、 delete 、 update 操作,最后进行测试,下面是在MyBatis学习01代码基础上新增的核心代码:

1、dao层接口

package dao;

import entity.User;

        import java.util.List;

/**
 * 增删改查接口
 */
public interface UserDao {
    List<User> getUserList();

    public int addUser(User user);

    public int deleteUserById(int id);

    public int updateUser(User user);
}

2、dao层SQL映射文件

<?xml version="1.0" encoding="UTF-8" ?>

<!--这个mapper就相当于以前的接口实现类-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--这里写对应接口类    -->
<mapper namespace="dao.UserDao">
    <!--这里写实现的接口下的哪一个方法,以及返回的类型,并写出需要执行的sql语句-->
    <select id="getUserList" resultType="entity.User">
    select * from study_tests.user
    </select>

    <!--新增insert操作,parameterType对应接口接受的参数类型-->
    <insert id="addUser" parameterType="entity.User">
        insert into study_tests.user (id,username,password) values (#{id},#{username},#{password})
    </insert>

    <!--新增delete操作-->
    <delete id="deleteUserById" parameterType="int">
        delete from study_tests.user where id=#{id}
    </delete>

    <!--新增update操作-->
    <update id="updateUser" parameterType="entity.User">
        update study_tests.user
        set username=#{username},password=#{password}
        where id=#{id}
    </update>

</mapper>

3、测试

注意:
 每次执行删改查之后,sqlSession都commit()一下,这样数据库里数据才会同步, 最后执行完操作后记得close()关闭 sqlSession

package dao;

import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;

import java.util.List;

public class UserDaoTest {
    @Test//需要导入junit包才可以用
    public void test() {
        //3.使用工厂生产SqlSession对象  (接着工具类的语句)
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //4.使用SqlSession创建Dao接口的代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        //5.使用代理对象userDao执行方法
        /**测试insert操作
         User newUser = new User();
         newUser.setId(3);
         newUser.setUsername("韩信");
         newUser.setPassword("789");
         userDao.addUser(newUser);
         sqlSession.commit();
         */

        /**测试delete操作
         userDao.deleteUserById(2);
         sqlSession.commit();
         */

        /**测试update操作
         User oldUser = new User();
         oldUser.setId(3);
         oldUser.setUsername("李白");
         oldUser.setPassword("7893");
         userDao.updateUser(oldUser);
         sqlSession.commit();
         */

        /*测试select操作*/
        List<User> userList = userDao.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }

        //关闭
        sqlSession.close();
    }
}

原始数据库里:

查询:

新增3号:

删除2号:

修改3号韩信名字为李白,密码改为7893:

4、使用@Param注解实现多参数入参

@Para注解参数,适合只修改部分字段值情况下部分做入参 ,就不用像上面的update操作得封装成整个User做入参

下面是只修改用户密码的接口、映射、测试对应的核心代码:

//下面的@Param("password") String psw相当于将参数psw重命名为password 
public int updatePassword(@Param("username") String username,@Param("password") String psw);
<!--使用@Para注解实现多参数入参,这里仅根据用户名修改当前用户密码-->
    <update id="updatePassword">
        update study_tests.user
        set password=#{password}
        where username=#{username}
    </update>
        //测试使用@Para注解进行修改用户密码
        userDao.updatePassword("赵云","101");
        sqlSession.commit();

三、使用resultMap实现高级结果映射

1、基本配置项

resultMap的属性:

子节点:

下面主要学习association和collection

2、association映射(处理一对一关联关系)

比如JavaBean里头内嵌JavaBean的情况

3、collection映射(处理一对多关联关系)

比如JavaBean里头内嵌集合的情况

 

四、resultMap自动映射级别和MyBatis缓存

1、自动映射级别

➢NONE:禁止自动匹配

➢PARTIAL(默认):自动匹配 除了内部嵌套 的所有属性

➢FULL:自动匹配所有

例如mybatis-config.xml设置如下:

<setting>
<!--自动映射级别设置为FULL-->
        <setting name="autoMappingBehavior" value="FULL"/>
 </setting>

2、缓存

mybatis提供一级缓存和二级缓存的支持,一级缓存SQL语句,二级缓存结果对象。

一级缓存:mybatis自带的基于PerpetualCache的HashMap本地缓存,作用范围为session域内,session被flush或close之后,该session内的所有cache就会被清空。

二级缓存:global caching,超出session范围,可被所有SqlSession共享(针对mapper的namespace而言),开启只需在mybatis-config.xml中设置如下:

<setting>
        <setting name="cacheEnabled" value="true"/>
 </setting>

然后在mapper映射文件中设置缓存,如:

<mapper namespace="dao.user.UserMapper">
        <cache
                eviction="FIFO"
                flushInterval="60000"
                size="512"
                readOnly="true"/>
......
 </mapper>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值