11-2 mybatis入门细节

news2024/11/25 0:31:15

mybatis

Mybatis 单表CURD细节

  1. ${} 与#{} 区别(面试题)

    1. ${} 拼接sql 造成sql注入 #{} 使用?占位

    如果作为值, 推荐使用#{}

    1. ${} 实现一些动态排序,使用

#{column}
select * from tb_userinfo order by ? desc
column: id 赋值
sql: select * from tb_userinfo order by 'id' desc
根据 'id'常数列排序
结果: 
[User{name='张三丰', gender='男', age=108, address='湖北', email='zhangsanfeng@163.com', qq='123456'}, User{name='李思琪', gender='女', age=21, address='上海', email='lisiqi@163.com', qq='12312321'}, User{name='李思思', gender='女', age=21, address='北京', email='lisisi@126.com', qq='3323422'}, User{name='李大海', gender='男', age=22, address='上海', email='lidahai@ss.com', qq='12212121'}, User{name='倪大红', gender='女', age=23, address='上海', email='asdsa@ss.com', qq='12312321'}, User{name='fsdsf', gender='男', age=43, address='北京', email='aadda@ww.com', qq='544554'}, User{name='wangwu', gender='女', age=18, address='上海', email='wangwu@163.com', qq='21321321'}, User{name='李四', gender='男', age=21, address='湖南', email='lisi@163.com', qq='222222'}, User{name='zhangsansan', gender='男', age=21, address='湖南', email='zhangsansan@163.com', qq='12321312'}, User{name='莫问归期', gender='女', age=21, address='北京', email='1234567@qq.com', qq='1234567'}, User{name='一个人挺好', gender='男', age=21, address='北京', email='sadsad@163.com', qq='2313128'}, User{name='张三', gender='男', age=21, address='长沙', email='zhangsan@qq.com', qq='1234678'}, User{name='张三', gender='男', age=21, address='长沙', email='zhangsan@qq.com', qq='1234678'}]
​
  1. resultType: 不是表示方法的返回值类型, 查询到结果集中记录映射到java那个实体类, 写的实体类

too many paramNumber selectone所带所导致的结果

先后顺序:(先执行插入操作,再执行这个查询生成id的命令)

  1. selectOne() 与selectList() 区别

    selectOne() 查询结果集最多有一行记录, 超出一行记录, 抛异常 TooManyResultsException

    selectList(): 查询结果集可以0 ,1 , 多条 返回的List<T>, 可以使用selectList() 替换selectOne()

  1. 插入操作,

mysql提供: select LAST_INSERT_ID(); 查找生成id值

只能获取当前会话执行插入操作的产生的id

Mybatis的Dao层开发模式

1. 传统的Dao模式

编写一个Dao接口, 提供Dao实现类

package com.fs.dao;
​
import com.fs.entity.User;
​
import java.util.List;
​
public interface UserDao {
    /**
     * 根据主键查询
     * @param id
     * @return
     */
     User selectById(Integer id);
​
    /**
     * 查询所有
     * @return
     */
    List<User> selectAll();
​
    /**
     * 添加
     * @param user
     * @return
     */
    int insert(User user);
​
    /**
     * 根据主键删除
     * @param id
     * @return
     */
    int deleteById(Integer id);
​
    /**
     * 根据主键修改
     * @param user
     * @return
     */
    int updateById(User user);
}
​
package com.fs.dao.impl;
​
import com.fs.dao.UserDao;
import com.fs.entity.User;
import com.fs.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
​
import java.util.List;
​
public class UserDaoImpl  implements UserDao {
    private SqlSession sqlSession;
​
    public UserDaoImpl() {
        this.sqlSession = MybatisUtil.getSqlSession();
    }
​
    @Override
    public User selectById(Integer id) {
        User user = sqlSession.selectOne("UserDao.selectById",id);
        sqlSession.close();
        return user;
    }
​
    @Override
    public List<User> selectAll() {
        List<User> users = sqlSession.selectList("UserDao.selectAll");
        sqlSession.close();
        return users;
    }
​
    @Override
    public int insert(User user) {
        int row  = sqlSession.insert("UserDao.addUser",user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        return row;
    }
​
    @Override
    public int deleteById(Integer id) {
        int row = sqlSession.delete("UserDao.deleteById", id);
        sqlSession.commit();
        sqlSession.close();
        return row;
    }
​
    @Override
    public int updateById(User user) {
        return 0;
    }
}
​

传统Dao方式问题:

  1. 重复代码重复写

  2. StatementId硬编码方式,

产生原因: Dao的实现类

2. Mapper代理模式 重点

Mybatis推荐,

编写Dao接口,不需要编写实现类, 由Mybatis动态代理自动生成的实现类对象

为了区分传统Dao方式, 把Dao 取名为Mapper 层: Mapper 接口 UserMapper

使用Mapper代理模式前提条件:

Sql映射文件的要求:

  1. namespace必须写成Mapper接口全限定名

  2. statement的id写成方法名

package com.fs.mapper;
​
import com.fs.entity.User;
​
import java.util.List;
​
public interface UserMapper {
    /**
     * 根据主键查询
     * @param id
     * @return
     */
     User selectById(Integer id);
​
    /**
     * 查询所有
     * @return
     */
    List<User> selectAll();
​
    /**
     * 添加
     * @param user
     * @return
     */
    int insert(User user);
​
    /**
     * 根据主键删除
     * @param id
     * @return
     */
    int deleteById(Integer id);
​
    /**
     * 根据主键修改
     * @param user
     * @return
     */
    int updateById(User user);
}
​

sql映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fs.mapper.UserMapper">
​
​
    <select id="selectById" parameterType="int" resultType="com.fs.entity.User">
        select * from tb_userinfo where id = #{id}
    </select>
​
    <delete id="deleteById" parameterType="int">
        delete from tb_userinfo where id = #{id}
    </delete>
​
    <select id="selectAll" resultType="com.fs.entity.User">
        select * from tb_userinfo
    </select>
​
    <insert id="insert" parameterType="com.fs.entity.User">
​
        <selectKey resultType="int" order="AFTER"  keyProperty="id">
            select LAST_INSERT_ID()
        </selectKey>
        insert into tb_userinfo(name,gender,age,address,email,qq,photo) values(#{name},
         #{gender},#{age},#{address},#{email},#{qq},#{photo})
    </insert>
</mapper>

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

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

相关文章

AIGC,ChatGPT 快速批量处理Word文本内容

在文档编辑与创作的过程中,会避免不了,输入错误内容与打错字的情况。 如果我们一个一个手动去修改,会比较费时间。 如下: 进行内容修改与更新的时候,我们知道可以使用Ctrl+H 来查找与替换,但查找与替换一次也只能替换一个值。

博捷芯BJCORE:划片机在划切工艺中需要注意以下几点

划片机在划切工艺中需要注意以下几点&#xff1a; 1. 测高时工作台上不能有任何物品&#xff0c;以免影响测高精度。 2. 切割前检查参数是否正确选择&#xff0c;包括切割速度、切割深度等。 3. 更换刀片时&#xff0c;检查刀片是否平稳旋转&#xff0c;确保刀片安装牢固。 …

开发知识点-stm32/ESP32/Mega2560嵌入式设计

嵌入式设计 STM32四轴飞行器原理图解析小马哥 DragonFly四轴软件开发 13 STM32 SPI总线通讯SPI 总线协议简介SPI 物理层SPI 协议层SPI 通信时序 STM32硬件SPI接口简介SPI接口 利用库函数初始化配置 ESP32 “F:\res\marlin-2.0.x” “F:\res\Marlin-2.1.2” STM32四轴飞行器 小…

深度学习中的“钩子“(Hook):基于pytorch实现了简单例子

目录 基本概念一个详细的示例 基于resnet50的一个hook应用例子前向传播示例反向传播示例 基本概念 在深度学习中&#xff0c;“钩子”&#xff08;Hook&#xff09;是一种机制&#xff0c;可以在神经网络的不同层或模块中插入自定义的代码&#xff0c;以便在网络的前向传播或反…

python开发数字人助理版

Fay数字人助理版是fay开源项目的重要分支&#xff0c;专注于构建智能数字助理的开源解决方案。它提供了灵活的模块化设计&#xff0c;使开发人员能够定制和组合各种功能模块&#xff0c;包括情绪分析、NLP处理、语音合成和语音输出等。Fay数字人助理版为开发人员提供了强大的工…

第三章《补基础:不怕学不懂概率统计》笔记

3.1 什么是概率 概率亦称“或然率”&#xff0c;它反映随机事件出现的可能性大小&#xff0c;在现实生活中有着极其普遍的应用。 3.1.1 最简单的概率的例子 3.1.2 概率论与数理统计的关系 概率论与数理统计的关系可以概括为&#xff0c;概率论是数理统计的理论基础&#xf…

fastspar微生物相关性推断

fastspar 简介 fastspar是基于Sparcc通过C编写的&#xff0c;速度更快&#xff0c;内存消耗更少。sparcc是基于OTU的原始count数&#xff0c;通过log转换和标准化去除传统相对丰度的天然负相关&#xff08;因为所有OTU之和为1&#xff0c;某些OTU丰度高另外一些自然就少&…

nssm部署nginx

nssm install Nginx8098 --安装nginx nssm start Nginx8098 --启用nginx nginx 选择nginx路径&#xff0c;安装

Kyligence Copilot 亮相第六届进博会,增添数智新活力

11月5日&#xff0c;第六届中国国际进口博览会&#xff08;以下简称“进博会”&#xff09;在上海国家会展中心盛大启幕&#xff0c;众多新科技、新成果、新展品亮相本届进博会。作为阿斯利康&#xff08;AstraZeneca&#xff09;合作伙伴&#xff0c;跬智信息&#xff08;Kyli…

ApiFox添加全局参数

文章目录 Apifox右上角打开 管理环境Apifox右上角打开 管理环境 我们发现,从登录以后,在请求其他接口,每次都需要添加一个Header 头信息.这样很繁琐.那Apifox是否支持我们设置全局参数呢?方便我们每次调用需要添加Header参数的接口需要每次都重新编写.当然支持,下面带着大家配…

Hikyuu 1.3.0 发布,高性能量化交易研究框架

Hikyuu 是一款基于 C/Python 的高性能开源量化交易研究框架&#xff0c;用于快速策略分析及回测。与其他量化平台或回测软件相比&#xff0c;具备&#xff1a; 超快的回测速度&#xff1b;对完整的系统交易理念进行抽象&#xff0c;并分解为不同的组件&#xff0c;通过重用不同…

Redis被攻击纪实

一、前言 声明&#xff1a;本文仅供技术交流使用&#xff0c;严禁采用本文的方法进行任何非法活动。 上周新来的同事分享Redis的原理和机制&#xff0c;想起2017年的时候测试环境Redis被攻击&#xff0c;最后只能重新安装服务器&#xff0c;今天试验一把利用Redis漏洞进行攻击…

Hybrid综合应用

1、需求 实现不同vlan间PC不可互访&#xff0c;而不同vlan的PC均可访问服务器的特殊效果&#xff0c;具体要求如下。 1&#xff09;在交换机中创建相关vlan 2&#xff09;修改端口模式与pvid 3&#xff09;修改端口允许通过的数据帧 4&#xff09;结果验证&#xff0c;vlan5与…

docker搭建mysql环境

1. 基础环境 名称描述CentOS 7.6Linux操作系统版本docker 20.10.5docker版本mysql 8.0.29mysql镜像版本 2. 下载安装 使用docker命令下载mysql镜像 [rootzhouwei ~]# docker pull mysql:8.0.29查看docker仓库是否已经下载了mysql镜像 [rootzhouwei ~]# docker images将mys…

一体化HIS医疗信息管理系统源码:云HIS、云电子病历、云LIS

基于云计算技术的B/S架构的HIS系统&#xff0c;为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势&#xff0c;建立统一的云HIS、云病历、云LIS&#xff0c;…

Android:OkHttp同步请求和异步请求

一、前言 网络请求之前工作中用到的是post请求&#xff0c;然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。 二、具体内容 1.Okhttp的特点&#xff1a; 支持Http/2并允许对同一主机的所有请求共享一套接字&#xff1b;如果非HTTP/2&…

jenkins2

jenkins插件管理安装&#xff1a;docker-build jenkins安装了docker 配置docke builder 添加 unix:///var/run/docker.sock rootubuntu20:~# usermod -G docker jenkins 修改docker中service文件添加 -H tcp://0.0.0.0:2376 jenkins中系统管理中 tcp://localhost:2376

不同规模的企业如何借助宁盾LDAP统一用户认证实现安全和效率需求?

中小企业要解决安全和业务效率问题&#xff0c;须提前规划软件基础设施&#xff0c;其中最基础的部分是建立统一账号和统一用户身份认证体系。这个体系相当于在软件系统之间建立了一套统一的身份标准&#xff0c;基于这套标准创建的账号让员工方便、高效地访问公司内的大部分软…

项目文件下载器,基于Thread多线程

目录 1、Http 工具类 2、关于下载的关系类 2.1 展示下载信息 #下载信息展现线程类 #在主下载类中&#xff0c;进行调用上述线程类 2.2 文件的分块下载 #文件分块下载类 #文件按分块进行分别切分的方法 # 使用 LongAdder 类型&#xff0c;更改 DownLoadInfoThread 展现…

clang插件对llvm源码插桩,分析函数调用日志(1)

tick_plot__compile.ipynb 时长边界_时上链异数: 长短函数调用链列表 0. 用matplotlib找系统中字体文件大于1MB的 中文字体通常很大&#xff0c;这样过滤出的 通常有中文字体 结果中 看名字 ‘AR PL UMing CN’ 果然是中文字体 from matplotlib.font_manager import fontManag…