-1、转义字符
第一种写法:
原符号 < <= > >= & ' "
替换符号 < <= > >= & ' "
SQL示例如下:
create_time >= #{startTime}
and create_time <= #{endTime}
1
2
第二种写法:
大于等于 <![CDATA[ >= ]]>
小于等于 <![CDATA[ <= ]]>
0、Mysql 时间戳做比较
unix_timestamp(gmt_created) > 1111111111(时间戳)
1、搜索结果使用map接收-注解模式
@Select({
"SELECT p.aName aName,p.idNo idNo,c.businessSeriNo businessSeriNo "
+ "FROM tablenamep p LEFT JOIN tablenamec c ON p.mobile=c.mobile "
+ "WHERE p.mobile=#{mobile,jdbcType=VARCHAR} AND c.status='00' " })
List<Map<String, Object>> getUserInfo(@Param("mobile") String mobile);
2、传入参数为集合时,使用in,注意上面赋值处使用$.如果仅仅一个值,可以使用#,入参格式为 1,2,3-注解模式
@Delete("delete from tablename where id in (${ids})")
int deleteUserRoleByIds(@Param("ids") String ids);
3、mysql 高版本需要指明数据库连接是否使用SSLjava.lang.UnsupportedClassVersionError: com/mysql/jdbc/Driver : Unsupported major.minor version 52.0
答案:http://blog.youkuaiyun.com/zdf19931993/article/details/51307543
4、& 使用 & 代替 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=utf8" />
Caused by: org.xml.sax.SAXParseException; lineNumber: 19; columnNumber: 95; 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾。
答案:http://blog.youkuaiyun.com/cuiyaoqiang/article/details/51853052
5、mybatis 的 xml 配置文件中元素必须按照一定顺序出现
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 35; columnNumber: 17; 元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"。
答案:http://blog.youkuaiyun.com/liu578182160/article/details/50747390
6、mybatis 的 xml 配置文件 <和>的sql语句都要转义-或者<![CDATA[ ]]>包围
方式一:使用转义
适合一切环境的代码
< 换为 < ,> 换为 >
方式二:
这个方法不适合部门版本的代码
<![CDATA[
AND tpso.userId = #{userId}
]]> 包围
方式三:使用字母
推荐,可读性高
sql | 字母 |
---|---|
== | eq |
!= | neq |
< | lt |
> | gt |
<= | lte |
>= | gte |
7、mubitas 使用数据库自动生成主键插入后自动获得主键
insert后可以从被保存实体中直接bean.getId() 得到自动生成的主键值
比如实体类中主键为 id,数据库对应 Id
<insert id="insert">
INSERT INTO tableName(
createdatetime,
del_flag
) VALUES (
#{createdatetime},
#{delFlag}
)
<selectKey resultType="java.lang.String" order="AFTER" keyProperty="id">
SELECT @@IDENTITY AS Id
</selectKey>
</insert>
第二个案例-更容易理解和操作
java部分
UserModel u=new UserModel();
// u.setUserName("3");//userName使用数据库自动生成
u.setPassWord("3");
u.setCreateDate(new Date());
userModelMapper.addUserModel(u);
sqlSession.commit();
System.out.println("自动生成的主键为="+u.getUserName());
xml部分 -参考mybatis – MyBatis 3 | XML 映射器
<!-- 插入 -->
<insert id="addUserModel" parameterType="userModel" useGeneratedKeys="true" keyProperty="userName">
userName
INSERT INTO userModel (passWord,createDate)VALUES (#{userModel.passWord},#{userModel.createDate})</insert>
注意了,插入时没有主键,数据库userName设置为自增,之后java在commit之后,实体类自动被赋值了userName值,这里
userName是数据库的主键
8、mybitas 保存实体而直接使用字段的前提条件
比较一下下面的两种写法-思考下:
如果启动 mybitas 的属性自识别功能,不要对实体进行@Param("userModel")的设置,一旦设置了就只能通过userModel来
进行之后属性的设置了
8.1、Mapper.java 保存实体,不指定@Param
public int addUserModel(UserModel userModel );
<!-- 插入 -->
<insert id="addUserModel" parameterType="userModel" useGeneratedKeys="true" keyProperty="userName">
INSERT INTO userModel (
passWord,
createDate
)
VALUES (
#{passWord},
#{createDate}
)
</insert>
8.2、Mapper.java 保存实体,指定@Param
public int addUserModel(@Param("userModel") UserModel userModel );
<!-- 插入 -->
<insert id="addUserModel" parameterType="userModel" useGeneratedKeys="true"
keyProperty="userModel.userName">
INSERT INTO userModel (
passWord,
createDate
)
VALUES (
#{userModel.passWord},
#{userModel.createDate}
)
</insert>
9、 搜索多条,返回List<userModel>-入参为111,222,333 格式
9.1 java
public ArrayList<UserModel> getUserModelListByStrs(@Param("userNames") String userNames);//入参为 11,22,33 形式的字符串,返回实体的list
9.2 xml
<!-- 搜索多条,返回List<userModel>-入参为111,222,333 格式 -->
<select id="getUserModelListByStrs" parameterType="string" resultType="userModel">
SELECT
<include refid="userModelColumns" />
FROM
userModel u
WHERE
u.userName in (${userNames})
</select>
10、 foreach 搜索多条,返回 List<HashMap<String,Object>>,入参为list
<if test="userNamelist != null and userNamelist.size() gt 0">
<foreach item="item" collection="userNamelist" open="(" separator="," close=")" >
#{item}
</foreach>
</if>
10.1 java
public ArrayList<HashMap<String,Object>> getHashMapListByList(@Param("userNamelist") ArrayList
userNamelist);
10.2
<!-- 搜索多条,返回 List<HashMap<String,Object>>,入参为list-->
<select id="getHashMapListByList" parameterType="list" resultType="map">
SELECT
<include refid="userModelColumns" />
FROM
userModel u
WHERE
u.userName in
<foreach item="item" collection="userNamelist" open="(" separator="," close=")" >
#{item}
</foreach>
</select>
11、搜索多条结果,判断搜索结果是否为空时,不能使用 list==null 判断,而是list.size()==0
@Override
public ArrayList<UserModel> getUserModelListByStrs(String userNames) {
ArrayList<UserModel> list=userModelMapper.getUserModelListByStrs(userNames);
if(list.size()!=0){//搜索结果不为null,应该使用size判断
return list;
}
return null;
}
12、mybatis 自动生成代码
结合eclipse Eclipse 使用mybatis generator插件自动生成代码 - 冰雪飞燕 - 博客园
eclipse利用mybatis-generator生成代码 - 夜雨梧桐 - 博客园
单独的 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转) - 斗哥哥 - 博客园
无IDE直接操作的:
下载:http://download.youkuaiyun.com/detail/bestcxx/9909324
方法在使用说明:
在cmd 环境下,进入到 本文件夹(mybatis-generator)内后,运行下面的命令
java -jar mybatis-generator-core-1.3.5.jar -configfile generatorConfig.xml -overwrite
13、resultMap="本地类型",resultType="map"或者“java.util.Map”
resultMap="本地类型",resultType="map"或者“java.util.Map”
14、Mybatis 传参为 Map<String,String>
java 部分
List<Map<String,Object>> getTestList(Map<String,String> params);
xml部分,map可以写为 java.util.Map
<select id="getTestList" parameterType="map" resultType="map">
SELECT *
FROM TableDemo o
WHERE 1=1
<if test="id != null">
AND o.id=#{id}
</if>
<if test="orderCode !=null">
AND o.order_code=#{orderCode}
</if>
;
</select>
15、Mybatis 传递多个参数+模糊查询+分页
java 部分
List<Map<String,Object>> getDemoList(Map<String,Object> params);
xml 部分-模糊查询和分页
<select id="getDemoList" parameterType="map" resultType="map">
SELECT
o.id id,
<!-- 日期大于等于今天,则不过期-1,否则过期-0 -->
<![CDATA[
o.time>=CURDATE() AS timeFlag
]]>
FROM
demo_table_o o
LEFT JOIN demo_tabel_f f ON o.id =f.id
LEFT JOIN demo_table_op op ON op.id=o.id
WHERE 1=1
<if test="oStatus != null">
AND = o.ostatus = #{oStatus}
</if>
<if test="pStatus !=null">
AND o.pstatus = #{pStatus}
</if>
<if test="multipleStr !=null">
AND
(o.ocode=#{multipleStr} OR op.pname LIKE CONCAT('%',#{multipleStr},'%') )
</if>
<!-- 第几页*一页数据量,搜索一页数据量 -->
<choose>
<when test="page !=null and page>=1">
limit #{page},#{pageSize}
</when>
<otherwise> limit 0,10</otherwise>
</choose>
;
</select>
模糊查询如果没有特殊参数可以直接 LIKE #{参数},%是任意多参数,_是一个参数,都可以出现
<select id="getNextCodeOrderInfo" parameterType="string" resultType="map">
SELECT o.code code
FROM order_info o
WHERE o.id=#{Id} AND o.code LIKE #{code}
ORDER BY o.code DESC
</select>
·mybatis-generator生成通用mapper中文乱码解决
1、eclipse 设置 workbench格式为utf-8
2、在eclipse.ini 的末尾增加:-Dfile.encoding=UTF-8
·resultMap="TestAaa",结果自动转为实体,resultType="map"结果就是map类型的
<resultMap id="TestAaa" type="cn.stu.bestcxx.entity.Test">
<id column="name_a" jdbcType="INTEGER" property="nameA" />
<result column="name_b" jdbcType="VARCHAR" property="nameB" />
<result column="name_c" jdbcType="BIT" property="nameC" />
</resultMap>
resultMap="TestAaa",结果自动转为实体,resultType="map"结果就是map类型的
<select id="getById" parameterType="java.lang.Integer" resultMap="Test">
select
<include refid="columns" />
from test
where name_a = #{nameA,jdbcType=INTEGER}
</select>
·mybatis 循环插入多条数据,且入参分为List<实体>和Integer两类参数
java部分
Integer insertList(@Param("list") List<VoTest> list,@Param("order") Integer order);
xml部分
自动生成主键 int batchInsert(@Param("list") List<DemoListDO> list);
注意 xml 中循环体 item.name3
<insert id="insertList" parameterType="java.util.List">
insert into order (order, name2,
name3)
values
<foreach collection="list" item="item" index="index"
separator=",">
(#{item.name2,jdbcType=DECIMAL},
#{item.name3,jdbcType=VARCHAR})
</foreach>
</insert>
·mybatis搜索简单类型
java 部分
String getIdId(@Param("id")Integer id);
xml部分
<select id="getIdById" parameterType="integer" resultType="string">
SELECT IFNULL(m.`id`,"") id
FROM member m WHERE m.`id`=#{id} ;
</select>
·mybatis 入参参数判断是否为空
如果入参可能为null 则使用null判断,如果是空字符串,则使用 ‘’判断,所以两个判断是比较保险的
<if test="id != null and id != ''">
AND rpi.`id`=#{id}
</if>
合法的符号有,需要区分大小写
<EOF>
"," ...
"=" ...
"?" ...
"||" ...
"or" ...
"&&" ...
"and" ...
"|" ...
"bor" ...
"^" ...
"xor" ...
"&" ...
"band" ...
"==" ...
"eq" ...
"!=" ...
"neq" ...
"<" ...
"lt" ...
">" ...
"gt" ...
"<=" ...
"lte" ...
">=" ...
"gte" ...
"in" ...
"not" ...
"<<" ...
"shl" ...
">>" ...
"shr" ...
">>>" ...
"ushr" ...
"+" ...
"-" ...
"*" ...
"/" ...
"%" ...
"instanceof" ...
"." ...
"(" ...
"[" ...
·Mybatis 搜索部分字段以自定义实体接受结果
需要自动一个DTO
在Mapper中指定 resultType=DTO类路径即可
<select id="getProducerLicenseDetailList" parameterType="int"
resultType="cn.acsm.farmeasy.origins.process.dto.ProducerLicenseDetailDTO">
SELECT jai.`photo` photo,
jai.`relation_producer` relationProducer,
jai.`producer_qualification` producerQualification,
jai.`producer_license` producerLicense,
jai.`range_of_work` rangeOfWork,
jai.`registration_information` registrationInformation
FROM jg_factory_aptitude_info jai WHERE jai.id=#{id,jdbcType=INTEGER}
</select>
·Mybatis limit命令保留关键字#{pageNum},否则报错 ### Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
使用Limit 命令时,下面这样会报错
limit #{pageNum},#{pageSize}
因为pageNum是保留字
再一个,0不被当做 1 ,2,3等处理,所以使用 <if test="pageBegin != null and pageBegin !=''">不会运行,搜索结果就会搜索全部内容
使用下面的就没事了,默认是 limit 0,pageSize
<choose>
<when test="pageBegin !=null and pageBegin!=''">
limit #{pageBegin},#{pageSize}
</when>
<otherwise>
limit 0,#{pageSize}
</otherwise>
</choose>
·修改boolean 类型
入参就是boolean类型的,需要加标注@Param("name")
@Param("state") Boolean state
xml
pr.`state`=#{state,jdbcType=BIT}
·搜索入参为集合,比如list或者数组
List<Map<String,Object>> nameHere(@Param(value = "入参集合名字")String[] 入参集合名字);
<select id="namehere" resultType="map">
SELECT demo.name FROM demo WHERE
demo.id in
<foreach collection="入参集合名字" item="item" index="index"
open="(" separator="," close=")">#{item}</foreach>
</select>
·搜索结果为list
Dao层
List<Integer> getOrderOutByBoxCodeOutId(int boxCodeOutId);
Mapper.xml resultType="int"
<select id="getOrderInByBoxCodeOutId" resultType="int">
SELECT pmi.id in FROM demo pmi WHERE pmi.`deleted`=0
</select>
·输入默认参数,且默认参数为url-xml中
"${url值}" 参数属性名字
关键是双引号
·mybatis 将两个属性拼接作为一个属性返回
select concat("${入参}",表名.字段) AS 参数 from 表明
需要注意,如果待合并字段有一个为null会导致合并失败,所以可以将null值变为空串
CONCAT(表.`name`,IFNULL(表.`weight`,''),表.`spec`) content,
·对条件语句对末尾进行处理
<trim prefix="values (" suffix=")" suffixOverrides="," >
·mybatis 类型和 Java 类型对应 resultType
<select id="methodname" parameterType="int" resultType="decimal">
结果只有一个,可以使用单个参数承接结果,而非集类
在使用 mybstis 自动生成代码的工具时,比如 tinyint 默认 tinyint(1)会转化为 boolean 类型,否则是 Byte 类型,我们可以指定为Integer,如下
<columnOverride column="demo_status" property="demoStatus" javaType="java.lang.Integer" />
SQL数据类型和Java数据类型的对应关系
integer、int ---> int
tinyint ---> boolean,Byte,Integer
smallint ---> short
bigint ---> long
decimal、numeric ---> java.math.BigDecimal
float ---> float
double ---> double
char、varchar ---> String
boolean、bit ---> boolean
date ---> java.sql.Date
time ---> java.sql.Time
timestamp ---> java.sql.Timestamp
blob ---> java.sql.Blob
clob ---> java.sql.Clob
array ---> java.sql.Array