MyBatis(三)动态代理和映射器

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,参数转义

符号小于小于等于大于大于等于单引号双引号
原符号<<=>>=&'"
替换符号&lt;&lt;=&gt;&gt;=&amp;&apos;&quot;

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 结构 

<constructor>  用与配置构造方法的元素。
<id> 标识主键列,允许多个主键。
<result>POJO到SQL列名的映射关系。
9,单表查询
	<!-- 映射关系 	单表的查询 只写映射不上的字段和属性	-->
	<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,级联的缺陷

新能缺陷:级联操作会降低性能,增加程序的执行时间;

复杂度缺陷:关联较多造成复杂度的增加,不利于他人的理解和维护;

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手可摘鑫晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值