Mybatis05-参数和返回
一、传参
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 参数
示例:
@Testpublic 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">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefrom t_carwhere id = #{id}</select>
2-2、返回 List<POJO>
示例:
List<Car> selectAll();
<select id="selectAll" resultType="car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_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>
这种情况表示:
-
最外层是一个
Map
,key 是某个字段的值(例如id
、name
等) -
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 > #{age}
</select>
注意:XML 中
>
要写成>
2-7-3、返回类型可以是 int
或 long
SQL | 推荐返回类型 |
---|---|
COUNT(*) | long (更保险,尤其是大表) |
业务能确保不会超过 21 亿 | int |
Long count = studentMapper.countSomething();