1. 单个简单类型参数:
mybatis会自动的进行类型推断, 因此parameterType属性可以不用写
简单类型包括:
1. byte short int long float double char
2. Byte Short Integer Long Float Double Character
3. String
4. java.util.Date
5. java.sql.Date
单个参数Long类型:
parameterType属性的作用:
告诉mybatis框架, 我的这个方法的参数类型是什么类型
mybatis框架自带有类型自动推断机制, 所以大部分情况下parameterType都是可以省略不写的
sql语句最终是这样的:
select * from student where id = ?
JDBC的代码一定要给?传值的 , 怎么传值
ps.setXxx(第几个问号, 传什么值)
ps.setLong(1, 1L)
ps.setString(1, "张三")
mybatis底层就调用setXxx的哪个方法, 取决于parameterType的属性
// StudentMapper.xml
<select id="selectById" resultType="Student" parameterType="java.lang.Long">
select * from student where id = #{id}
</select>
// 接口
public interface StudentMapper{
List<Student> selectById(Long long);
}
// @test
public static void main(String[] args){
SqlSession SqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = SqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.selectById(1L);
students.forEach(student -> System.out.println(student));
SqlSession.close();
}
单个参数Date类型:
// StudentMapper.xml
<select id="selectByBirth" resultType="Student">
select * from student where birth = #{birth}
</select>
// 接口
public interface StudentMapper{
List<Student> selectByBirth(Date birth);
}
// @test
public static void main(String[] args){
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birth = sdf.parse("2020-10-10");
List<Student> students = mapper.selectByBirth(birth);
students.forEach(student -> System.out.println(student));
sqlSession.close();
}
// char --> Character
Character sex = Character.valueOf('男');
List<Student> students = mapper.selectBySex(sex);
2. Map参数:
// StudentMapper.xml
// #{}里面写的是map集合的key
// 此处parameterType="map"省略不写也可以
<insert id="insertStudentByMap" parameterType="map">
insert into student(id,name,age,sex,birth,height)
values(null,#{姓名},#{年龄},#{性别},#{生日},#{身高})
</insert>
// 接口
public interface StudentMapper{
int insertStudentByMap(Map<String,Object> map);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("姓名","李四");
map.put("年龄",6);
map.put("身高",179);
map.put("性别",'男');
map.put("生日",new Date());
mapper.insertStudentByMap(map);
sqlSession.commit();
sqlSession.close();
}
3. 实体类参数:
// StudentMapper.xml
// 此处parameterType="Student"省略不写,也可以
<insert id="insertStudentByPOJO" parameterType="Student">
insert into student(id,name,age,sex,birth,height)
values(null,#{name},#{age},#{sex},#{birth},#{height})
</insert>
// 接口
public interface StudentMapper{
// student是单个参数, 不是简单类型
int insertStudentByPOJO(Student student);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = new Student(.....需要传的参数......);
mapper.insertStudentByPOJO(student);
sqlSession.commit();
sqlSession.close();
}
4. 多参数:
4.1 arg0和arg1:
// StudentMapper.xml
<select id="selectByNameAndSex" resultType="Student">
select * from student where name = #{arg0} and sex = #{arg1}
</select>
// 接口
public interface StudentMapper{
// 多个参数!
// mybatis底层会自动创建一个Map集合, 并且Map集合是以下面这种方式存储参数的.
// map.put("arg0",name);
// map.put("arg1",sex);
// map.put("param1",name);
// map.put("param2",sex);
List<Student> selectBYNameAndSex(String name,Character sex);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.selectByNameAndSex("张三",'男');
students.forEach(student -> System.out.println(student));
sqlSession.close();
}
4.2 使用@Param注解:
使用了@Param注解之后, 再使用arg0/arg就会报错, 使用param1/param2则不会
核心: @Param("这里填写的其实就是map集合的key")
// StudentMapper.xml
// 此时大括号里面可以使用name,sex,param1, param2
<select id="selectByNameAndSex2" resultType="Student">
select * from student where name = #{name} and sex = #{sex}
</select>
// 接口
public interface StudentMapper{
// 多个参数!
// mybatis框架底层的实现原理
// map.put("name",name);
// map.put("sex",sex);
List<Student> selectBYNameAndSex2
(@Param("name") String name, @Param("sex") Character sex);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.selectByNameAndSex2("张三",'男');
students.forEach(student -> System.out.println(student));
sqlSession.close();
}