SQL映射文件
SQL映射文件中的几个顶级元素介绍如下:
- mapper:SQL映射文件的根元素。只有一个namespace,用于区分不同的mapper,必须全局唯一。
- cache:为给定命名空间配置缓存。
- cache-ref:引用其他命名空间中的缓存配置。
- resuitMap:用来描述查询结果集中的字段和Java实体类属性的对应关系。
- sql:定义可重用的SQL语句块,可以在其他语句映射中引用,提高代码编写和维护SQL语句的效率。
- insert:映射insert语句。
- select:映射select语句。
- update:映射update语句。
- delete:映射delete语句。
MyBatis进行CURD:
方式1: 基于映射文件+SqlSession
特点: 依赖SqlSession对象方法,实现CURD.比如selectList(),selectOne(),insert()…
方式2: 基于映射文件+Mapper接口
特点: 在Mapper接口中定义关于CURD操作的接口方法,然后由MyBatis通过JDK动态代理生成接口的实现类.
因此,在使用时,直接通过Mapper接口对象,调用相关方法即可实现CURD.
备注:
Mapper接口方式底层依然是基于SqlSession。
CURD方案区别
Mapper接口与业务标签的关系:
Mapper接口定义要求:
1.Mapper接口的类全名必须与映射文件的namespace值相同.
2.Mapper接口的方法名必须与映射文件中业务标签的id值相同.
3.Mapper接口的方法的参数类型必须与映射文件中业务标签的parameterType相同
4.Mapper接口的方法的返回值类型必须与映射文件中业务标签的resultType相同.
简化: Mapper接口与映射文件的内容一一对应。
注意:
习惯上,SQL映射文件与该Mapper接口放置在同一包路径下。
在不同的SQL映射文件中,子元素的ID可以相同。
MyBatis框架的条件查询
模糊查询:
在UserMapper中添加查询方法:
public List<User> getUserByName(String name);
在UserMapper.xml中添加SQL语句映射:
<select id="getUserByName" parameterType="string" resultType="user">
select * from user where name like CONCAT('%', #{name}, '%')
</select>
在测试类中添加测试方法:
public void getuserByname(){
SqlSession session = MyBatisUtils.getSqlSession();
String name = "张";
List<User> list = session.getMapper(UserMapper.class).getUserByName(name);
System.out.println(list);
MyBatisUtils.close(session);
}
将修改条件封装成Java对象作为入参。
在UserMapper接口中添加方法:
public int editUser(User user);
在UserMapper.xml中添加SQL语句映射:
<update id="editUser" parameterType="user">
update user set name=#{name} where id=#{id}
</update>
在测试类添加方法:
public void updateuser(){
SqlSession session = MyBatisUtils.getSqlSession();
User user = new User(5,"赵六",'男',22,"北京");
int re = session.getMapper(UserMapper.class).editUser(user);
System.out.println(re!=-1?"操作成功":"操作失败");
session.commit();
MyBatisUtils.close(session);
}
将修改条件封装成Map对象入参:
在UserMapper接口中添加方法:
public int editUser(Map<String,Object> usermap)
在UserMapper.xml添加SQL语句映射:
<update id="updatebran" parameterType="map">
update user set `name`=#{name} where id=#{id}
</update>
添加测试方法:
public void updateuser(){
SqlSession session = MyBatisUtils.getSqlSession();
Map<String,Object> usermap = new HashMap<String,Object>
usermap.put("id",2)
usermap.put("name","李四")
int re = session.getMapper(UserMapper.class).editUser(usermap);
System.out.println(re!=-1?"操作成功":"操作失败");
session.commit();
MyBatisUtils.close(session);
}
SQL语句使用Map的key来取得参数值
使用@Param注解实现多参数入参:
在UserMapper接口添加查询方法:
public List<User> getUserByIdAndName(@Param("id") int id, @Param("name") String name);
在UserMapper.xml文件中添加SQL语句映射:
<select id="getUserByIdAndName" resultType="user">
select * from user where name like CONCAT('%' ,#{name},'%') and id=#{id}
</select>
在测试类中添加方法:
public void getUser(){
SqlSession session = MyBatisUtils.getSqlSession();
List<User> list = session.getMapper(UserMapper.class).getUserByIdAndName(1,"张");
System.out.println(list);
session.commit();
MyBatisUtils.close(session);
}
MySQL框架的结果映射
认识关联映射:
在以面向对象思想设计程序时,对象之间会产生关联引用.比如学生与班级,学生对象含有班级类型的属性,此时就会引用班级对象.将对象之间的关联关系映射到数据库,称为关联映射。
ORM映射:
对象模型 ----------数据库模型
对象 --------------------》 表
属性--------------------》 字段
引用关系--------------------》 表关系[外键字段]
关联映射的本质: 将对象与对象之间的引用,转为数据表与数据表之间的引用
备注: 无论哪种关联关系,数据表中的外键只能在多端添加。
映射类型:
一对一(User-IDCard)
一对多(Department-Employee)
多对一(Student-Class)
多对多(Teacher - Student)
实现关联对象的映射:
1.MyBatis自动完成普通属性与表字段的映射: 将字段的值赋给同名的属性.
2.MyBatis无法自动完成关联对象与表字段的映射,需要手动设置映射关系,如下:
<resultMap>
<id /><!--映射主键 -->
<result /><!-- 映射普通属性 -->
<关联标签 /><!-- 映射关联属性 -->
</resultMap>
resultMap与resultType区别:
resultType: 只支持自动映射. 若含有关联字段,无法完成映射,而映射为null.
resultMap: 支持自动映射及手动映射. 自动映射同resultType.
关联映射标签:
association标签,collection标签。
备注:
备注:
无论是哪一种映射关系或查询方案[嵌套结果/查询],编写映射文件时,只需考虑映射的属性的类型.若是映射一个对象,则用association标签. 若是映射多个对象,则用collection标签。
association标签
用来处理“多对一”的关系。
主要属性如下:
- property:实体类中用来映射查询结果子集的属性。
- javaType:property指定的属性的数据类型,可以使用java完全限定类名或者别名。
示例:获取学生的信息和所在年级信息
添加接口方法:
public List<Student> getStudent();
在StudentMapper.xml映射文件中添加SQL映射语句:
<mapper namespace="cn.mydb.dao.student.StudentMapper">
<resultMap id="studnetmap" type="student">
<id column="sid" property="id"></id>
<result column="name" property="name"></result>
<result column="sex" property="sex"></result>
<result column="age" property="age"></result>
<association property="grade" javaType="Grade">
<id column="id" property="id"></id>
<result column="gradeName" property="gradeName"></result>
</association>
</resultMap>
<select id="getStudent" resultMap="studnetmap">
select s.id sid,name,age,sex,g.id gid,gradeName from student s,grade g where s.gradeid=g.id
</select>
</mapper>
collection标签
用来处理“一对多”的关系 即实体类内部嵌套的是一个集合类型的属性。
示例:获取年级信息及每个年级全部学生的姓名:
添加接口方法
public List<Grade> getGradeStu();
在GradeMapper.xml文件中添加SQL映射语句:
<resultMap id="grademap" type="grade">
<id column="id" property="id"></id>
<result column="gradeName" property="gradeName"></result>
</resultMap>
<resultMap id="gradestumap" type="grade" extends="grademap">
<collection property="students" ofType="student">
<id column="sid" property="id"></id>
<result column="name" property="name"></result>
<result column="sex" property="sex"></result>
<result column="age" property="age"></result>
</collection>
</resultMap>
<select id="getGradeStu" resultMap="gradestumap">
select g.id,gradeName,s.id sid,name,sex,age from grade g,student s where s.gradeid=g.id
</select>
常用属性如下:
- property:实体类中用来映射查询结果子集的集合属性。
- ofType:property指定的集合属性中的元素的数据类型,可以使用java完全限定类名或别名。
MyBatis框架的缓存
MyBatid框架缓存分为两个级别
1.一级缓存:
MyBatis框架的一级缓存是基于PerpetualCache和HashMap本地缓存,默认是SqlSession级别的缓存,在SqlSession的一个生命周期内有效。当SqlSession关闭后,该SqlSession中的所有一级缓存会被清空。MyBatis框架的一级缓存默认是开启的。
2.二级缓存:
二级缓存是SqlSessionFactory级别的,其作用域超出了一个SqlSession的范围,缓存中的数据可以被所有SqlSession共享。MyBatis框架的二级缓存默认是关闭的,使用时需要在Mybatis框架的核心配置文件中设置开启。
二级缓存使用方法
1.在MyBatis核心配置文件中设置全局开启二级缓存。代码如下
<settings>
<setting name="cacheEnabled" value="true">
</settings>
2.即使开启了二级缓存,默认情况下也是不使用的,可以根据需要在SQL映射文件中配置缓存,为当前namespace启用二级缓存,代码如下:
<mapper name=cn.mydb.dao.user.UserMapper>
<!--缓存配置-->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true">
...
</mapper>
cache元素中属性的作用如下:
eviction:选择缓存回收策略,主要包括以下几种策略:
- LRU:这是默认选项,最近最少回收,移除最长时间不被使用的缓存对象。
- FIFO:先进先出,按照对象进入缓存的顺序来移除它们。
- SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象。
- WEAK:弱引用,更积极的移除基于垃圾回收器和弱引用规则的对象。
flushInterval:设定缓存刷新间隔,以毫秒为单位设定缓存多长时间自动刷新一次,默认不自动刷新。
size:设定缓存中最多存放多少个对象,默认是1024
readOnly:设定缓存数据是否只读,默认是false,表示缓存数据越会用于读写操作,MyBatis框架会返回缓存对象的副本以避免脏读,true表示缓存数据只用于读操作,MyBatis框架会为所有从缓存中获取数据的操作返回缓存对象相同的实例,以获得更好的性能。
3.在SQL映射文件中配置支持二级缓存后,如需对个别查询进行调整,可以在select元素中单独设置,代码如下:
<select id="getUserByName" parameterType="string" resultType="user" useCache="false">
</select>