Mybatis的sql映射

最后的301 2019-10-08 03:45:23
sql映射文件几个顶级元素(按照定义的顺序)
mapper -namespace
cache -配置给定命名空间的引用缓存配置
catch-ref 从其他命名空间引用缓存配置
resultMap -用来描述数据库结果集和对象的应用关系
sql -可以重用的sql块
insert -映射插入语句
update -映射更新语句
delete -映射删除语句
select -映射查询语句
mapper
namespace:命名空间
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定Dao接口
namespace的命名必须跟某个接口同名,完全限定名
接口中的方法与映射文件中的sql语句id一一对应
select
select语句有很多属性,可以详细配置每一条语句
id 命名空间的唯一标识
接口中的方法与映射文件中sql语句id一一对应
parameterType
传入sql语句的参数类型的完全限定名或别名
resultType
SQL语句返回值类型的完整类名或别名
带参查询:例子
mapper文件里,c传入参数用#{}包起来
<select id="a" parameterType="String" resulType="User">
select* from smbms_user where userName like CONCAT ('%',#{userName},'%')
</select>
要想使用,必须创建接口
punlic List<User> a(String userName)
注意,mapper里的参数名必须与接口里的参数名相同
parameterType参数类型
基础数据类型
int String Date等,大小写不敏感,注意代码规范,int类型在此应写为Integer
只能传一个,通过#{参数名}即可获取传入数值
复杂数据类型
Java实体类,Map等
通过#{属性名}或者#{Map的key}即可获取传入值
多条基本数据类型传参:
在接口处,这样写
public User login(@Param("userCode") String userCode,@Param("passWord") String passWord);
在sql语句中,通过#{userCode}(注解名来拿到对应的参数值 )
注:
Map 键值对的集合 Map<String,String>userMap
第一个String是键的类型,第二个String是值的类型
实例化: Map<String,String>userMap=new HashMap<String,String>()
map里添加键值对:userMap.put("键","值");
总结,多参传入就要传入对象,或者map集合,或者参数前加注解
resultMap:描述如何将结果集映射到Java对象
resultMap属性:id:resultMap唯一标识
type:Java实体类
比如说,user表格里有职位id,没有职位名称
而我们需要拿到这个名称,怎么办呢?有两种方法可以解决
1.修改Usert属性,增加userRoleName属性
修改sql语句,连表查询
语句:select u.*,r.roleName as userRoleName from smbms_user,smbms_role where userName like CONCAT('%',#{userName},'%') and userRole=#{userRole} and u.userRole=r.id
注意,新添的属性名必须与表中新查到的字段名一致,不一致的情况下要使用别名.
2.使用resultMap,主要用在数据库中表字段名同基类的属性名不一致的情况下,或者需要复杂的连表查询自由控制映射结果时
同样,首先修改User属性,增加userRoleName属性
然后,在mapper.xml文件里添加<resultMap >标签,下面来整一个看看
<resultMap type="User"(返回的对象) id="userList">
<result property="userRoleName" column="roleName"/>
</resultMap>
result的property的值是基类里的属性名字
column的值是查询的表的字段的名,或者别名.
修改语句,把resultType,返回值类型删除,新增一项resultMapper,它的值对应resultMapper标签里的id,映射到相应的resultMap

resultMap和resultType不能同时存在.实际上不管是resultMap还是resultType返回值都是Map的键值对.map主要用在一些字段名跟属性名不一样,或者只拿到你需要的属性信息.当你只需要拿到部分数据时,就需要设置映射级别了
resultMap自动映射匹配前提:字段名与属性名一致
resultMap自动映射级别:autoMappingBehavior
PARTIAL(默认)自动匹配所有属性
NONE 不自动匹配所有属性,只匹配resulpMap标签里配置的属性和字段
FULL 自动匹配所有属性,association里边也自动映射
在核心配置文件的Settings标签里配置
例子:<settings>
<setting name="autoMappingBehavior" value="NONE"/>
</settings>
resultMap的子元素
id一般是数据库表里的主键映射,与result区别就是增加效率,提高性能
,result比较简单的数据映射
,association:复杂类型的关联,一对一
内部嵌套:映射一个嵌套的JavaBean属性
属性:property:映射数据库列的实体对象的属性
JavaType:完整的Java类名或别名
resultMap:引用外部的resultMap

collection: 复杂类型集合,一对多
内部嵌套:映射一个结果集到一个列表
属性:property:映射数据库列的实体对象的属性
ofType:完整的Java类名或别名(集合所包括的类型)
resultMap:引用外部的resultMap
子元素:
id
result
property对应属性,column对应字段
association例子:
<resultMap type="User" id="userRoleResult">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<association property="role" (Role在对应javaBean作为属性的名字) javaType="Role"(对应Role的全限定名)>
<id property="id" column="r_id"/>(映射role的id)
<result property="roleCode" column="roleCode"/>(映射role里的属性)
</association>
</resultMap>
或者这样写,拆成两个resultMap便于代码复用:
1.<resultMap type="Role" id="RoleResult">
<id property="id" column="r_id"/>(映射role的id)
<result property="roleCode" column="roleCode"/>(映射role里的属性)
</resultMap>
2.<resultMap type="User" id="userRoleResult">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<association property="role" (Role在对应javaBean作为属性的名字) javaType="Role"(对应Role的全限定名)resultMap="roleResult"/>
</resultMap>
collection例子
User里有一个属性为addressList,一个用户的多个收货地址
<resultMap type="User" id="userAddressResult">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<collection property="addressList" ofType="Address">
<id property="id" column="a_id"/>(映射address的id)
<result property="contact" column="contact"/>(映射address里的属性)
</collection>
</resultMap>
同样,为了可重用性,也可以拆分为两段
1:<resultMap type="Address" id="addressResult">
<id property="id" column="a_id"/>(映射address的id)
<result property="contact" column="contact"/>(映射address里的属性)
</resultMap>
2:<resultMap type="User" id="userAddressResult">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<collection property="addressList" ofType="Address"resultType="addressResult"/>
</resultMap>
注意,数据库表中有的两个表有相同的字段,注意一定要将相同的字段其中一个设置别名,确保字段的唯一.
insert插入语句
两个属性:id,parameterType 同select想相同
例子
<insert id="add" parameterType="User">
insert into smbms-user(userCode,userName,userPassword)
values(#{userCode},#{userName},#{userPassword})
</insert>
返回值类型是int,为改变行数.
添加,修改删除方法需要加上事务处理,在调用sqlSession的对应Mapper的方法后,使用sqlSession.commit()提交事务
在catch块里写上sqlSession.rollback();事务回滚
最后再finally里边关闭session
update修改语句
两个属性:id,parameterType 同select想相同
语句格式同插入语句相同
delete删除语句
两个属性:id,parameterType 同select想相同
语句格式同插入修改语句相同

总结:常见的返回值类型:
对于查询的,返回值类型:Java对象,Map,List等复杂数据类型
对于增删改:返回值为int,影响的行数
参数入参
使用@Param注解进行参数的传递
封装成对象入参

缓存:
一级缓存:自带的有,查询的数据放在内存里,下次直接从内存里读
二级缓存:一级缓存不够用,开启二级缓存
MyBatis全局缓存配置:<settings>
<setting name="chacheEnabled" value="true"/>
</settings>
一般不配置全局,只在select里开启二级缓存,增删改的返回值没必要开启
配置select缓存
1.Mapper.xml配置二级缓存
<cache eviction="FIFO" fiushUnterval="60000" size="512" readOnly="true"/>
eviction="FIFO"先进先出
fiushUnterval 每多少毫秒更新一次
size 缓存大小多少B
readOnly 只读
2.在select语句开启缓存:
<select id="" useCache="true">
...全文
16 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧