一、单个简单类型参数
简单类型包括:
(七种基本数据类型)byte short int long float double char
(其中包装类)Byte Short Integer Long Float Double Character
String
java.util.Date
java.sql.Date
需求:根据name查、id查、birth查、sex查
准备一张表:t_student
准备表中数据:
搭框架省略(创建模块)
pojo:Student类 构造方法有参无参 setter getter方法 toString方法。
mapper:StudentMapper接口类以及StudentMapper.xml核心配置文件
util:工具类 返回session对象
resources:核心配置文件:
mybatis-config.xml
jdbc.properties
test:测试类 StudentMapperTest
1.接口中单个参数并且是简单数据类型
接口:
/**
* 当接口中的方法参数只有一个(单个参数),并且参数的数据类型都是简单类型
* 根据id查询 name查询......
*/
List<Student> selectById(Long id);
List<Student> selectByName(String name);
List<Student> selectByBirth(Date name);
List<Student> selectBySex(Character name);
mapper.xml
<select id="selectById" resultType="student">
select * from t_student where id=#{id}
</select>
<select id="selectByName" resultType="student">
select * from t_student where name=#{name}
</select>
<select id="selectByBirth" resultType="student">
select * from t_student where birth=#{birth}
</select>
<select id="selectBySex" resultType="student">
select * from t_student where sex=#{sex}
</select>
<select id="selectById" resultType="student"> select标签中实际上还有一种属性parameterType="long"简单数据类型可省略 所以通常不写。Mybatis有自动类型推断机制。
测试:
@Test
public void testSelectById() throws IOException, ParseException {
SqlSession session = SqlSessionUtil.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
//id
List<Student> students = mapper.selectById(1L);
//sex
Character sex = Character.valueOf('男');
List<Student> students1s = mapper.selectBySex(sex);
//birth
SimpleDateFormat spf = new SimpleDateFormat("yyyy-MM-dd"); //指定类型
Date parse = spf.parse("1999-09-30"); //将字符串转为date类型
List<Student> students2s = mapper.selectByBirth(parse);
students.forEach(student->{
System.out.println("根据id");
System.out.println(student);
});
students1s.forEach(students1->{
System.out.println("根据sex");
System.out.println(students1);
});
students2s.forEach(students2->{
System.out.println("根据birth");
System.out.println(students2);
});
session.close();
}
运行结果:
2.单个参数,类型是Map集合
接口:
/**
* 通过map集合保存学生信息,单个参数,但是参数的类型不是简单数据类型,是map集合
* @param map
* @return
*/
int insertStudentByMap(Map<String,Object> map);
mapper.xml:
<insert id="insertStudentByMap">
insert into t_student(id,name,age,sex,birth,height)
values(null,#{name},#{age},#{sex},#{birth},#{height})
</insert>
测试:
@Test
public void testInsertByMap() throws IOException, ParseException {
SqlSession session = SqlSessionUtil.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("name","小小川");
map.put("age",24);
Character sex = Character.valueOf('女');
map.put("sex",sex);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1998-09-29");
map.put("birth",date);
map.put("height",1.78);
int count = mapper.insertStudentByMap(map);
System.out.println(count);
session.commit();
session.close();
}
运行结果:
3.单个参数,类型是POJO类
直接new对象 不赘述
二、多个参数
1.用map
* 如果是多个参数 Mybatis框架是如何做的?
* mybatis框架会自动创建一个map集合,并且map集合是以这种方式存储参数的
* map.put("arg0",name);
* map.put("arg1",sex);
* 或者
* map.put("param1",name);
* map.put("param2",sex);
* 混着用也可以
接口:
/**
* 根据name和sex查询student信息
* @param name
* @param sex
* @return
*/
List<Student> selectByNameAndSex(String name,Character sex);
mapper.xml文件
<select id="selectByNameAndSex" resultType="student">
select * from t_student
where name=#{arg0} and sex=#{arg1}
</select>
测试:
@Test
public void testSelectByNameAndSex() throws IOException, ParseException {
SqlSession session = SqlSessionUtil.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> students = mapper.selectByNameAndSex("小小川",'女');
students.forEach(student -> {
System.out.println(student);
});
session.close();
}
运行结果:
2.用Param注解
可以自己指定map集合的key,通过注解告诉mybatis
接口:
/**
* 根据name和sex查询student信息 param注解
* @param name
* @param sex
* @return
*/
List<Student> selectByNameAndSex2(@Param("name") String name, @Param("sex") Character sex);
mybatis框架底层的实现原理:
* map.put("name",name);
* map.put("sex",sex);
mapper.xml
<select id="selectByNameAndSex2" resultType="student">
select * from t_student
where name=#{name} and sex=#{sex}
</select>
测试:与2.1一致 改方法名即可
运行结果:同2.1
使用了@Param注解之后,arg0、arg1失效;param1、param2还可以用
Param注解源码分析
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper实际上是指向了代理对象
mapper.selectByNameAndSex("小小川",'女');
selectByNameAndSex是代理方法