首页 > 其他分享 >Mybatis--进阶

Mybatis--进阶

时间:2023-08-13 16:22:38浏览次数:50  
标签:进阶 -- id Date user Mybatis println public

MyBatis--2.进阶

MyBatis的Dao层实现

传统开发方式

Dao中的接口类:

public interface UserMapper {
    public List<User> findAll() throws IOException;

}

Dao中接口的实现类:

public class UserMapperImpl implements UserMapper {
    @Override
    public List<User> findAll() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        return userList;
    }
}

再在其他类需要进行数据库操作时调用UserMapperImpl的findAll方法

代理开发方式

编写接口:

测试代理:

parameterType类型就按照正常类型,不按照泛型

至于不同的返回类型resulttype如何写需要按照泛型,参考:

mybatis的resultType_mybatis resulttype_beidaol的博客-CSDN博客

MyBatis映射文件深入

动态sql语句

动态sql字面意思就是传递参数不同sql语句动态变化

动态sql语句的重要表情发标签

  • if

    下面#{}用到的是传入参数的属性

        <select id="findAll" resultType="com.xxx.User" parameterType="com.xxx.User">
            select  * from user where  username=#{username} and password=#{password}
    --         判断如果id!=0执行后面的
            <if test="id!=0">
                and id=#{id}
            </if>
        </select>
    
  • choose(when,otherwise)

  • trim(where,set)

        <select id="findAll" resultType="com.xxx.User" parameterType="com.xxx.User">
            select  * from user
    --         和之前的where相同
            <where>
    --         判断如果id!=0执行后面的
            <if test="id!=0">
                and id=#{id}
            </if>
                <if test="password!=null">
                    and password=#{password}
                </if>
            </where>
        </select>
    
  • foreach

   
<select id="findAll" resultType="com.xxx.User" parameterType="list">
        select  * from user
        <where>
--         本处传递的是一个list,如果是数组参数collection为array,open表示以什么开始,
--             close表示以什么结束,item是变量负责接收集合的每一个
--             separator是封装符,通过它拼接使用的item;另外sql语句in和or类似
            <foreach collection="list" open="id in(" close=")" item="id" separator=","></foreach>
--             这就是item
             #{id}
        </where>
    </select>

sql片段的抽取

<!--    抽取-->
     <sql id="selectUser">select * from user </sql>
<!--    引入-->
    <select id="das">
        <include refid="selectUser"></include>
    </select>

MyBatis核心配置文件深入

typeHandlers标签

默认的类型转换器

当默认的转换器不符合需求时,我们使用该标签自定义转换器

开发步骤:

  1. 定义转换继承类BaseTypeHandler

  2. 覆盖四个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换为java的Type类型方法

    public class DateHandler extends BaseTypeHandler<Date> {
        //    将java类型转换成数据库需要的类型
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
            long time = date.getTime();
            preparedStatement.setLong(i,time);
    
        }
        // 数据库类型转java类型
        //String参数是要转换的字段名称
        //resultset是查询的结果集
        @Override
        public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
    //        获得结果集需要的数据(long)转换为date类型返回
            long aLong = resultSet.getLong(s);
            Date date = new Date(aLong);
            return date;
        }
        // 数据库类型转java类型
        @Override
        public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
            long aLong = resultSet.getLong(i);
            Date date = new Date(aLong);
            return date;
        }
        // 数据库类型转java类型
        @Override
        public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            long aLong = callableStatement.getLong(i);;
            Date date = new Date(aLong);
            return date;
        }
    
    }
    
  3. 在MyBatis核心配置文件中进行注册

    <!--    自定义类型处理器-->
        <typeHandlers>
            <typeHandler handler="com.xxx.handler.DateHandler"></typeHandler>
        </typeHandlers>
    
  4. 测试转换是否正确

plugins标签

开发步骤:

  1. 导入PageHelper的坐标

    <!--    导入通用PageHlper坐标-->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>3.7.5</version>
        </dependency>
        <dependency>
          <groupId>com.github.jsqlparser</groupId>
          <artifactId>jsqlparser</artifactId>
          <version>0.9.1</version>
        </dependency>
    
  2. 再mybatis核心配置文件中配置PageHelper插件

    <!--    配置分页助手插件-->
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageHelper">
    <!--            指定参数,指定数据库方言-->
                <property name="dialect" value="mysql"/>
            </plugin>
        </plugins>
    
  3. 测试分页数据获取

        public  void  test1() throws IOException {
    
    //        获取配置文件Resources是ibatis包下的
            InputStream resourceAsFile = Resources.getResourceAsStream("sqlMapConfig.xml");
    //        获得session工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsFile);
    //        获得session会话对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //        设置分页相关参数
            PageHelper.startPage(1,2);
    
            List<User> userList = mapper.findAll();
            for (User user : userList) {
                System.out.println(user);
            }
    //        获得与分页相关的参数
            PageInfo<User> pageInfo = new PageInfo<User>(userList);
            System.out.println("当前页:"+pageInfo.getPageNum());
            System.out.println("每页条数:"+pageInfo.getPageSize());
            System.out.println("总条数:"+pageInfo.getTotal());
            System.out.println("总页数:"+pageInfo.getPages());
            System.out.println("上一页:"+pageInfo.getPrePage());
            System.out.println("下一页:"+pageInfo.getNextPage());
            System.out.println("是否是第一个:"+pageInfo.isIsFirstPage());
            System.out.println("是否是最后一个:"+pageInfo.isIsLastPage());
    
    //        释放资源
            sqlSession.close();
        }
    

结果:

MyBatis的多表操作

一对一查询

第一种配置方式:

orders类:

public class Order {
    private  int id;
    private Date ordertime;
    private  double total;
    //当前订单属于那个用户
    private User user;
    其他get和set方法。。。
    }

映射文件中:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace命名空间-->
<mapper namespace="com.xxx.Mapper.OrderMapper">
    <resultMap id="orderMap" type="com.xxx.Order">
<!--        手动指定字段与实体属性的映射关系
            column:数据库字段名称
            property:实体属性名
            id:是主键-->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>
        <result column="birthday" property="user.birthday"></result>
    </resultMap>
<select id="findAll" resultMap="orderMap">
    select *,o.id oid from orders o,user u where o.uid=u.id
</select>
</mapper>

另外一种映射文件写法:

<resultMap id="orderMap" type="com.xxx.Order">
<!--        手动指定字段与实体属性的映射关系
            column:数据库字段名称
            property:实体属性名
            id:是主键-->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
<!--        两个参数:前者是order中的user属性,后者是属性类型-->
        <association property="user" javaType="com.xxx.User">
            <id column="uid" property="id"></id>
            <result column="username" property="username"></result>
            <result column="password" property="password"></result>
            <result column="birthday" property="birthday"></result>
        </association>
   

一对多

<resultMap id="userMap" type="user">
    <id column="uid" property="id"></id>
    <result column="username" property="username"></result>
    <result column="password" property="password"></result>
<!--    配置集合信息
        property类集合属性名称
        ofType当前集合的数据类型-->
    <collection property="orderList" ofType="order">
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
    </collection>

</resultMap>

其他和一对一查询类似

多对多

  <resultMap id="userRoleMap" type="user">
        <id column="userId" property="id"></id>
        <result column="username" property="username"></result>
<!--        user内部的roleList信息-->
        <collection property="roleList" ofType="role">
            <id column="role" property="id"></id>
            <result column="roleName" property="roleName"></result>

        </collection>
    </resultMap>
    <select id="findUserAndRoleAll" resultMap="userRoleMap">
        select  * from user u, sys_user_role ur,sys_role r where  u.id=ur.userId and ur.roleId = r.id
    </select>

自定义别名

核心配置文件

标签:进阶,--,id,Date,user,Mybatis,println,public
From: https://www.cnblogs.com/rainaftersummert/p/17626670.html

相关文章

  • AtCoder Beginner Contest 314 A - Ex题解
    AtCoderBeginnerContest314A-3.14嗯,你可以用string存小数点后的...B-Roulette对于每一个金额,用个vector存pair<>存一个人赌了多少,以及是哪一个人。C-RotateColoredSubsequence每种数用个双向链表记下来。D-LOWER我们观察到,对于2,3操作,只有最后一次有用,且......
  • ovn打通跨网段和同网段通信
    ovs缺陷1.ovs只能做二层转发,没有三层能力2.ovs没有高可用配置3.ovs配置无法随着虚机迁移和容器迁移而自动迁移安装ovs和ovnovn-northd通过unixsocket连上北向数据库和南向数据库,3者在同一台机器上。ovn-controler启动后自动创建br-int网桥。#通过yum安装ovs和ovn(省略)#......
  • Spring的事务控制
    Spring的事务控制编程式事务控制相关对象PlatformTransactionManager主要接口,下面主要讲它的实现类TransactionDefinition设置事务的隔离级别设置事务的传播行为TransactionStatus上面三者就是编程式事务控制的三大对象,不重要,后面才是关键基于XML的声明式事务控制......
  • 番茄工作法 All In One
    番茄工作法AllInOne番茄工作法(英语:PomodoroTechnique)是一种时间管理方法,在1980年代由FrancescoCirillo创立。该方法使用一个定时器来分割出一个一般为25分钟的工作时间和5分钟的休息时间,而那些时间段被称为pomodoros,为意大利语单词pomodoro(中文:番茄)。番茄工作法五个步骤......
  • Django实现文件上传、文件列表查看、修改、限流和日志记录1
    Django实现文件上传、文件列表查看、修改、限流和日志记录1上一章已经实现了文件的上传到项目的指定目录中,这章我们继续乘胜追击继续优化实现。一般都是上传文件到后端服务器上,因此需要建立一个远程服务器的连接,本章连接远程服务器实现文件上传实现点击上传本地文件到远程服务......
  • Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3
    UnityAssetPostprocessor的Model的动画相关的函数修改实际应用在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。其中,Model的动画相关的函数修改可以帮助我们在导入模型时自动修改动画相关的函数,从而提高我们的工作效率。本文将介绍如何使......
  • 微信小程序视图容器 swiper
    滑块视图容器。属性类型默认值必填说明最低版本属性类型默认值必填说明最低版本indicator-dotsbooleanfalse否是否显示面板指示点1.0.0indicator-colorcolorrgba(0,0,0,.3)否指示点颜色1.1.0indicator-active-colorcolor#000000否当前选中的指......
  • 【闲话】08.13.23
    08.13闲话这几天都好冷清啊,头图也取消罢(你推歌:Leta&可不《ぐるーみぃ》虽然不知道这个p主为啥要用平假名写英语,但是歌还挺可爱的。而且是这个p主的第一首歌,值得鼓励。可不真的很可爱。又被月赛薄纱了:没有学术,累了今天产9oc设定的时候查到脱口秀最开始可以溯源到18世纪英......
  • linux安装anaconda
    找到相应的版本:Anaconda与Python版本对应关系_笔记大全_设计学院(python100.com) 我下载的是3.6版本的python找到对应版本的下载链接:Indexof/(anaconda.com) (https://repo.anaconda.com/archive/Anaconda3-5.0.0-Linux-x86_64.sh)终端中输入  wgethttps://repo.ana......
  • 第五周总结
    周一:明确学习目标和资源准备本周的第一天,我将明确自己的学习目标,确定学习重点和方向。我计划阅读相关的大数据领域的书籍和文档,如《大数据导论》、《Hadoop权威指南》等,以了解各种大数据技术和工具的基本概念和应用场景。此外,我也会寻找一些在线学习资源和教程,如网课、博客和视频......