千家信息网

Mybatis中实体类别名、多参数、动态SQL的示例分析

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍了Mybatis中实体类别名、多参数、动态SQL的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、说明开始讲
千家信息网最后更新 2025年02月23日Mybatis中实体类别名、多参数、动态SQL的示例分析

这篇文章主要介绍了Mybatis中实体类别名、多参数、动态SQL的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    一、说明

    开始讲实体类别名、多参数、动态SQL等

    二、开搞

    数据库表

    DROP TABLE IF EXISTS `test`;CREATE TABLE `test`  (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `salary` decimal(10, 2) NOT NULL,  `age` int(11) NULL DEFAULT NULL,  `city` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `job` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of test-- ----------------------------INSERT INTO `test` VALUES (1, '小明', 40000.00, 18, '北京', '程序猿');INSERT INTO `test` VALUES (2, '小强', 50000.00, 19, '南京', '程序汪');INSERT INTO `test` VALUES (3, '小月月', 50000.00, 20, '天津', '程序狗');INSERT INTO `test` VALUES (4, '小月鸟', 40000.00, 21, '广州', '程序屌丝');

    2.1 实体类别名

    2.1.1 第一种方式
    1.创建实体类
    package entity;import java.math.BigDecimal;/** * @author 发现更多精彩  关注公众号:木子的昼夜编程 * 一个生活在互联网底层,做着增删改查的码农,不谙世事的造作 * @create 2021-08-25 22:05 */public class TestEntity {    private  Long id;    private String name;    private BigDecimal salary;    private Integer age;    private String city;    private String job;        // get set方法省略  IntelliJ IDEA  生成快捷键是Alt+Inert 选择Getter and Setter    // toString 方法省略   IntelliJ IDEA  生成快捷键是Alt+Inert 选择 toString}
    2.创建XML

    mybatis-config.xml

                                     

    配置文件顺序要这样配置:

    ..............................
    3.使用别名
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            System.out.println(mapper);            // 查询数据            TestEntity testEntity = mapper.get(1L);            System.out.println(testEntity);        }    }}
    2.1.2 第二种方式

    扫描包路径 mybatis-config.xml

                                   

    用扫描包路径的方式,实体类别名默认就是java类首字母小写

    例如:TestEntity --> testEntity

    还可以注解指定:

    @Alias("testEntityxxoo")public class TestEntity {    // 其他省略}

    如果写了注解@Alias 别名就不是"testEntity"了 ,就变成"testEntityxxoo"

    2.1.3 mybatis默认别名

    映射类型
    _bytebyte
    _longlong
    _shortshort
    _intint
    _integerint
    _doubledouble
    _floatfloat
    _booleanboolean
    stringString
    byteByte
    longLong
    shortShort
    intInteger
    integerInteger
    doubleDouble
    floatFloat
    booleanBoolean
    dateDate
    decimalBigDecimal
    bigdecimalBigDecimal
    objectObject
    mapMap
    hashmapHashMap
    listList
    arraylistArrayList
    collectionCollection
    iteratorIterator

    2.2 插入数据返回自增主键

    2.2.1方式一
        INSERT INTO `test`( `name`, `salary`) VALUE (#{name}, #{salary});
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            // 测试id是否到了实体类里边            TestEntity testEntity = new TestEntity();            testEntity.setName("小鸭子");            testEntity.setSalary(new BigDecimal(100000));            mapper.save(testEntity);            System.out.println("主键:"+testEntity.getId());        }    }}

    输出结果:

    主键不是直接返回的,而是把主键值设置到插入的对象里的

    2.2.2 方式二
                SELECT LAST_INSERT_ID()        INSERT INTO `test`(`id`, `name`, `salary`) VALUE (#{id},#{name}, #{salary})

    2.3 多参数

    2.3.1 一个参数
    // 根据主键查询TestEntity get(Long id);

    如果只有一个参数,并且参数类型是Java基础类型或String类型,那么使用这个参数的时候

    #{xxoo} xxoo可以是任意字符 与方法输入参数名称无关

    上边例子中:id、xx、oo、aaabbb 都可以使用 ,但是哈,我们一般见名知意,传递的什么参数(id),我们xml就用#{传递的参数} 这不是必须但可以遵循这个规范

    2.3.2 多个参数 之实体类
    // 新增void save(TestEntity testEntity);
        INSERT INTO `test`(`name`, `salary`) VALUE (#{name}, #{salary})

    这个很容易明白,实体类参数叫什么 这里#{}里边就用什么

    2.3.3 多个参数之@Param注解
    // 根据名称模糊查询List listByNameAndAge(@Param("name") String name,@Param("age") Integer age);
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            List list = mapper.listByNameAndAge("小强", 19);            System.out.println(list);        }    }}
    2.3.4 多个参数之Map

    用Map跟用实体类差不多 就key值当做是实体类的字段名称就可以

    // 多参数Map 方式传递List listByNameAndAgeMap(Map param);
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            Map param = new HashMap<>();            param.put("name", "小强");            param.put("age", 19);            List list = mapper.listByNameAndAgeMap(param);            System.out.println(list);        }    }}
    2.3.5 多个参数之默认

    默认有两套参数:

    arg0、arg1、arg2、argxxx ; arg从0开始按照方法参数顺序

    param1、param2、param3、paramxxx ; param从1开始按照方法参数顺序

    // 什么都不用List listByNameAndAgeNone(String name, int age);
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            List list = mapper.listByNameAndAgeNone("小月", 20);            System.out.println(list);        }    }}
    2.3.6 数组参数之基础值&实体类

    注意传递数组的话,默认参数名称为arry

    1. 根据多个年龄查询数据:
    // 根据年龄集合查询List listByAges(int[] ages);
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            int[] ages = new int[]{19,20};            List list = mapper.listByAges(ages);            System.out.println(list);        }    }}
    2. 根据名称和年龄多条件查询

    例如:名称是小强并且年龄是19 或者名称是小月月年龄是20 的数据

    // 根据多组参数查询List listByNameAndAges(TestEntity[] params);
    public class TestMain {    public static void main(String[] args) throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper            TestMapper mapper = session.getMapper(TestMapper.class);            TestEntity[] params = new TestEntity[2];            TestEntity testEntity01 = new TestEntity();            testEntity01.setName("小强");            testEntity01.setAge(19);            TestEntity testEntity02 = new TestEntity();            testEntity02.setName("小月月");            testEntity02.setAge(20);            params[0] =  testEntity01;            params[1] =  testEntity02;            List list = mapper.listByNameAndAges(params);            System.out.println(list);        }    }}

    最后输出的sql格式是这样的:

    select* from test where 1=1 and (
    (name = '小强' and age = 19) or
    (name = '小月月' and age = 20)
    )

    2.3.7 集合参数之基础值&实体类

    集合与数组差不多,但还是有点儿差别

    不同点1: 集合如果不指定参数名称的话默认使用:collection或者list 不是array

    不同点2:集合判断大小是这样的 用的size() 不是length

     

    2.4 四大标签的说明

    select是Mybatis使用最多的标签之一,他与insert update delete不同,他不对数据库值做改变,只是查

    insert、 update、 delete 会对数据库的值做变更,这三个标签可以混用,也就是说他们功能一样,出三个的意义就是为了业务上可以区分一下是新增、修改还是删除。一般我们也遵循这个使用。

    感谢你能够认真阅读完这篇文章,希望小编分享的"Mybatis中实体类别名、多参数、动态SQL的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

    参数 实体 名称 编程 数据 代理 查询 小强 方式 类别 多个 年龄 方法 月月 程序 篇文章 类型 动态 不同 别名 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 程序和数据库的关系 网站服务器登陆 世界服务器市场报告 自考软件开发专业哪个好 怎么看自己绝地求生是什么服务器 远程服务器报3389失败 安徽单据外贸软件开发 网络安全感知预警系统 网络安全装置b码422信号 删除一条数据库语句 软件数据库软件有哪些功能 excel平台和服务器的区别 新能源软件开发合同模板 蚂蚁矿机怎么用代理服务器 移动光纤猫怎样登录服务器 为什么仙境家园显示服务器维护 质量安全追溯数据库应用论文 java开发数据库书籍 阿里云 服务器 带宽 网络安全的六个一律 如何结合本地数据库api 印度软件开发人员的平均工资 谷歌dnf无法连接服务器 安徽单据外贸软件开发 服务器主板电池怎么扣下来 中国企业协会网络安全专刊 质量安全追溯数据库应用论文 江苏工业软件开发靠谱吗 云南专业软件开发外包 极光虚拟服务器广播剧
    0