javaee之Mybatis2

news2024/9/23 9:22:53

一、保存操作

在做这个方法之前,我们先把之前做的那个MybatisTest里面的每一个方法做成一个Test方法,也就是标注@Test这个注解

这样便于我们测试接下来的每一个方法。仔细分析一下上面的代码,会发现,可重复性的地方太多。比如我们如果要测试保存方法testSave()这个方法,那么又要复写如下代码

 先拿出一些全局变量出来

这些变量拿出来是因为后面资源需要释放和提提交

先做成一个初始化的工作

 

 再来做一个销毁工作,也就是测试方法之后会执行的工作

此时的testFindAll方法就会变得非常简洁

下面开始来测试保存方法testSave()方法

 

先去IUserDao.xml文件里面的<mapper>标签配置一下

 

 去数据库里面看一下

 

数据插入

 二、更新操作

 然后去IUserDao.xml中配置一下更新这个操作

 然后去添加一个测试方法

 去数据库里面看一下修改信息

下面我们在做一个删除操作

 

然后去IUserDao.xml里面配置一下deleteUser方法

 然后去添加测试方法

 

很明显49这个id的数据就没了

三、 查询一个和模糊查询

先去IUserDao.java添加

再去IUserDao.xml配置一下这个方法

 然后再去添加一个测试方法

打印信息

 

下面做一个模糊查询

 

然后去配置mapper

 

去test类里面添加方法

 

 运行结果:

 下面来说,查询返回一行一列和占位符分析

来获取一下总记录数

然后去IUserDao.xml去配置mapper

 

 然后去test里面添加方法

 

 运行

四、下面来说一些操作细节问题

下面说一下获取保存数据的id问题

先来说说一下数据库中的一个函数操作

 这个函数能得到一张表最后插入数据的id值

上面为什么就是会显示0呢,就是因为目前没有数据插入,你只有插入一条数据之后,子啊调用这个函数就会得到一个最新的插入id

 那我们去到IUserDao.xml中做一些配置,就是配置一下这个函数的用法

 然后去testSave中看一下情况

 运行结果:

五、使用实体类的包装对象作为查询条件

下面先来说一个OGNL表达式

 那如果我们传入的参数类型是一个对象呢?

那我们去IUserDao中实现一个方法

 这个时候我们需要一个QueryVo这个类

QueryVo.java

package com.pxx.domain;

public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

下面我们去配置一下IUserDao.xml文件

 下面我们去Test类里面用一下

 查询结果:

 六、调整实体类属性解决增和改方法的报错

在我们设计实体类的时候,要求的是实体类中的属性与数据库中表的属性保持一致,那么如果是不一致的情况呢

那么现在先去修改一下User类,改成与数据库中的数据字段不一致的情况

User.java

package com.pxx.domain;

import java.util.Date;

public class User {
    private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userAddress='" + userAddress + '\'' +
                ", userSex='" + userSex + '\'' +
                ", userBirthday=" + userBirthday +
                '}';
    }
}

然后去修改一下test文件,其实就是修改一下set字段

package com.pxx.test;

import com.pxx.dao.IUserDao;
import com.pxx.domain.QueryVo;
import com.pxx.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class MybatisTest {

    //把这些变量先全部做成全局变量
    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before
    public void init() throws IOException {
        //1.读取配置文件
        //这个Resources是Mytais给我们提供的一个类,直接加载资源文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象,这个可以理解为dao的实现类
        sqlSession = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After
    public void destroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }

    @Test
    public void testFindAll() throws IOException {

        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void testSave() {
        //把对象的数据给封装到数据库里面
        User user = new User();
        user.setUserName("张三丰");
        user.setUserAddress("河南");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        System.out.println(user);
        userDao.saveUser(user);
        System.out.println(user);
    }

    @Test
    public void testUpdate() {
        User user = new User();
        user.setUserId(49);//这个是存在数据库中的一个字段
        user.setUserName("zhoujielun");
        user.setUserAddress("天津");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        userDao.updateUser(user);
    }

    @Test
    public void testDelete() {

       userDao.deleteUser(48);

    }

    @Test
    public void testFindOne() {
        User user = userDao.findById(46);
        System.out.println(user);
    }


    /**
     * 模糊查询操作
     */
    @Test
    public void testFindByName() {
        //执行一个查询方法
        List<User> users = userDao.findByName("%王%");
        System.out.println(users);
    }

    /**
     * 查询总记录条数
     */
    @Test
    public void testFindTotal() {
        //执行一个查询方法
       int count  = userDao.findTotal();
        System.out.println(count);
    }

    /**
     * 测试使用QueryVo作为查询条件
     */
    @Test
    public void testFindByVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName("%王%");
        vo.setUser(user);
        //5.执行查询一个方法
        List<User> users = userDao.findUserByVo(vo);
        for(User u : users){
            System.out.println(u);
        }
    }
}

修改一下IUserDao.xml配置

<?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">

<!--配置每一个相应dao层的方法,写上相应dao的全类名-->
<mapper namespace="com.pxx.dao.IUserDao">
    <!--Id代表方法名称 resultType:代表值类型
    这里写上它的全类名 -->
    <select id="findAll" resultType="com.pxx.domain.User">
        select * from user
    </select>

    <!--保存用户信息就不是select语句了
    而是insert语句-->
    <insert id="saveUser" parameterType="com.pxx.domain.User">
        <!--配置插入操作之后,获取插入数据的id-->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>

    <!--这里更新操作就是update-->
    <update id="updateUser" parameterType="com.pxx.domain.User">
        update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId}
    </update>

    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <!--根据id查询用户的方法,又是查询操作-->
    <select id="findById" parameterType="java.lang.Integer" resultType="com.pxx.domain.User">
        select * from user where id=#{id}
    </select>

    <!--根据名称进行模糊查询操作
    但是模糊查询中like %名字% 中的这个百分号在在这里面体现不出来
    -->
    <select id="findByName" parameterType="string" resultType="com.pxx.domain.User">
        select * from user where username like #{username}
    </select>

    <!--查询用户总记录数-->
    <select id="findTotal" resultType="int" >
        select count(id) from user
    </select>

    <!--根据queryVo的条件查询用户-->
    <select id="findUserByVo" parameterType="com.pxx.domain.QueryVo" resultType="com.pxx.domain.User">
        select * from user where username like #{user.userName}
    </select>
</mapper>

上面修改之后,去测试test里面的方法,发现除了增,删,改能正常使用之外,查找方法都会出现一些问题

上面数据除了username之外,都封装不进去,而为什么username给封装进去了,去看看数据库里面的字段

 

是因为mysql在进行数据字段封装的时候,不考虑大小写,也就是说username与userName的用法是一样的。

下面我们就要去解决这个问题

想办法让Mybatis都匹配上

方法1:给数据库每一个查询字段取一个别名

查询结果:

 方法2:在IUserDao.xml中配置查询结果列名与实体属性列名大的对应关系

当我们配置了上面的对应类型之后,下面配置resultType类型就没用了,而是要用resultMap来做

 

上面就会有一些影响效率,但是方便

 下面直接上IUserDao.xml

<?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">

<!--配置每一个相应dao层的方法,写上相应dao的全类名-->
<mapper namespace="com.pxx.dao.IUserDao">
    <!--配置查询结果的列名和实体类的属性名对应的关系-->
    <resultMap id="userMap" type="com.pxx.domain.User">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!--非主键字段的对应-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>
    <!--Id代表方法名称 resultType:代表值类型
    这里写上它的全类名 -->
    <!--<select id="findAll" resultType="com.pxx.domain.User">-->
    <select id="findAll" resultMap="userMap">
       select * from user
       <!-- select id as userId,username as userName,address as userAddress,
       sex as userSex,birthday as userBirthday from user-->
    </select>

    <!--保存用户信息就不是select语句了
    而是insert语句-->
    <insert id="saveUser" parameterType="com.pxx.domain.User">
        <!--配置插入操作之后,获取插入数据的id-->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>

    <!--这里更新操作就是update-->
    <update id="updateUser" parameterType="com.pxx.domain.User">
        update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId}
    </update>

    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <!--根据id查询用户的方法,又是查询操作-->
    <select id="findById" parameterType="java.lang.Integer" resultMap="userMap">
        select * from user where id=#{id}
    </select>

    <!--根据名称进行模糊查询操作
    但是模糊查询中like %名字% 中的这个百分号在在这里面体现不出来
    -->
    <select id="findByName" parameterType="string" resultMap="userMap">
        select * from user where username like #{username}
    </select>

    <!--查询用户总记录数-->
    <select id="findTotal" resultType="int" >
        select count(id) from user
    </select>

    <!--根据queryVo的条件查询用户-->
    <select id="findUserByVo" parameterType="com.pxx.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.userName}
    </select>
</mapper>

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两台linux服务器rsync自动备份文件

检查rsycn是否安装 检查方法&#xff1a;rpm -qa rsync 出现rsync 包名就是安装了 安装rsycn rsync的安装可以使用yum直接安装&#xff1a;yum install rsync rsycn的服务端/文件接收端配置 1、先创建备份目录 mkdir /data/xsbak2、服务端需要开启rsyncd服务&#xff0c;添加…

接口测试(九)—— Git代码托管、jenkins 的持续集成

目录 一、持续集成 二、git 1、简介和安装 2、Gitee 2.1 git 和 gitee 管理代码工作原理 2.2 PyCharm 配置 Gitee 插件 3、PyCharm 与 Gitee 相关操作 3.1 将 Gitee的项目 Checkout到 Pycharm中 3.2 推送 PyCharm 新项目到 Gitee远程仓库 3.3 将 Pycharm代码 push到 …

React基础知识(组件实例三大核心属性state、props、refs)(二)

系列文章目录 第一章&#xff1a;React基础知识&#xff08;React基本使用、JSX语法、React模块化与组件化&#xff09;&#xff08;一&#xff09; 文章目录系列文章目录一、State1.1. state基本使用1.2 state的简写形式二、Props2.1 props的基本使用2.2 props属性值限制2.3 …

精品基于SSM的小学生课程资源网络云平台

《基于SSM的小学生课程资源网络云平台》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据…

redux

文章目录redux是什么redux使用情况redux工作原理redux安装redux的3个核心概念Action——形成动作Reducers——操作状态store——存储状态APIredux的响应式redux实现加减案例不使用ActionCreators实现使用ActionCreators实现异步Actionreact-redux使用容器组件创建修改App.jsx在…

干电池升压IC3.3V的电源芯片fs2111/FS2112

干电池升压3.3V的电源芯片FS2111/FS2112 FS2111/FS2112适用于一节干电池升压到3.3V&#xff0c;两节干电池升压3.3V的升压电路&#xff0c;FS2111/FS2112干电池升压IC。 FS2111/FS2112 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试&#xff1a; F…

CubeMax添加Rtthread操作系统 组件STM32F103

CubeMax添加Rtthread操作系统 组件STM32F103 本篇主要介绍&#xff0c;怎么使用STM32CubeMx工具&#xff0c;添加RT-Thread操作系统组件&#xff0c;码代码的IDE是keil。快速移植RT-Thread实时操作系统&#xff0c;所用的IDE可自行官网下载最新版。 CubeMax官网下载链接 RTthre…

Ajax(六)

1. XMLHttpRequest的基本使用——URL编码与解码 1.1 什么是URL编码 1.2 如何对URL进行编码与解码 <body><script>var str 黑马程序员//对str编码var str2 encodeURI(str)console.log(str2)//一个汉字对应三个百分号&#xff0c;反解码从console里头复制console.…

js解决单线程之路 - worker的使用分析

写在前面 今天写一个关于实现多线程的东西&#xff0c;都知道js是一个单线程的语言&#xff0c;所谓的单线程就是一次只能做一件事&#xff0c;多线程就是一次可以做很多件事&#xff0c;当然目前我们的电脑等设备很少会有单线程了&#xff0c;比如我们的电脑一般都是标的6核12…

stm32f103zet6的GPIO基础知识

IO数量 16*7112个&#xff0c;GPIOA~GPIOG7组,共144个引脚 IO模式 很多IO口既可以做为输入&#xff0c;也可以做为输出 输入模式 VSS指的是地&#xff0c;VDD是高电平&#xff0c; MOS英文全称为Metal-Oxide-Semiconductor。 意思为金属-氧化物-半导体&#xff0c;而拥有这…

Python画一棵茂盛的分形树

文章目录前情回顾添加分岔茂盛的分形树前情回顾 上次画了一棵分形树&#xff1a;用Python画一棵分形树&#xff0c;得到的图如下 发现看的人还是挺多的&#xff0c;但没什么人点赞&#xff0c;这说明我能给大家画分形树&#xff0c;大家很高兴&#xff0c;但这棵树太秃了&…

[附源码]Python计算机毕业设计调查问卷及调查数据统计系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

在Ubuntu上搭建Nexus服务

介绍 Nexus&#xff1a;Nexus 是一个强大的 Maven 仓库管理器&#xff0c;它极大地简化了自己内部仓库的维护和外部仓库的访问。如Android远程仓库依赖&#xff0c;Java服务端应用程序依赖等&#xff0c;都很方便。 Docker方式 准备 ubuntu上已经安装docker&#xff0c;docker安…

20221218解决在Ubuntu18.04下编译Firefly的Core-3588J出现lz4的问题

20221218解决在Ubuntu18.04下编译Firefly的Core-3588J出现lz4的问题 2022/12/18 15:37 解决方法&#xff1a;编译最新的lz4的dev分支&#xff01; https://wiki.t-firefly.com/zh_CN/Core-3588J/android_compile_android12.0_firmware.html Core-3588J产品规格书 3. 编译 Andro…

Bootstrap5 小工具

Bootstrap 5 提供了很多有用的类来帮组我们快速实现效果&#xff0c;不需要重复写一些 CSS 代码。 背景颜色 设置不同元素的背景颜色时&#xff0c;需要通过 .text-* 类来设置匹配的文本颜色&#xff1a; 实例 <div class"p-3 mb-2 bg-primary text-white">.…

跟老韩学JAVA——IDEA基本使用和快捷键

1. IDEA介绍 2.IDEA下载和安装 这个博主的下载安装介绍的很详细了&#xff0c;我就不过多介绍了 3.IDEA的基本使用 1&#xff09;修改字体大小 File -> Settings -> Editor -> Font -> Size 2)修改字体变粗 3)修改背景颜色 4) 修改菜单栏字体大小 5&#xff…

滑动窗口思想练习题

文章目录1. 找到字符串中所有字母异位词做法一&#xff1a;采用两个数组分别记录字符出现频次做法二&#xff1a;采用diff记录s和p字符串中字符的频次差2. 串联所有单词的子串个人理解&#xff0c;如有异议&#xff0c;欢迎指正&#xff01;1. 找到字符串中所有字母异位词 题目…

XiaoMi手机MIX 2S线刷固件和刷入Recovery

mix 2s 固件下载地址 https://web.vip.miui.com/page/info/mio/mio/detail?postId4865868&app_versiondev.20051 miflash线刷工具下载地址 https://miuiver.com/miflash/ 安装miflash线刷工具 点击安装驱动 打开miflash 手机关机按音量下加开机键进入bootloader&#xf…

Spring boot整合rocketmq(windows)

目录 1.环境搭建 2.命名服务器和业务服务器的启动 3.名词说明 4.执行步骤 5.示例 1.导入依赖 2.配置(至少指定下面两个) 3.代码 6.常见问题 1.环境搭建 下载地址&#xff1a;https://rocketmq.apache.org/解压缩进行安装&#xff0c;默认服务端口&#xff1a;9876 环…

执行 select ... for update 语句,如果查询条件没有索引字段的话,是加行锁还是加表锁?

大家好&#xff0c;我是小林。 昨天在群里看到大家在讨论一个 MySQL 锁的问题&#xff0c;就是执行 select … for update 语句&#xff0c;如果查询条件没有索引字段的话&#xff0c;是加「行锁」还是加「表锁」&#xff1f; 如果你做过这个实验的话&#xff0c;你会发现执行…