Mybatis05-参数和返回

发布于:2025-07-15 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、传参

1-1、简单类型

简单类型包括:

  • byte short int long float double char(基本数据类型)
  • Byte Short Integer Long Float Double Character(包装类)
  • String
  • java.util.Date
  • java.sql.Date
类型 用途 特点
java.util.Date 通用日期时间类,Java 标准库的一部分 包含日期 + 时间信息
java.sql.Date 专门用于 JDBC,表示 SQL 中的 DATE 类型(只有日期 时间会被清零(00:00:00)

 

1、基本类型或单个参数

示例:

Student selectById(Long id);

对应的 Mapper XML:

<select id="selectById" resultType="Student" parameterType="java.lang.Long">
    SELECT * FROM t_student WHERE id = #{id}
</select>

说明:

  • 只有一个参数时,#{} 中写任意名字都可以(推荐使用参数名)。

  • parameterType 是可选的,但写上更规范。因为Mybatis框架自身带有类型自动判断机制,所以,大部分情况下paramterType属性都是可以省略不写的

SQL语句最终是这样的:

select * from t_student where id = ?

JDBC代码是一定要给?传值的。

怎么传值?ps.setXxx(第几个问号,传什么值);

ps.setLong(1, 1L);

ps.setString(1, "zhangsan");

ps.setDate(1, new Date());

ps.setInt(1, 100); ...

mybatis底层到底调用setXxx的哪个方法,取决于parameterType属性的值。

【注意】:

parameterType的值是可以起别名的,Mybatis本身自定义了许多别名:

具体可以查看配置文件:

配置_MyBatis中文网

1-2、传递 Map 参数

示例:

    @Test
    public void testInsertStudent() throws ParseException {
        SqlSession sqlSession = SqlSessionUtils.openSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date birth = simpleDateFormat.parse("1996-09-09");

        Map<String, Object> map = new HashMap<>();
        map.put("key1", "王五");
        map.put("key2", 15);
        map.put("key3", 1.65);
        map.put("key4", birth);
        map.put("key5", '女');

        int count = studentMapper.insertStudent(map);
        System.out.println(count);

        sqlSession.commit();
        sqlSession.close();
    }
int insertStudent(Map<String, Object> map);
    <insert id="insertStudent" parameterType="map">
        insert into t_student
        (id, name, age, height, birth, sex)
        value
        (null, #{key1}, #{key2}, #{key3}, #{key4}, #{key5})
    </insert>

【注意】:

  • Map 中的 key 对应 #{} 的名字。

  • paramterType可以省略!

1-3、传递 Java 对象(POJO)

示例:

int insertStudent(Student student);
<insert id="insertStudent" parameterType="Student">
    INSERT INTO t_student(name, age, gender)
    VALUES(#{name}, #{age}, #{gender})
</insert>

 说明:

  • MyBatis 会自动读取 student.getName()student.getAge()

  • #{} 中写的是属性名

  • parameterType可以省略!

  • parameterType可以写全类名

  • parameterType可以写别名student,应为配置了:

1-4、多个参数

1、方式一: 

mybatis自动创建的map,key是索引,value是参数名。 

【备注】:

1、此时xml中不需要写parameterType,因为,多个参数,类型可能不一致!

2、此方法可读性比较差! 

 

2、方式二:使用 @Param 注解(推荐)

相当于告诉mybatis,自动创建的map,key的名字是通过 @Param 注解指定的!

示例:

 

二、查询语句的返回值

2-1、返回单个 POJO 对象

示例:

Car selectById(String carNum);
    <select id="selectById" resultType="com.wsbazinga.bank.pojo.Car">
        select
            id,
            car_num as carNum,
            brand,
            guide_price as guidePrice,
            produce_time as produceTime,
            car_type as carType
        from t_car
        where id = #{id}
    </select>

2-2、返回 List<POJO>

示例:

List<Car> selectAll();
    <select id="selectAll" resultType="car">
        select
            id,
            car_num as carNum,
            brand,
            guide_price as guidePrice,
            produce_time as produceTime,
            car_type as carType
        from
            t_car
    </select>

【注意】:

若是返回的结果是list,但是返回参数却是pojo,则会报错!TooManyResultException

2-3、返回 Map

若是返回的数据,没有合适的实体类对应的话,可以采用map集合接收,字段名叫key,字段值叫value。

示例:

Map<String, Object> selectReMap(Long id);

【注意】:

此时返回的结果要是单条数据!

2-4、返回 List<Map>

若是返回的数据,没有合适的实体类对应的话,可以采用map集合接收。

示例:

List<Map<String, Object>> selectReMap2(String brand);

2-5、返回值类型是 Map<String, Map>

这种情况表示:

  • 最外层是一个 Mapkey 是某个字段的值(例如 idname 等)

  • value 是一条记录,用 Map<String, Object> 表示字段名和字段值

【目的】:

方便查找数据!

MyBatis 提供了 @MapKey 注解,让你将某一列作为 Map 的 key。 

示例:

2-6、使用 resultMap(复杂映射)

查询结果的列名,和java对象的属性名对应不上怎么办?

方式1、起别名:

方式2:使用resultMap进行结果映射

Car selectReResMap(Long id);

 

方式3:是否开启驼峰命名自动映射

前提:

java命名规范:首字母小写,后面每个单词,首字母大写。

sql命名规范:全部小写,单词之间下划线分割。

实体类中的属性名 数据库表的列名
carNum car_num
carType car_type

开启该功能,在mybatis-config.xml中配置:

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

2-7、MyBatis 查询总记录条数

当然可以!MyBatis 查询总记录条数是非常常见的需求,通常用于:

  • 分页(PageHelper、手动分页)

  • 数据分析(如统计注册用户数量)

  • 判断是否存在数据(返回条数是否大于0)


2-7-1、基本查询:使用 COUNT(*)


1. Mapper 接口定义

int countAllStudents();

2. 对应 Mapper XML

<select id="countAllStudents" resultType="int">
    SELECT COUNT(*) FROM t_student
</select>

3. 使用方式

int count = studentMapper.countAllStudents();
System.out.println("总人数:" + count);

2-7-2、带条件查询总数(如:查询年龄大于20的学生数量)


1. Mapper 方法

int countByAge(int age);

2. Mapper XML

<select id="countByAge" resultType="int" parameterType="int">
    SELECT COUNT(*) FROM t_student WHERE age &gt; #{age}
</select>

注意:XML 中 > 要写成 &gt;


2-7-3、返回类型可以是 intlong

SQL 推荐返回类型
COUNT(*) long(更保险,尤其是大表)
业务能确保不会超过 21 亿 int
Long count = studentMapper.countSomething();

网站公告

今日签到

点亮在社区的每一天
去签到