11-2 mybatis入门细节

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动态代理自动生成的实现类对象,

方法调用哪一个是根据你的映射配置文件中的sql所决定,如果在进入一点,判断是selectOne还是selectList,这里是根据返回值类型所决定 ,如果是一个对象,就是selectOne

,如果说是一个集合也就是selectList,当然你可以直接用selectList替代selectOne

方法名:selectById

全限定名:namespace="UserDao"

为了区分传统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>

Mybatis的配置

mybatis主配置文件相关配置

mybatis-config.xml

一个项目中只有一个主配置文件

https://mybatis.org/dtd/mybatis-3-config.dtd mybatis的主配置文件的约束文件 dtd约束文件

限制xml包含哪些标签, 标签中能包含哪些属

<configuration>
   包含的子标签
    <!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
    //configuration 子元素有先后顺序

</configuration>

?表示量词 0 次或者1次

*表示量词 0 次或者n次

+表示量词 1次或者n次

类似于正则表达式

ELEMENT configuration:表示是标签

<!ATTLIST environment
id CDATA #REQUIRED

ATTLIST environment: 声明environment标签的属性列表

id CDATA #REQUIRED: 有一个id属性, CDATA: id属性的数据类型: 普通文本 #REQUIRED: 必须的

<!ELEMENT typeHandler EMPTY>
//表示typeHandler标签没有子元素, <typeHandler/>

properties配置

加载properties文件, 比如把数据库参数放在properties文件, 在主配置文件中, 根据key获取value:

${key} ONGL表达式 对象图导航语言: ${user.address.name}

User
Address address

Address
name

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC串口通信(SerialPort)

目录 1、SerialPort类的介绍和使用&#xff1a; &#xff08;1&#xff09;、SerialPort类的功能介绍 &#xff08;2&#xff09;、SerialPort类提供接口函数的介绍 1&#xff09;、InitPort函数 2&#xff09;、控制串口监视线程函数 3&#xff09;、获取事件&#xff0c…

基于JavaWeb+SpringBoot+微信小程序的酒店商品配送平台系统的设计和实现

基于JavaWebSpringBoot微信小程序的酒店商品配送平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 本章内容概括了基于微信小程序的酒店商品配送平台的可行性分析、系统功…

Linux安装Python3.10与部署flask项目实战详细记录

java开发新手入门Python,创建flask后端服务对外提供访问.记录一下在阿里云服务器部署flask项目的操作过程,简单介绍一下使用的阿里云服务器系统配置:ubantu16.04,其他内核版本操作部分命令会有所区别,下面开始详细操作过程! 1.pycharm创建flask项目并打包 2.Python3.…

Apache Storm 2.5.0 单机安装与配置

1、下载storm 2.5.0 2、需要安装python3&#xff0c;并且设置python3的环境变量 3、修改storm.yaml配置 storm.zookeeper.servers:- "node4" # - "server2" # # nimbus.seeds: ["host1", "host2", "host3"] # nimbus…

javaSE学习笔记(五)集合框架-Collection,List,Set,Map,HashMap,Hashtable,ConcurrentHashMap

目录 四、集合框架 1.集合概述 集合的作用 集合和数组的区别 集合继承体系 数组和链表 数组集合 链表集合 2.Collection 方法 集合遍历 并发修改异常 3.List List集合的特有功能&#xff08;核心是索引&#xff09; 集合遍历 并发修改异常产生解决方案ListIterato…

ubuntu下Anaconda环境安装GPU的pytorch(docker镜像)

实验室需要给每个人分配docker的container环境&#xff0c;为了节省系统的空间&#xff0c;打算把anaconda和深度学习的开发环境配置好拉取镜像以省时间。 基础环境配置 apt更新了清华源 安装了基础环境 gcc vim Linux文本编辑库 openssh-server ssh远程连接库 net-tools 包含…

Visual Leak Detector 2.5.1 (VLD)下载、安装与使用

目录 1 软件介绍 2 下载与安装 2.1 工具下载地址 2.2 工具安装 3 配置与使用 3.1 配置环境变量 3.2 配置vs 3.3 VLD的配置 4 测试代码与报告生成 1 软件介绍 Visual Leak Detector 2.5.1 (VLD)是一个小巧内存检测工具&#xff0c;是为Visual C用户设计的。其特色为&a…

基于开源项目OCR做一个探究(chineseocr_lite)

背景&#xff1a;基于图片识别的技术有很多&#xff0c;应用与各行各业&#xff0c;我们公司围绕电子身份证识别自动录入需求开展&#xff0c;以下是我的研究心得 技术栈&#xff1a;python3.6&#xff0c;chineseocr_lite的onnx推理 环境部署&#xff1a;直接上截图&#xff…

ARMday2(环境创建+工程配置+创建文件+单步调试)

目录 一、汇编环境的创建 二、为工程配置链接脚本&#xff08;map.lds&#xff09; 三、为工程创建汇编文件 start.s 编程调试 接下来我们需要建立一个 start.s 汇编文件添加到我们的工程中去 四、对汇编代码进行单步调试&#xff08;仿真&#xff09; 五、汇编工程的编译 …

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业&#xff0c;每一次周期性或结构性的变化&#xff0c;都会对企业经营策略带来深远的影响。 2023年前三季度&#xff0c;泛半导体产业迎来结构性复苏。其中&#xff0c;主流显示领域供需关系趋向健康化&#xff0c;半导体显示行业整体上量价…

iOS 16.4 之后真机与模拟器无法使用Safari调试H5页面问题

背景 iOS 16.4之后用真机调试H5时候发现&#xff0c;Safari中开发模块下面无法调试页面 解决方案 在WKWebView中设置以下代码解决 if (available(iOS 16.4, *)) {[_webView setInspectable:YES];}然后再次调试就可以了

redis持久化和Redis事务

一)Redis持久化之RDBredisDataBase: 什么是持久化: 1)持久性:和持久化说的是同一回事&#xff0c;衡量持久性的前提是重启进程或者是重启主机以后数据是否还存在 持久:把数据存储在硬盘上&#xff0c;那么就是持久性 不持久:把数据存储在内存中 2)redis是一个内存级别的数据库&…

一个“Hello, World”Flask应用程序

如果您访问Flask网站&#xff0c;会看到一个非常简单的示例应用程序&#xff0c;只有5行代码。为了不重复那个简单的示例&#xff0c;我将向您展示一个稍微复杂一些的示例&#xff0c;它将为您编写大型应用程序提供一个良好的基础结构。 应用程序将存在于包中。在Python中&…

在 Vue3 中使用 mitt 进行组件通信

npm 包地址 mitt 是一个轻量级的 JavaScript 事件触发器&#xff0c; 只有200b。有基本的事件触发、订阅和取消订阅功能&#xff0c;还支持用命名空间来进行更高级的事件处理。 功能特点&#xff1a; Microscopic —— weighs less than 200 bytes gzippedUseful —— a wil…

抖店怎么做才会快速起店?跟着这个思路来,一周搞定!

大家好&#xff0c;我是电商糖果 有不少朋友&#xff0c;自己开了一家抖店。 因为不懂运营&#xff0c;店铺一直没有流量&#xff0c;也不出单。 糖果做抖店三年多了&#xff0c;不敢自吹有多么优秀&#xff0c;但是做店还是有一套自己的方法的。 按照糖果这个思路做店&…

edge浏览器无法进入中国知网,但可以进入其他网站需要怎么解决

最近使用edge浏览器进入中国知网&#xff0c;加载了很长时间都打不开&#xff0c;好不容易打开了&#xff0c;结果出现&#xff1a;“嗯...无法访问此页面”。即使无法进入知网&#xff0c;但可以进入哔哩哔哩或其他网站&#xff0c;甚是苦恼&#xff0c;下面是一个方法&#x…

Echarts示例

一.概念 ECharts&#xff08;Enterprise Charts&#xff09;是百度开源的一个基于JavaScript的可视化图表库。它提供了多种常见的数据可视化图表&#xff0c;包括折线图、柱状图、散点图、饼图、雷达图等等。使用ECharts&#xff0c;用户可以通过简单的配置和接口调用来创建交…

rabbitmq入门学习

写在前面 本文看下rabbit mq的基础概念以及使用。 1&#xff1a;简单介绍 为了不同进程间通信的解耦&#xff0c;出现了消息队列&#xff0c;为了规范消息队列的具体实现&#xff0c;Java制定了jms规范&#xff0c;这是一套基于接口的规范&#xff0c;因此是绑定语言的&…

人脸识别中的人工智能

随着人工智能技术的快速发展&#xff0c;人脸识别作为其中的一个重要应用领域&#xff0c;已经在各个行业和场景中展现出了巨大的潜力和价值。人脸识别技术通过对人脸图像进行采集、处理和分析&#xff0c;基于人工智能算法对人脸进行识别和验证&#xff0c;并在安防监控、金融…

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…