目录
-
1.1 查询select
标签属性
id 唯一的名称,对应dao中mapper的接口名称
paramterType 定义传入的参数类型,当插入 数据时 传入的是对象 路径写全 ,第二 当插入数据有外键时 插入的是数字不是对象
记得后面 打点
resultType 返回数据类型对应实体类
resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用
resultSets 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。
查询语句中有大于等于或者小于登录时,select语句的>= 这样写 ‘& g t;’ <=这样写“& l t ;”
-
1.2 增删改
标签属性
id 唯一的名称,对应dao中mapper的接口名称
parameterType 将要传入语句的参数的完全限定类名或别名。这个属性是可选的
在添加 ,删除,修改中,判断中的使用,直接用resultMap中的property中定义就行,在sql语句中的放值中实体类中的属性
useGeneratedKeys:对于支持自动生成记录主键的数据库,在执行添加记录之后可以获取到数据库自动生成的主键ID。只会对xml映射器产生影响,和keyProperty一起用,
-
trim标签
下面的第一个prefix就是在 第一对trim前显示,第一个suffix就是在第一个trim后显示, 是用来填充和隐藏 sql 语句
<insert id="insertUser" parameterType="User" >
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="unitName != null and unitName != ''">unit_name,</if>
<if test="userName != null and userName != ''">user_name,</if>
<if test="passWord != null and passWord != ''">pass_word,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="unitName != null and unitName != ''">#{unitName},</if>
<if test="userName != null and userName != ''">#{userName},</if>
<if test="passWord != null and passWord != ''">#{passWord},</if>
</trim>
</insert>
trim的属性
prefix 在trim定义的内容前填充对应的内容
suffix 在trim定义的内容后填充对应的内容
prefixOverrides,在trim定义中,去除trim包裹的sql的指定首部内容
suffixOverrides,在trim定义中,去除trim包裹的sql的指定尾部内容
suffixOverrides的使用
这里的suffixOverrides=, 就是把最后的那个覆盖掉
<update id="updateUser" parameterType="net.yierde.web.domain.User" >
update yed_web_user
<trim prefix="SET" suffixOverrides=",">
<if test="userName != null and userName != ''">user_name = #{userName},</if>
<if test="passWord != null and passWord != ''">pass_word = #{passWord},</if>
<if test="phone != null and phone != ''">phone = #{phone},</if>
<if test="mailbox != null and mailbox != ''">mailbox = #{mailbox},</if>
<if test="status != null and status != ''">status = #{status},</if>
</trim>
where id = #{id}
</update>
-
if 标签
基本都是用来判断值是否为空,注意Integer的判断,mybatis会默认把0变成
<if test="item != null and item != ''"></if>
<!-- 如果是Integer类型的需要把and后面去掉或是加上or-->
<if test="item != null"></if>
<if test="item != null and item != '' or item == 0"></if>
还有一点:当判断的类型是date(日期型)时 只用判断是否为NULL就行了,不用判断 ( ' ' )这个空字符
别名
<typeAliases>
<typeAlias type="com.it.bean.User" alias="User"/>
</typeAliases>
3. resultMap标签
1.resultMap属性
id 唯一标识,一个表嵌套另一个表的时候会用,或者用来 把实体类属性与数据表中的字段对应起来,这个id是要给别人用的
type 返回类型
extends 继承别的resultMap,可选
2. collection与association标签
collection与association的属性一样,都是用于resultMap返回关联映射使用,collection关联的是集合,而association是关联单个对象
collection 可以引用别的mapper的查询方法
<resultMap id="BaseResultMap" type="com.space.sbsecurity.bo.sys.SysUser" >
<id column="user_id" property="id" jdbcType="BIGINT" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<collection property="sysRoles" column="user_id"
select="com.space.sbsecurity.mapper.sys.SysRoleMapper.selectRoleListByUserId">
</collection>
</resultMap>
association 有两种用法:join查询(join查询)、嵌套查询(嵌套查询)
<resultMap>
<association property="company" javaType="Company" column="comid"
select="selectCompany" />
<!--column 是数据表中的列名 property是 实体类中的属性名 javaType是要返回的对象名称
select 是我要嵌套的方法名
-->
</resultMap>
<select id="selectCompany" parameterType="Integer" resultMap="CompanyResult">
select * from company where comid=#{comid}
</select>
标签属性
property 是属性名
resultMap返回实体类中字段和result标签中的property一样
column 数据库的列名或者列标签别名,是关联查询往下一个语句传送值(属性名)。注意: 在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。
javaType 返回的类型(一般为ArrayList或是java.util.List)
ofType java的实体类,对应数据库表的列名称,即关联查询select对应返回的类
select 去找要调用的类,找到方法,从com开始到方法结束,执行一个其他映射的sql语句返回一个java实体类型。
Mybatis 中 #{}与${} 的区别
简明的解释:
#{}是预编译处理,一般用#{}来进行编写,$ {}是字符串替换(当做占位符来用)。
mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的
set方法来赋值;
mybatis在处理 $ {} 时,就是把 ${} 替换成变量的值。
使用 #{} 可以有效的防止SQL注入,提高系统安全性。
在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},
如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。
注意:使用模糊查询时,那个字符% 直接用 '' 扩起来就行了,mapper里面是 sql语句
拼接sql
用<sql></sql>来编写
里面的属性有id,唯一,被其他语句引用
其他语句来引用时,用<include refid = '那个sql的ID'></include>
动态sql
有if,when,choose,otherwise,where,set,forearch
foreach元素的属性主要有item,index,collection,open,separator,close。
Collection 表示即将要遍历的容器
item表示集合中每一个元素进行迭代时的别名;
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open表示该语句以什么开始;
separator表示在每次进行迭代之间以什么符号作为分隔符;
close表示以什么结束;
mapper接口和mapper.xml中传递参数
使用@Param注解,使用此注解,在mapper.xml中不用再写"parameterType”属性,会直接把接口中@Param(“xxx”)的xxx直接放入,可以在接口中使用多个@Param注解,引用类型不需要加此注解
使用VO,DTO,POJO
vo(View Object):显示层对象,通常是WEB项模版渲染页面进行传输的对象。有时候会多个表链接查询,在页面返回一个对象,但是多个表的数据是一起返回来的并且可能会有多个不同表里面的数据,所以我们可以封装一个类是XXXVO把数据库查出来的属于不同的表的不同数据封装到一个去使用,记得使用要写一个<reslutMap>去对应
dto(Data Transfer Object):数据传输对象,服务层向外传输数据的对象。
pojo(Plan Ordinary Java Object): 可以简单理解为实体类
Mybatis 继承
视图类(继承了实体类,加入实体类中没有的属性,或者多表联查时)创建resultMap 时,不用加入继承本来的内容