mybatis 使用集合

-1、转义字符

第一种写法:
原符号        <       <=       >        >=         &            '               "
替换符号    &lt;    &lt;=    &gt;    &gt;=    &amp;    &apos;    &quot;
SQL示例如下:

create_time &gt;= #{startTime} 
and  create_time &lt;= #{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、& 使用 &amp; 代替  <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;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[ ]]>包围

方式一:使用转义

适合一切环境的代码

< 换为 &lt; ,> 换为 &gt;

方式二:

这个方法不适合部门版本的代码

 <![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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值