首页 > 数据库 >mybatis基于注解、XML配置文件的形式来定义SQL语句

mybatis基于注解、XML配置文件的形式来定义SQL语句

时间:2024-09-29 13:50:53浏览次数:10  
标签:XML name 配置文件 gender time id emp SQL public

一、mybatis基于注解定义SQL语句

员工类
@Data
@NoArgsConstructor//无参
@AllArgsConstructor//有参
public class Emp {
    private Integer id;//id
    private String username;//用户名
    private String password;//密码
    private  String name;//姓名
    private Short gender;//性别 : 1男 ; 2女
    private String image;//图片
    private Short job;//职务 1班主任 ,2讲师 ,3学工主管 ,4教师主管 ,5咨询师
    private LocalDate entrydate;//入职日期
    private Integer deptId;//部门ID
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//修改时间
    
EmpMapper接口类

① 根据ID删除数据

//代理
@Mapper//说明程序在运行时会自动创建该接口的代理对象,并将这个对象放入IOC容器当中
public interface EmpMapper {
    
    /**
     * 根据ID删除数据
     * @param id
     */
    
    @Delete("delete from emp where id = #{id}")
    //#{ }占位符号  ---来动态获取delete()方法传入的参数,在预编译是会用‘?’占位,
    // 如:delete from emp where id = ?(该类型就为预编译SQL)
    //优点:性能更高 ;更安全(防止SQL注入)
    //#{id}拼接符号  ---若id = 1,则预编译的时候会将id直接拼接成“id = 1”,
    //如 delete from emp where id = 1
    //使用占位符,会生成预编译的SQL语句
    public void delete(Integer id);
//    public int delete(Integer id);
    //返回值代表的是:影响的记录数,因为删除操作已经执行了,所以这次方法的返回值为0

② 插入员工数据

/**
 * 插入员工数据
 */
@Options(useGeneratedKeys = true , keyProperty = "id")//将自动生成的主键值,赋值给emp对象的id属性
//useGeneratedKeys = true  ----代表要拿到生成记录的主键值
//keyProperty = "id"  -----获取到的主键最终会封装到 emp.id 属性当中
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
        "value(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);

③更新数据

/**
 * 更新数据
 */
@Update("update emp set username =#{username} , name = #{name},gender = #{gender}," +
        "job = #{job},image = #{image},entrydate = #{entrydate},dept_id = #{deptId},update_time = #{updateTime} where id = #{id}")
public void update(Emp emp);

④根据ID查询员工

/**
 * 根据ID查询员工
 */
@Select("select * from emp where id = #{id}")
public Emp getID(Integer id);
解决类的属性名与表的字段名不对应问题:

针对查询过程中,类的属性名与表的字段名(如类createTime,表中字段create_time)不一致,导致查询部分数据丢失(create_time = null)

方案三(推荐):打开自动映射
/*针对类的属性名与表的字段名不一致,导致部分数据丢失 =====> 解决方案*/

//方案三(推荐):开启mybatis的驼峰命名自动映射开关   dept_id ====>deptId(自动映射)
//在application.properties文件中配置
//=====================================================================
application.properties文件:
#开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
方案一:起别名
//方案一:给被查询表中不一致的字段名(dept_id,create_time,update_tome)起别名,别名与实体类属性一致
/* @Select("select id, username, password, name, gender, image, job, entrydate," +
         " dept_id deptId,create_time createTime,update_time updateTime" +
         "from emp where id = #{id}")
 public Emp getID(Integer id);*/
方案二:通过@Results,@Result注解,手动映射封装
//方案二:通过@Results,@Result注解,手动映射封装
/*@Results({
        @Result(column = "dept_id",property = "deptId"),  //dept_id ---> deptId
        //               表中字段名            类中属性名
        @Result(column = "create_time",property = "createTime"),
        @Result(column = "update_time",property = "updateTime")
})
@Select("select * from emp where id = #{id}")
public Emp getID(Integer id);*/
模糊查询中的字符拼接问题
⑤条件查询员工信息(模糊查询)

占位符:${} 为拼接作用 #{}为占位符(预编译阶段用?占位)

方式一:${ }

/**
     * 条件查询员工信息
     */
    //方式一:
                                            //预编译'%张%'
    @Select("select * from emp where name like '%${name}%' and gender = #{gender} and " +
            //%${name}%'  这里用$直接拼接,因为#{}会在预编译是用?代替,而''引号中不能出现?
            "entrydate between #{entryTimeStart} and #{entryTimeEnd} order by update_time desc;")
    public List<Emp> list(String name , Short gender , LocalDate entryTimeStart , LocalDate entryTimeEnd);

方式二:concat 字符串拼接函数-----预编译过程中('%',?,'%')【推荐】

//方式二:
//concat 字符串拼接函数-----预编译concat('%',?,'%')【推荐】
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +
        "entrydate between #{entryTimeStart} and #{entryTimeEnd} order by update_time desc;")
public List<Emp> list(String name , Sh ort gender , LocalDate entryTimeStart , LocalDate entryTimeEnd);

测试类

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
    @Autowired
   private EmpMapper empMapper;
    /**
     * ①根据ID删除数据
     */
    @Test
    public void testdelete(){
        empMapper.delete(17);
       /* int delete = empMapper.delete(17);
        System.out.println(delete);*/
        System.out.println("==================================");
    }
    /**
     * ②插入员工数据
     */
    @Test
    public void testInsert(){
        //构造员工对象
        Emp emp = new Emp();
        emp.setUsername("Tom03");
        emp.setName("汤姆03");
        emp.setGender((short)1);
        emp.setImage("1.jpg");
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2005,1,1));
        emp.setDeptId(1);
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());

        //执行新增员工信息操作
        empMapper.insert(emp);
        System.out.println(emp.getId());
        System.out.println("==================================");

    }
    /**
     * ③更新员工信息
     */
    @Test
    public void testUpdate(){
        Emp emp = new Emp();
        emp.setId(18);
        emp.setUsername("Tom02");
        emp.setName("汤姆02");
        emp.setGender((short)1);
        emp.setImage("1.jpg");
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2005,1,1));
        emp.setDeptId(1);
        emp.setUpdateTime(LocalDateTime.now());

        //执行更新操作
        empMapper.update(emp);
        System.out.println("==================================");
    }
    /**
     * ④根据ID查询员工信息
     */
    @Test
    public void testGetID(){
        Emp emp = empMapper.getID(21);
        System.out.println(emp);
        //Emp(id=21, username=Tom03, password=123456, name=汤姆03, gender=1, image=1.jpg,
        // job=1, entrydate=2005-01-01, deptId=null, createTime=null, updateTime=null)
        //查询返回的对象其中deptId=null, createTime=null, updateTime=null都为null
        /*原因是emp表中对应的字段名为dept_id等均包含下划线,故此三个字段名与emp类封装的对象属性名不一致
        * */
        System.out.println("==================================");
    }
    
    /**
     *⑤条件查询员工信息
     */
    @Test
    public void testList(){
        List<Emp> empList = empMapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));
        System.out.println(empList);
    }

}

二、XML配置文件的形式来定义SQL语句

=========================================================================

XML映射文件

规范

①XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。

②XML映射文件的namespace属性为Mapper接口全限定名一致。

③XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

=========================================================================

⑤条件查询员工信息(模糊查询)

EmpMapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 2、XML映射文件的namespace属性为Mapper接口全限定名一致。-->
<mapper namespace="com.it.mapper.EmpMapper">

    <!--3、XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。-->
    <!--resultSetType:单条记录所封装的类型-->
    <select id="list" resultType="com.it.mapper.pojo.Emp">  <!-- 如果是查询,是有返回值的-->
        select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and
        entrydate between #{entryTimeStart} and #{entryTimeEnd} order by update_time desc;
    </select>
</mapper>
测试类
/**
 *⑤条件查询员工信息
 */
@Test
public void testList(){
    List<Emp> empList = empMapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));
    System.out.println(empList);
}

标签:XML,name,配置文件,gender,time,id,emp,SQL,public
From: https://blog.csdn.net/yangjiale629/article/details/142633563

相关文章

  • shell脚本——检索mysql数据库中得用户,如果没有就创建
     #!/bin/bash#author:goujinyangset-eUSER1=mysqlsiUSER2=dbqueryUSER3=dboperUSER4=yyzcUSERS=($USER1$USER2$USER3$USER4)USER_PASS=123123#MySQL用户名和密码MYSQL_USER="root"MYSQL_PASSWORD="Root#123"#MYSQL_HOST="local......
  • 第2天:熟悉Android Studio补充材料——`activity_main.xml`解读
    下面是对“第2天:熟悉AndroidStudio”该文学习的更深层次的补充材料,对activity_main.xml文件的理解。下面对activity_main.xml文件中每一行进行详细解释:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="ht......
  • 生产数据恢复系列之使用my2sql恢复MySQL8 误删数据
    生产数据恢复系列之使用my2sql恢复MySQL8误删数据原创 我科绝伦 小周的数据库进阶之路  2024年09月25日00:00 重庆热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者频率......
  • MySQL索引详解
    MySQL索引详解什么是索引索引(Index)是数据库中用于提高查询速度的数据结构,类似于书的目录。它为表中的一个或多个列创建了一种顺序结构,以帮助数据库更快地定位和检索数据。当表中的数据量非常大时,查询的性能可能会显著下降,索引的主要作用就是通过减少查询时的扫描范围来提......
  • MySQL实现按分秒统计数据量
    在MySQL中,统计每秒、每分钟、每5分钟、每10分钟、每30分钟的交易量可以通过使用GROUPBY和MySQL的时间处理函数来实现。假设交易记录表名为transactions,交易时间字段为transaction_time,并统计每个时间段的交易量。1.每秒交易量SELECTDATE_FORMAT(transaction......
  • 基于Java&MYSQL&Android的商品比价软件设计与实现20516-计算机毕设定制原创选题推荐(附
                                                 目 录摘要1绪论1.1开发背景1.2研究现状1.3论文结构与章节安排2 商品比价软件APP系统分析2.1可行性分析2.2......
  • GaussDB数据库SQL系列-LOCK TABLE
    一、前言GaussDB是一款高性能、高可用的分布式数据库,广泛应用于各类行业和场景。在GaussDB中,锁是实现并发控制的关键机制之一,用于协调多个事务之间的数据访问,确保数据的一致性和完整性。本文将围绕GaussDB数据库的LOCKTABLE做一简单介绍。二、GaussDB数据库的锁GaussDB提供了......
  • GaussDB数据库SQL系列-动态语句
    一、前言在数据库中构建动态SQL语句是指根据不同的条件或参数创建不同的SQL语句。这通常是为了适应不同的业务需求,提高SQL的灵活性和效率。GaussDB数据库是一款具备高性能、高可用性和高扩展性的关系型数据库,它提供了丰富的功能和工具,支持动态SQL语句的构建。下面我们将介绍如何......
  • GaussDB SQL基础语法-变量&常量
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、GaussDB数据库中的常量和变量的基本概述及语法定义数据库中的变量和常量是两种重要的数据......
  • GaussDB SQL基础语法示例-GOTO语句
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。GOTO语句是直观基本的控制流语句,会导致控制流发生无条件更改。它用于分流至使用SQL过程中定......