MyBatis映射器用法
映射器通常来处理ORM映射关系,这也是MyBatis半自动的体现,在MyBatis中我们通常以注解或者xml文件的方式来实现映射器,下面我会一一介绍
如何使用映射器
映射器的组成
sql语句
例:
<!--查询-->
<select id="findAllStudents" resultType="Student">
select * from student
</select>
<!-- 添加 keyProperty="sid" useGeneratedKeys="true" 后启用主键回填 -->
<insert id="addStudent" parameterType="Student" keyProperty="sid" useGeneratedKeys="true">
insert into student (sname,birthday,ssex,classid)
values(#{sname},#{birthday},#{ssex},#{classid})
</insert>
<!--修改-->
<update id="updateStudent" parameterType="Student" >
update student set sname=#{sname}, birthday=#{birthday},ssex=#{ssex},classid=#{classid}
where sid=#{sid}
</update>
<!--删除-->
<delete id="delDtudent" parameterType="int">
delete from student where sid=#{sid}
</delete>
其中parameterType表示返回值类型
映射关系
这里通常是因为业务中使用到了多表联查或者是表名和字段名与实体类名和属性名不一致时,来对结果进行映射
例:
多表一对一
<!-- 结果映射,多表一对一 -->
<resultMap type="Student" id="stu_class_map">
<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"/>
<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>
多表一对多
<!--结果映射,多表一对多 -->
<resultMap type="Banji" id="banji_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="findAllBanji" resultMap="banji_stu_map">
select * from class
left join student on student.classid = class.classid
</select>
在使用sqlmapper映射器,需要满足以下几个前提条件
-
sqlMapper文件要和接口在同一个包下
-
sqlMapper文件名要和接口名一致
-
接口的方法名要和sqlMapper中的id值一致
-
sqlMapper中的namespace的值要指向接口路径
-
接口的入参类型要和sqlMapper中的parameterType类型一致
-
接口的返回值类型要和sqlMapper中的resultType类型一致
上面是在使用xml文时的配置方式
下面介绍的是注解的使用
和xml文件一样分为sql语句和映射关系
sql语句
@Select
@Select("select * from student")
public OrderContent findAllStudents();
@Update
@Update("update student set sname=#{sname}, birthday=#{birthday},ssex=#{ssex},classid=#{classid} where sid=#{sid}")
public int updateStudent(int sid);
@Insert
@Insert("insert into student (sname,birthday,ssex,classid) values(#{sname},#{birthday},#{ssex},#{classid})")
public int addStudent(Student student);
@Delete
@Delete("delete from student where sid=#{sid}")
public int delDtudent(int sid)
其中注解括号内写sql语句方法的返回值根据注解类型来确定,方法的参数也以注解类型确定
映射关系
@Results
@Results(id = "ordcmap",value = {
@Result(column = "oc_id",property = "ocid"),
@Result(column = "uo_id",property = "uoid"),
@Result(column = "f_id",property = "fid"),
@Result(column = "f_quantity",property = "fquantiy"),
})
这里是处理字段名和属性名对应不上的情况
我们只需要在定义过@Results注解的属性后,在使用@Select等注解时增加一个@ResultMap(“ordcmap”),括号内就是@Results的id属性
在一对一和一对多中的使用
@Results({
@Result (column="cid" ,property="cid"),
@Result( column="cid" ,property="course",
<!-- @One 实现一对一-->
one=@One(select = "com.day4.mapper.CourseMapper.FindAllCoursebyid"))
})
@Select("select * from teacher")
public List<Teacher> FindAllTeacher();
@Results({
@Result (column="cid" ,property="cid"),
@Result( column="cid" ,property="tlsit",
<!-- @Many 实现一对多-->
many=@Many(select = "com.day4.mapper.TeacherMapper.FindAllTeacherbyid"))
})
@Select("select * from course")
public List<Course> FindAllCourser();
many=@Many(select = "com.day4.mapper.TeacherMapper.FindAllTeacherbyid"))
})
@Select("select * from course")
public List<Course> FindAllCourser();