Mybatis映射器主要是java与数据库之间交互的映射。
映射主要由SQL语句和映射关系组成,SQL语句分为增删改查;映射关系分为入参映射、结果集映射。
SqlMapper.xml文件映射
步骤及方法:
我们在搭载好bean层,Dao层的环境后,导入xml文件,文件中的配置和Mapper层的命名应该注意一下6点:
1. SqlMapper.xml文件中的namespace与mapper接口类路径相同
2.mapper接口和SqlMapper.xml在同一个包下
3.mapper接口和SqlMapper.xml名字相同
4.mapper接口的方法名SqlMapper.xml中的id一致,并且接口的方法名不可以重载,因为id唯一
5.mapper接口的入参类型和SqlMapper.xml中parameterType类型一致
6.mapper接口的入参类型与SqlMapper.xml中的ResultType类型中每个元素的类型一致
先写简单的增删改查的映射
//查找结果集是所有的login
<select id="findAllLogin" resultType="login">
select * from login
</select>
//查找结果集是所有的name的string类型
<select id="findAllName" resultType="string" >
select lname from login
</select>
//查找结果集是编号小于入参为int型的所有login
<select id="findNum" resultType="login" parameterType= "int">
select * from login where lid < #{v}
</select>
//添加login对象 没有结果集
<insert id="addLogin" parameterType= "login">
insert into login (lname,lsex,lpwd)
values (#{lname},#{lsex},#{tpwd})
</insert>
//删除 根据编号删除入参为int的login对象 没有结果集
<delete id="deleteLogin" parameterType= "int">
delete from login where lid=#{lid}
</delete>
//修改入参类型为login型的login对象
<update id="updateLogin" parameterType= "login">
update login set lname = #{lname},lsex=#{lsex},lpwd = #{lpwd},
where lid = #{lid}
</update>
而在一对一的关系中,比如学生和班级的关系中,在学生角度来看,一个学生对应一个班级,属于一对一的关系。在做全查的时候首先要把班级当做外部属性添加到学生实体类中,然后再xml文件中就需要用到resultMap结果集来映射,resultMap中的type类型写主类的,result标签可以只写主类映射不上(属性名和字段名不同的)的属性和字段,需要注意的是一对一映射用的是association标签,property属性写的是主类实体类中外部属性的成员变量名。
<resultMap type="student" id="stu_class_Map">
<result column="sid" property="sid"/>
<result column="classid" property="classid"/>
<association property="bj">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
</association>
</resultMap>
<select id="findStudentAndClass" resultMap="stu_class_Map">
select * from student left join class on student.classid = class.classid
</select>
在一对多的关系中,比如学生和班级的关系中,在班级角度来看,一个班级对应多个学生,属于一对多的关系。在做全查的时候首先要把学生类当做外部属性添加到班级实体类中,然后再xml文件中就需要用到resultMap结果集来映射,resultMap中的type类型还是写主类的,而一对多的result标签必须写每个属性和字段,需要注意的是一对多映射用的是collection标签,property属性写的是主类的实体类中外部属性的成员变量名,ofType属性写的是property的实体类
<resultMap type="banji" id="class_stu_Map">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
<collection property="slist" ofType="student">
<result column="sid" property="sid"/>
<result column="sname" property="sname"/>
<result column="ssex" property="ssex"/>
<result column="birthday" property="birthday"/>
<result column="classid" property="classid"/>
</collection>
</resultMap>
<select id="findClassAndStudent" resultMap="class_stu_Map">
select * from class left join student on class.classid = student.classid
</select>
当然了,大家有可能会想到,多对多的关系怎么实现,然而在实际的开发过程中,我们是尽可能的避免这样的关系,解决的方式可能更多的是找一个中间实体类,转换角度来分析。以上就是用SqlMapper.xml文件来实现映射,还有一种方法是注解类型的实现方式,不管哪种方式原理都是相同的,而且各有千秋。