mybatis

mybatis
usermapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.easytopit.demo.mybatis.mapper.UserMapper">
<insert id="insert" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO et_user (username, truename, login_time) VALUES(#{username}, #{truename}, #{loginTime});
</insert>

<update id="update">
UPDATE et_user SET username=#{username}, truename=#{truename}, login_time=#{loginTime} WHERE id=#{id}
</update>

<delete id="delete" parameterType="int">
delete from et_user where id=#{id}
</delete>

<select id="queryAll" resultType="com.easytopit.demo.mybatis.bean.User">
SELECT id, username, truename, login_time loginTime FROM et_user LIMIT 10
</select>

<select id="queryAllByPage" parameterType="java.util.HashMap" resultType="com.easytopit.demo.mybatis.bean.User">
<!-- SELECT id, username, truename, login_time loginTime FROM et_user LIMIT #{param1}, #{param2} -->
SELECT id, username, truename, login_time loginTime FROM et_user LIMIT #{pageOffset}, #{pageSize}
</select>

<select id="query" resultType="com.easytopit.demo.mybatis.bean.User">
SELECT id, username, truename, login_time loginTime FROM et_user WHERE id = #{id}
</select>
</mapper>
namespace:
是为了解决相同名字的sql操作问题,有标识的作用
例如如果访问的路径是/add.do,如果namespace为/user,则访问路径为/user/add.do
select id="selectid"
id是为了唯一标识sql语句
resultType=java.util.map
标识当行记录的类型

// 手工查询(根据命名空间 - 命名空间与Mapper接口一致) -> com/easytopit/demo/mybatis/mapper/persistent/UserMapperNS.xml
users = session.selectList("NS.queryAll");
参数的三种方法
1:使用#{0}索引
2:使用参数#{param1} 从1开始
3:注解 @param(“name”)
jdk1.8支持参数注解,其他的不支持 参数名字和param(“”)名字一致
注意事项
#{} 实际上使用的jdbc的?占位符,是安全的
11:41:56.728 [http-bio-8080-exec-10] DEBUG c.e.c.m.AlbumMapper.deletelAlbum - ==> Preparing: delete from ab_album where id = ?
${} 底层实际上使用的替换,要记得加单引号,是不安全的
11:47:29.831 [http-bio-8080-exec-10] DEBUG c.e.c.m.AlbumMapper.deletelAlbum - ==> Preparing: delete from ab_album where id = 67
结果集映射
resulttype
映射一个具体的类
resultmap
先定义一个resultmap,然后映射
多对一映射
相当于先查询一个属性,然后自动使用属性作为参数调用其他的方法,再讲结果返回
column ''deptno ,property='dept',javaType=dept.class,one = @one(select = "命名空间.方法名")
一对多映射
懒加载
设置
需要的时候加载
出现的原因在于,应为一对多情况,有可能出现内存不足,所以当需要的时候,重新发起sql语句
insert selectkey标签
先通过sql语法,查询当前的列的最大值+1,放入到map中,然后insert into语句
<insert id="addRecord" parameterType="map" >
<!--取主键,通过取主键的最大值+1,适合单线程,不建议使用
然后将主键设置为key放到map中

-->
<selectKey keyColumn="mykey" keyProperty="scoreNo" order="BEFORE" resultType="int" >
select max(s_id)+1 as mykey from ex_score
</selectKey>
insert into ex_score (s_id,u_id,s_score,s_create_date,s_level) values(#{scoreNo},#{userId},#{userScore},#{createTime},#{level})
</insert>
sql和include标签
将相同的sql语句封装放到sql标签里面,然后使用include标签调用sql
sql里面的特殊符号
在xml转义
小写 &lt;
小于等于&lt;=
maven插件出故障
C:\Users\Administrator\.m2\repository\org\apache\maven\plugins\maven-resources-plugin
删除
导致的问题,在网路的情况下自动更新插件,如果中途网络出现故障,就会出现问题
动态sql
trim
prefix='where' prefixoverrides='and'
意思是如果前缀有and,将and覆盖成where
注意,要在每个条件前面加上and
trim转set
trim prifix = 'set' prefixoverrides='' suffix='' suffixoverride=','
意思是将前面空格替换成set,将后面的,替换成空格
set
开头添加set,结尾去掉逗号
where
作用:如果有条件满足,自动添加上where,并且会自动去掉满足第一个条件的and
foreach
大部分用于循环in里面的数据
foreach collection='传进来对象的属性' close=') item=''变量' open='(' separator='每个数据之前用逗号分开'
不建议在where1=1 ,因为会读取所有的表,有性能问题
缓存
缓存的意思是,所有查询的过一次的数据临时存储在内存中,第二次则判断内存是否存在,不存在就去读取数据库
要考虑的问题,当内存不足 时,考虑将某些数据踢出去
一级缓存
是session级别的缓存,必须是session相同,取出来的缓存数据才相同
不然你每次插叙查询一次都会去数据库查找
效果:同一个session操作数据时,第二次操作直接去缓存里面去,无需重新去数据库操作
对增差改查
二级缓存
是sessionfactory级别
效果,使用同一个sesseionfactory,当第一个sesseion的数据存入到sesseion中,然后session关闭,如果有启用了二级缓存,数据会被推送到二级缓存里面,然后下次使用新的sesseion时,会直接从二级缓存里面读取
启动二级缓存
在mapper里面,使用<cache></cache>
子主题 4
不建议使用二级缓存
相当于之前的全局变量
对查询安全
算法
fifo
将队列最右端的数据踢出去
lfu:least frequently used
使用次数最少的踢出去
也就是数据存到数据库到删除使用次数最少的
LRU:least recently userd
最近使用次数最少的
在指定时间内使用次数最少的
实现缓存
缓存的每行数据必须有唯一标识符(表中的主键),也就是map
如果有就从map中取,没有就添加
子主题 1

posted @ 2017-07-03 09:59  wdx330616  阅读(299)  评论(0编辑  收藏  举报