2023年7月25日发(作者:)
mybatis使⽤-⾼级⽤法(⼆)新建学⽣表和学⽣证表--学⽣表CREATE TABLE student( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'id', `name` VARCHAR(20) NOT NULL COMMENT '姓名', `age` INT NOT NULL COMMENT '年龄', sex INT NOT NULL COMMENT '性别 1 男 0 ⼥', cid INT NOT NULL COMMENT '班级id', cardId INT COMMENT '学⽣证id' ) --学⽣证表 CREATE TABLE Card ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'id', number INT NOT NULL COMMENT '学⽣证id', studentId INT NOT NULL COMMENT '学⽣id' )动态标签include&sql 实现sql复⽤ id,name,age select from student where id=#{id} where&if select from student and id=#{id} and name=#{name}
where标签⾥⾯有if标签成⽴ 则⾃动在sql后⾯拼接where 同时去除多余的andchoose, when, otherwise select * from student
and sex=#{sex} and name like concat('%',#{name},'%') trim, setselect * from user
AND name=#{name} AND gender=#{gender} 满⾜条件拼接 where 同时去掉前⾯多余的and或者or update user name=#{name} , gender=#{gender} ,
满⾜条件拼接set 同时去掉后⾯多余的, 再拼接 suffix update user name=#{name} , gender=#{gender} , 满⾜条件拼接set 同时去掉多余的,in条件 select * from ${prefix}ACT_RU_IDENTITYLINK where TASK_ID_ in #{item}
⼀对多级联1.学⽣mapper增加⼀个根据班级获取学⽣ select * from student where cid=#{id} public List findByStudent(Student params);2.在classes类增加⼀个学⽣集合public class Classes implements Serializable{....private List students;}sMapper增加⾃定义resultMap select为调⽤指定mapperStatement(可以理解是指定key的标签namespace+id)column 为将哪个列作为参数传递students 返回结果赋值的属性可以设置 fetchType="eager(默认值 不按层级加载)|lazy" 就是有有很多级的时候 是否⼀下把所有级加载出来3.在需要使⽤resultMap的地⽅指定resultMap 如根据id获得class select * from classes where id=#{id} 多对⼀, ⼀对⼀级联1.学⽣表增加classespublic class Student implements Serializable{ .... private Classes classes;}2.学⽣表增加⾃定义resultMap 3.在需要级联的地⽅resultMap改为这个 select * from student where id=#{id}
跟多对⼀⼀样 只是标签改为association可以通过Sesstio全局设置级联是否延迟加载 层级加载的意思 就是 ⽐如学⽣级联班级,班级⼜有学校级联 当延迟加载情况getClass时是否也级联加载学校,或者⾮延迟加载 所有的都加载出来resultMap或者ParameterMap继承
如我定义了2个Resultmap ⼀个需要class级联 ⼀个只需要学⽣证级联,是否发现前⾯⼏个属性⼏乎是copy的我们可以这样 使⽤extends="simpleType" 继承Mybatis对枚举⽀持1.添加⼀个性别枚举public enum SexEnum { MALE(1, "男"), FEMAL(0, "⼥"); private int id; private String name; private SexEnum(int id, String name) { = id; = name; } public int getId() { return id; } public void setId(int id) { = id; } public String getName() { return name; } public void setName(String name) { = name; }}2.将学⽣性别改为枚举类型public class Student implements Serializable{ .... private SexEnum sex;}Map的TypeHandle处理器改为mybatis提供的枚举处理器 .... ⾃定义TypeHandle实现TypeHandle接⼝就好了。然后像上⾯⼀样typeHandle改为⾃⼰指定的,因为mybatis默认提供个TypeHandle基本够⽤了。找不到例⼦ 测试⾃定义缓存分布式 或者集群我们缓存都是存在redis或者其他nosql上⾯,redis缓存默认是存在当前服务器内存,这种时候我们需要⾃定义缓存public class MyCache implements { private String id; /** *读的时候其他线程可以读 *读的时候其他线程不能写 *写的时候其他线程不能写 *写的时候不能读 * getData(){ * try{ * ck(); 读锁 * }catch(execption e){ *
* }finally{ * ck().unlock(); * } * } *
* setData(){ * * try{ * Lock(); 写锁 * }catch(execption e){ *
* }finally{ * Lock().unlock(); * } * } * 外部代理类会在get 和put ⽅法 加上读写锁 */ private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();//读写锁
public MyCache(String id){ n(id);//对应的mapper全名称标⽰ =id; } private static Map cacheManager=new HashMap();//模拟redis //获取缓存编号 public String getId() { // TODO Auto-generated method stub
return id; } //缓存数据 public void putObject(Object key, Object value) {
n("缓存对象 key为:"+ng()); // TODO Auto-generated method stub (key, value);
} //获取缓存 public Object getObject(Object key) { // TODO Auto-generated method stub n("获取对象 key为:"+ng()); return (key); } //删除缓存 public Object removeObject(Object key) { return (key); } //清空缓存 public void clear() { ();
} //获取缓存对象⼤⼩ public int getSize() { // TODO Auto-generated method stub return (); } //获取缓存读写锁 public ReadWriteLock getReadWriteLock() { // TODO Auto-generated method stub return readWriteLock; }}实现Cache 接⼝在需要Mapper缓存的配置 在需要更新缓存的地⽅ update student set name=#{name},sex=#{sex} where id=#{id} 打上flushCache="true"mybatis缓存的粒度不是很细。⼀刷新缓存整个表就刷新了。⽐如id为1的数据修改 你想只更新这个缓存,mybatis是更新整个表
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690219550a316862.html
评论列表(0条)