一、输入映射
前言:Mybatis的配置文件中的select,insert,update,delete有一个属性parameter来接收mapper接口方法中的参数。可以接收的类型有简单类型和复杂类型,但是只能是一个参数。这个属性是可选的,因为Mybatis可以通过TypeHandler来判断传入的参数类型,默认值是unset.
1.各种java的基本数据类型。常用的有int,String等。
<!--
根据ID查询
parameterType="参数的类型",目前只支持一个参数
where teamId=#{id}: #{id}表示参数 id-自定义,只需要符合命名规范即可,没有实际对应意义
-->
<select id="queryById" parameterType="int" resultType="com.kxb.demo.pojo.Team">
select * from team where teamId=#{id}
</select>
<!--删除一个球队 -->
<delete id="del" >
delete from team where teamId=#{id}
</delete>
这两条语句发现输入映射即使省略了也可以执行成功,但是最好不要省,按照规范来写,养成好习惯。
用#{变量名}来取值,这里的变量名是任意的,可以用value或者是其它的什么值,这里用id是为了便于理解,并不存在什么对应关系的。因为java反射主只能够得到方法参数的类型,而无从知道参数的名字的。
2.各种类型的bean,.取值用#{属性名}。这里的属性名是和传入的bean中的属性名一一对应的,不是你随意命名的。
<update id="update" parameterType="com.kxb.demo.pojo.Team">
update team set teamName=#{teamName},location=#{location}
where teamId=#{teamId}
</update>
<!--添加一个球队
parameterType="com.kkb.pojo.Team" 将对象作为参数,
#{值} 值必须是实体类中的属性名称,其实就是占位符?
-->
<insert id="add" parameterType="com.kxb.demo.pojo.Team" >
INSERT INTO `team` (`teamName`, `location`, `createTime`)
VALUES (#{teamName}, #{location}, #{createTime})
</insert>
3.Map
传入map类型,直接通过#{keyname}就可以引用到键对应的值。使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。
mapper接口:
List<Team> queryByRange2(@Param("min") Integer min, @Param("max") Integer max);
<!--方式1:通过注解的方式:
#{}中的名称必须与接口的方法中的参数注解@Param()保持一致
select * from team where teamId >=#{param1} and teamId <= #{param2}; 不推荐,但是语法也是正确的,但是不能使用arg0,arg1......
-->
<select id="queryByRange2" resultType="com.kkb.pojo.Team">
select * from team where teamId >=#{min} and teamId <= #{max};
</select>
mapper接口:
List<Team> queryByRange3(Map<String,Object> map);
<!--方式2:通过map来传递多个参数:映射文件中的参数占位符必须和map中的String类型的字段名称一样-->
<select id="queryByRange3" resultType="com.kkb.pojo.Team">
select * from team where teamId >=#{min} and teamId <= #{max};
</select>
@Test
public void test03(){
TeamMapper teamDao= sqlSession.getMapper(TeamMapper.class);
Map<String, Object> map=new HashMap<>();
map.put("min",1001);
map.put("max",2000);
List<Team> teamList3 = teamDao.queryByRange3(map);
for (Team team : teamList3) {
System.out.println(team);
}
}
4.List类型,用语句来进行迭代
mapper接口中添加方法:
void addList(List<Team> list);
<!--批量添加-->
<insert id="addList" >
INSERT INTO team (teamName,location) VALUES
<!--collection:要遍历的集合;参数是集合类型,直接写list
item:遍历的集合中的每一个数据
separator:将遍历的结果用,分割-->
<foreach collection="list" item="t" separator=",">
(#{t.teamName},#{t.location})
</foreach>
</insert>
//批量添加
List<Team> list = new ArrayList<>();
for (int i = 0; i <10 ; i++) {
Team team = new Team();
team.setTeamName("火箭");
list.add(team);
}
teamDao.addList(list);
sqlSession.commit();
<foreach collection="list" item="t" separator=",">当中collection名字不能随便取,要和实参一样。parameterType可以省略。
5.对象类型中的集合属性
对于单独传递的List或Array,在SQL映射文件中映射时,只能通过list或array来引用。但是如果对象类型有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。
mapper接口:
List<User> selectByExample(UserExample example);
< where >
< foreach collection = "oredCriteria" item = "criteria" separator = "or" >
< if test = "criteria.valid" >
在这里,UserExample有一个属性叫oredCriteria,其类型为List,所以在foreach元素里直接用属性名oredCriteria引用这个List即可。
item="criteria"表示使用criteria这个名字引用每一个集合中的每一个List或Array元素