1,动态代理的规范
(1)Mapper.xml文件中的namespace与mapper接口的类路径相同。
(2)Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
(3)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
(4)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。
(5)sqlmpper 和 接口要在同一个包下。
(6)sqlmapper文件名和接口的类名要一致。
2,映射器的好处
(1)半自动化的体现:配置 SQL 语句,体现了半自动化和灵活性。
(2)ORM的体现:对象关系映射的实现,数据库表和 POJO 类的映射关系。
3,select元素结构
属性 | 说明 |
---|---|
id
|
唯一标识,接口中的方法名;
|
parameterType
|
参数的类型;
|
resultType
|
结果的类型;
|
resultMap
|
复杂的结果集映射关系;
|
<select id="findStudentAllName" resultType="string">
select sname from student
</select>
<select id="findStudentByClassidAndSsex" parameterType="Student" resultType="Student">
select * from student where classid = #{classid} and ssex = #{ssex}
</select>
<select id="findStudentPage" parameterType="map" resultType="Student">
select * from student where ssex = #{sex} limit #{kk}, #{sizepage}
</select>
注:mybatis中为什么方法不能重载?
因为mybatis中的id是唯一的,id名又和接口方法名一致,所有方法不能重载。
4,参数转义
符号 | 小于 | 小于等于 | 大于 | 大于等于 | 和 | 单引号 | 双引号 |
---|---|---|---|---|---|---|---|
原符号 | < | <= | > | >= | & | ' | " |
替换符号 | < | <= | > | >= | & | ' | " |
5,insert元素
属性 | 说明 |
---|---|
id |
唯一标识,接口中的方法名;
|
parameterType |
参数的类型;
|
keyProperty |
表示以哪个列作为属性的主键,不能和 keyColumn 同时使用;
|
keyColumn |
指明哪一列是主键,不能和 keyProperty 同时使用;
|
useGenerateedKeys |
使用 JDBC 的 getGeneratedKeys 方式来取有数据库内部生成的主键;
|
<insert id="addStudent" parameterType="com.ape.bean.Student" keyProperty="sid" useGeneratedKeys="true">
insert into student(sname,birthday,ssex,classid) values(#{sname},#{birthday},#{ssex},#{classid})
</insert>
6,update元素和delete元素
<delete id="delStudent" parameterType="int" >
delete from student where sid = #{v}
</delete>
<update id="updateStudent" parameterType="com.ape.bean.Student">
update student set sname=#{sname},birthday=#{birthday},ssex= #{ssex},classid = #{classid} where sid=#{sid}
</update>
7,resultMap元素的作用:
(1)定义映射规则:ORM的特性,POJO类和数据库的映射关系。
(2)级联操作:多表存在主外键时,主表和从表之间的关联操作。
(3)类型转换:数据库字段的类型和POJO类属性的类型转换。
8,resultMap 结构
<!-- 映射关系 单表的查询 只写映射不上的字段和属性 -->
<resultMap type="Smaster" id="SmasterMap">
<!-- column 字段 property 属性 -->
<!-- 主键的映射 -->
<!-- <id column="" property=""/> -->
<!-- <result column="smid" property="smid"/> -->
<result property="smname" column="sm_name" />
<!-- <result column="smsex" property="smsex"/> -->
</resultMap>
<select id="findAllSm" resultMap="SmasterMap">
select * from schoolmaster
</select>
10,多表联查(一对一)
(1)在实体类中添加联表的对象
// 外部属性
private Banji bj;
(2)在XML文件中使用association
<!-- 多表必须全部写 -->
<resultMap type="Student" id="stu_class_Map">
<result column="sid" property="sid"/>
<result column="sname" property="sname"/>
<result column="birthday" property="birthday"/>
<result column="ssex" property="ssex"/>
<result column="classid" property="classid"/>
<!-- Banji 类型的属性
association 一对一
-->
<association property="bj">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
</association>
</resultMap>
<select id="findAllStudent" resultMap="stu_class_Map" >
select * from student
inner join class on student.classid = class.classid
</select>
(3)测试
SqlSession sqlSession = DaoUtil.getSqlSession();
StudentMapper stumapper = sqlSession.getMapper(StudentMapper.class);
BanjiMapper bjmapper = sqlSession.getMapper(BanjiMapper.class);
List<Student> slist = stumapper.findAllStudent();
for(Student s : slist) {
System.out.println(s); }
DaoUtil.closeSource(sqlSession);
11,多表联查(一对多)
(1)在实体类中添加级联表的对象list集合:
private List<Student> slist;
(2)在XML中指定元素的类型
<resultMap type="Banji" id="bj_stu_Map">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
<!-- 一对多 collection
property 集合的属性名
ofType 集合中每个元素的类型
-->
<collection property="slist" ofType="Student" >
<result column="sid" property="sid"/>
<result column="sname" property="sname"/>
</collection>
</resultMap>
<select id="findAllBanji" resultMap="bj_stu_Map">
select * from class
left join student on class.classid = student.classid
order by class.classid
</select>
(3)测试
SqlSession sqlSession = DaoUtil.getSqlSession();
StudentMapper stumapper = sqlSession.getMapper(StudentMapper.class);
BanjiMapper bjmapper = sqlSession.getMapper(BanjiMapper.class)
List<Banji> bjlist = bjmapper.findAllBanji();
for(Banji bj : bjlist) {
// System.out.println(bj);
System.out.println("班级信息"+bj.getClassid()+"班级名称"+bj.getClassname());
for(Student s : bj.getSlist()) {
System.out.println(s);
}
System.out.println("-----------------------------");
}
DaoUtil.closeSource(sqlSession);
12,级联的缺陷
新能缺陷:级联操作会降低性能,增加程序的执行时间;
复杂度缺陷:关联较多造成复杂度的增加,不利于他人的理解和维护;