【Java EE】Mybatis操作数据库

Mybatis操作数据库

文章目录

  • Mybatis操作数据库
    • @[toc]
    • 一、写在前面的规范
    • 二、普通SQL
      • 1. 注解形式
        • 1.1 注意事项
        • 1.2 如果数据库中的命名和Java中的命名不一致怎么映射?
      • 2. XML形式
        • 2.1 注意事项
        • 1.2 如果数据库中的命名和Java中的命名不一致怎么映射?
    • 三、动态SQL
      • 3.1 XML形式
        • 1. trim和if
        • 2. where
        • 3.set
    • 四、#{}和${}的区别
      • 4.1 既然${}有SQL注入的风险,为什么还存在着这种方式呢
      • 4.2 解决方式
    • 五、模糊查询
    • 六、数据库连接池

一、写在前面的规范

  1. 数据库命名: 蛇形。如:user_name。

  2. Java命名: 小驼峰。如:userName。

  3. 使用映射器(也即@Mapper)对于数据库和Java程序做链接🔗。

二、普通SQL

1. 注解形式

使用四个注解。

  1. @Select(“”)
  2. @Insert(“”)
  3. @Delete(“”)
  4. @Update(“”)

在括号中写的SQL语句和普通的没有区别。

	@Select("select * from userinfo")
    List<UserInfo> getUserInfoAll4();

    // 获取自增ID
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("insert into userinfo(userName,password,age,gender,phone) " +
            "values (#{userName},#{password},#{age},#{gender},#{phone})")
    Integer insertUserInfoByUser(UserInfo userInfo);

    @Delete("delete from userinfo where userName = #{userName}")
    Integer deleteUserInfoByName(String userName);

    @Update("update userinfo set password = #{password}, age = #{age}, gender = #{gender} where id = #{id}")
    Integer updateUserInfoByUser(UserInfo userInfo);
1.1 注意事项
  1. 接口中需要写上@Mapper注解
1.2 如果数据库中的命名和Java中的命名不一致怎么映射?
  1. 修改SQL语句,为数据库中的字段起别名

  2. 添加配置信息,使得驼峰命名和蛇形命名能够互相转换

    map-underscore-to-camel-case: true #配置驼峰⾃动转换
    
  3. 编写映射关系,主要使用@Result@Results

    // 3.映射关系
     @Results({
             @Result(column = "delete_flag", property = "deleteFlag"),
             @Result(column = "create_time", property = "createTime"),
             @Result(column = "update_time", property = "updateTime")
     })
     @Select("select * from userinfo")
     List<UserInfo> getUserInfoAll3();
    

2. XML形式

使用4个标签。

  1. <select>
  2. <insert>
  3. <delete>
  4. <update>
<?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">
<mapper namespace="com.example.springmybatis.mapper.UserInfoXMLMapper">
    
    <insert id="insert">
        insert into userinfo(username, password, age, gender, phone)
        values (#{userName},#{password},#{age},#{gender},#{phone})
    </insert>
    
    <update id="update">
        update userinfo set username=#{userName}, password=#{password}, age=#{age}, gender=#{gender}, phone=#{phone}
        where id=#{id}
    </update>
        
    <delete id="delete">
        delete from userinfo where id=#{id}
    </delete>
        
    <select id="selectAllUsers" resultType="com.example.springmybatis.model.UserInfo">
        select * from userinfo
    </select>
        
</mapper>
2.1 注意事项
  1. 标签是接口的实现,具体的接口定义和注解形式的一样
  2. 标签的xml文件中,
    1. 配置文件中的namespace需要和接口文件的全限定路径保持一致
    2. 标签(<select id=''>)中,id需要和方法名称保持一致
  3. 接口中需要写上@Mapper注解
  4. select语句需要写上resultType,因为select返回的可能是数字(影响行数),也可能是一个或多个对象(这时就需要写上对象的全限定路径)。
1.2 如果数据库中的命名和Java中的命名不一致怎么映射?
  1. 修改SQL语句,为数据库中的字段起别名

  2. 添加配置信息,使得驼峰命名和蛇形命名能够互相转换

    map-underscore-to-camel-case: true #配置驼峰⾃动转换
    
  3. 编写映射关系

    <resultMap id="BaseMap" type="com.example.springmybatis.model.UserInfo">
            <id column="id" property="id"></id>
            <result column="username" property="userName"></result>
            <result column="password" property="password"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
            <result column="phone" property="phone"></result>
            <result column="delete_flag" property="deleteFlag"></result>
            <result column="create_time" property="createTime"></result>
            <result column="update_time" property="updateTime"></result>
        </resultMap>
        
        // resultMap使用自己定义的id
        <select id="selectAllUsers" resultType="com.example.springmybatis.model.UserInfo" resultMap="BaseMap">
            select * from userinfo
        </select>
    

    注意resultMap的id就相当于自定义的映射关系的名字,在select标签上需要写上使用的是哪个映射关系。

三、动态SQL

3.1 XML形式

1. trim和if
<!--    动态SQL-->
    <insert id="insert2">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userName!=null">
                username,
            </if>
            password, age, gender, phone
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userName!=null">
                #{userName},
            </if>
            #{password},#{age},#{gender},#{phone}
        </trim>
    </insert>
  1. prefix是被包裹的代码段的前面需要去掉的符号
  2. suffixOverrides是被<if>包裹的代码段,需要后面去掉的符号
  3. 这两个都有相对应的前(后)面的另一个属性
2. where
 <select id="selectAllUsers2" resultType="com.example.springmybatis.model.UserInfo">
        select * from userinfo
        <where>
            <if test="userName!=null">
                userName=#{userName}
            </if>
            <if test="age!=null">
                and age=#{age}
            </if>
            <if test="id!=null">
                and id=#{id}
            </if>
        </where>
    </select>
  1. where可以给SQL加上where关键字
  2. 可以去掉没用到的and关键字
  3. 如果一个条件都没有,可以不生成where关键字
3.set
<update id="update2">
        update userinfo
        <set>
            <if test="userName!=null">
                userName=#{userName},
            </if>
            <if test="age!=null">
                age=#{age},
            </if>
            <if test="id!=null">
                id=#{id},
            </if>
        </set>
        where id=#{id}
    </update>
  1. set可以去掉逗号
  2. 生成set关键字

四、#{}和${}的区别

  1. ${}是直接将字符串替换,存在SQL注入的风险
  2. #{}是将字符串加上单引号后,生成SQL语句
  3. ${}生成的是即时SQL,#{}生成的是预编译SQL(有?的占位符)

4.1 既然${}有SQL注入的风险,为什么还存在着这种方式呢

使用的场景是:SQL语句中不需要使用单引号就能完成,但是还是一个参数的情况。

  1. 排序,需要根据哪个字段进行排序
  2. 要查哪张表,根据表名进行SQL

比如:

select * from userinfo order by age

这里的age就不需要添加引号。

但是存在SQL注入的风险,先将上一句话结束,然后写上drop database等,存在风险。

4.2 解决方式

  1. 可以加上参数判断

    判断传进来的string是否是字段中的任意一个

  2. 或者直接封装成方法

    方法名就叫:queryAllUsersByAge

五、模糊查询

因为存在两个"%",这两个%又不能由用户传入,所以需要使用${}。

虽然${}能够完成需求,但是有专门的拼接函数concat()

	<select id="queryAllUserByLike" resultType="com.example.springmybatis.model.UserInfo">
        select * from userinfo where userName like concat('%',#{key},'%');
    </select>

六、数据库连接池

需要更换直接在配置中更换。

像线程池一样,可以减少开销。可以使多个程序使用同一个已经连接上的数据库,而不是再去建立连接。

跟换阿里Durid数据库:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>

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

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

相关文章

【IMU】 确定性误差与IMU_TK标定原理

1、确定性误差 MEMS IMU确定性误差模型 K 为比例因子误差 误差来源:器件的输出往往为脉冲值或模数转换得到的值,需要乘以一个刻度系数才能转换成角速度或加速度值,若该系数不准,便存在刻度系数误差。 T 为交轴耦合误差 误差来源:如下图,b坐标系是正交的imu坐标系,s坐标系的三…

UE C++ 多镜头设置缩放 平移

一.整体思路 首先需要在 想要控制的躯体Pawn上&#xff0c;生成不同相机对应的SpringArm组件。其次是在Controller上&#xff0c;拿到这个Pawn&#xff0c;并在其中设置输入响应&#xff0c;并定义响应事件。响应事件里有指向Pawn的指针&#xff0c;并把Pawn的缩放平移功能进行…

暄桐教练日课·21天《线的初识》即将开始 一起感受线描的乐趣

林曦老师的直播课&#xff0c;是暄桐教室的必修课。而教练日课是丰富多彩的选修课&#xff0c;它会选出书法史/美术史上重要的、有营养的碑帖和画儿&#xff0c;与你一起&#xff0c;高效练习。而且暄桐教练日课远不止书法、国画&#xff0c;今后还会有更多有趣的课程陆续推出&…

Python | Leetcode Python题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution:def shortestPalindrome(self, s: str) -> str:n len(s)fail [-1] * nfor i in range(1, n):j fail[i - 1]while j ! -1 and s[j 1] ! s[i]:j fail[j]if s[j 1] s[i]:fail[i] j 1best -1for i in range(n - 1,…

Django之项目开发(二)

目录 一、安装和使用uWSGI 1.1、安装 1.2、配置文件 1.3、启动与停止uwsgi 二、安装nginx 三、Nginx 配置uWSGI 四、Nginx配置静态文件 五、Nginx配置负载均衡 一、安装和使用uWSGI uWSGI 是一个 Web 服务器,可以用来部署 Python Web 应用。它是一个高性能的通用的 We…

大模型备案全网最详细流程【附附件】

本文要点&#xff1a;大模型备案最详细说明&#xff0c;大模型备案条件有哪些&#xff0c;《算法安全自评估报告》模板&#xff0c;大模型算法备案&#xff0c;大模型上线备案&#xff0c;生成式人工智能(大语言模型)安全评估要点&#xff0c;网信办大模型备案。 大模型备案安…

Arduino ESP8266 开发环境搭建

Arduino ESP8266 开发环境搭建 很久之前学嵌入式时&#xff0c;用过Arduino8266进行开发&#xff0c;开发成本低、难度小&#xff0c;体验很不错。 近期&#xff0c;又突然要用&#xff0c;遂再次搭建环境&#xff0c;但变动挺多&#xff0c;有些小波折&#xff0c;开贴记录。…

unity强力配置插件Luban【Next最新版本】(二)本地化

文章目录 前言一、快速实现静态本地化1、表格格式2、本地化文本3、修改bat文件3、打表 二、多语言切换1、修改bat文件2、增加本地化管理脚本3、测试 总结 前言 无需多言&#xff0c;本地化&#xff08;Localization&#xff0c;简称 L10N&#xff09;是指将产品、内容或服务适…

注意力机制 attention Transformer 笔记

动手学深度学习 这里写自定义目录标题 注意力加性注意力缩放点积注意力多头注意力自注意力自注意力缩放点积注意力&#xff1a;案例Transformer 注意力 注意力汇聚的输出为值的加权和 查询的长度为q&#xff0c;键的长度为k&#xff0c;值的长度为v。 q ∈ 1 q , k ∈ 1 k …

零基础STM32单片机编程入门(七)定时器PWM波输出实战含源码视频

文章目录 一.概要二.PWM产生框架图三.CubeMX配置一个TIME输出1KHZ&#xff0c;占空比50%PWM波例程1.硬件准备2.创建工程3.测量波形结果 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&…

CAN总线(下)

位时序 为了灵活调整每个采样点的位置&#xff0c;使采样点对齐数据位中心附近&#xff0c;CAN总线对每一个数据位的时长进行了更细的划分&#xff0c; 分为同步段&#xff08;SS&#xff09;、传播时间段&#xff08;PTS&#xff09;、相位缓冲段1&#xff08;PBS1&#xff0…

扩散模型笔记

长参数“T”决定了生成全噪声图像所需的步长。在本文中&#xff0c;该参数被设置为1000&#xff0c;这可能显得很大。我们真的需要为数据集中的每个原始图像创建1000个噪声图像吗?马尔可夫链方面被证明有助于解决这个问题。由于我们只需要上一步的图像来预测下一步&#xff0c…

机器学习 | 随机梯度下降分类器

数据科学和机器学习工具包中用于各种分类任务的一个重要工具是随机梯度下降&#xff08;SGD&#xff09;分类器。通过探索其功能和在数据驱动决策中的关键作用&#xff0c;我们开始探索SGD分类器的复杂性。 SGD分类器是一种与SGD回归器有着密切联系的灵活分类技术。它的工作原…

最新性价比最高的SSL证书申请

申请SSL证书时&#xff0c;为了确保过程的顺利进行以及获得可靠的加密连接&#xff0c;有几个关键点需要注意。 申请新性价比最高SSL证书步骤 1、登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。 2、选择加密方式&#xff0c;一般选择默认就可以…

redhat7.x 升级openssh至openssh-9.8p1

1.环境准备&#xff1a; OS系统&#xff1a;redhat 7.4 2.备份配置文件&#xff1a; cp -rf /etc/ssh /etc/ssh.bak cp -rf /usr/bin/openssl /usr/bin/openssl.bak cp -rf /etc/pam.d /etc/pam.d.bak cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak 3.安装…

【Java探索之旅】多态:重写、动静态绑定

文章目录 &#x1f4d1;前言一、重写1.1 概念1.2 方法重写的规则1.3 重写和重载的区别1.4 重写的设计原则 二、动静态绑定2.1 静态绑定&#xff1a;2.2 动态绑定&#xff1a; &#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;重写和动静态绑定是重要的…

5G频段简介

5G频段 5G网络一共有29个频段&#xff0c;主要被分为两个频谱范围&#xff0c;其中6GHz以下的频段共有26个&#xff08;统称为Sub6GHz&#xff09;&#xff0c;毫米波频段有3个。目前国内主要使用的是Sub6GHz&#xff0c;包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

Ubuntu 22.04.4 LTS 安装配置 MySQL Community Server 8.0.37 LTS

1 安装mysql-server sudo apt update sudo apt-get install mysql-server 2 启动mysql服务 sudo systemctl restart mysql.service sudo systemctl enable mysql.service #查看服务 sudo systemctl status mysql.service 3 修改mysql root密码 #默认密码为空 sudo mysql …

C# 如何获取属性的displayName的3种方式

文章目录 1. 使用特性直接访问2. 使用GetCustomAttribute()方法通过反射获取3. 使用LINQ查询总结和比较 在C#中&#xff0c;获取属性的displayName可以通过多种方式实现&#xff0c;包括使用特性、反射和LINQ。下面我将分别展示每种方法&#xff0c;并提供具体的示例代码。 1.…

MySQL第三天作业

一、在数据库中创建一个表student&#xff0c;用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 1、向student表中添加一条新记录 记录中id字段的值为1&#xff0c;name字段的值为"monkey"…