mybatis,hibernate,jdbcTemplate怎么返回map以及一些操作技巧

本文介绍了MyBatis框架的一些高级应用技巧,包括返回Map结构、批量操作、使用动态SQL、抽取公共SQL片段等,并对比了Hibernate框架下SQL查询的不同处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来说说maybatis,mybatis里面要返回一个map可以直接在返回类型这里设置,不过如果是多个对象的话要用list来装一下
<select id="findForMap" resultType="java.util.HashMap">
		select * from seckill;
	</select>

使用mybatis的一些技巧,返回添加主键id:

<!-- id为语句块名,parameterType为方法参数类型,userGenneratedKeys="true"使用数据库自动增长列填充主键
			keyProperty="id" 将新增记录的主键值,填充实体对象的id属性
		 -->
		<insert id="addSchool" parameterType="school" useGeneratedKeys="true" keyProperty="id">
			insert into t_school(schoolName,createTime,schoolMaster) values (#{schoolName},#{createTime},#{master});
		</insert>
然后你的代码中的bean就自动封装了id,不需要其他操作

public int addSchool(SchoolBean bean) {
	// TODO Auto-generated method stub
	this.getSession().insert("sb.addSchool",bean);
	return bean.getId();
}

批量操作时传入一个集合或者数组时的操作:使用foreach,并且用逗号分隔

<delete id="delMore" >
			delete from t_school where id in (<foreach collection="idArray" item="its" separator=",">
				${its}
			</foreach>)
</delete>
如果有一些特殊字符比如<这样的,可以使用这种方式避免。
<!-- 这样就可以让他只是个字符串可以有特殊字符 -->
			<![CDATA[ select * from t_school where createTime >=#{start} and createTime<=#{end}; ]]> 
如果一个对象中有一个关联的一对多的list集合,可以用这种方式去封装,当然resultMap这种东西是可以继承的,这里的rb是另一个空间名。
<resultMap type="boss" id="bossMap">
			<result column="id" property="id"/>
			<result column="bossName" property="name"/>
</resultMap>
		<!-- 可以继承以前的bossMap,代码重用 -->
<resultMap type="boss" id="bossInclideRoomMap" extends="bossMap">
	<!-- select表示执行查询关联集合的语句块,将查询出来的数据封装到 property="roomList"中去,column是表示select所需要传入的数据-->
	<association property="roomList" column="id" select="rb.findByBoss"></association>
</resultMap>
当然如果有一些共有的sql也可以抽象出来:

<!-- 抽取相同代码 -->
		<sql id="dynasql">
			<if test="name!=null and name!=''">
				and schoolName like '%${name}%' 
			</if>
			<if test="startDate!=null">
				<![CDATA[ 
					and createTime >=#{startDate}
				]]>
			</if>
			<if test="end!=null">
				<![CDATA[ and createTime<=#{end} ]]>
			</if>
		</sql>

引用的话可以像下面一样:

<select id="findCut" resultMap="schoolMap">
			select * from t_school where 1=1
				<!-- 引用sql语句块 -->
				<include refid="dynasql"/>
			limit #{start},#{size};
		</select>
mybatis最后我再推荐一个git上面开源的一个可以直接执行sql的好东西,maven如下:

 <dependency>
    <groupId>com.github.abel533</groupId>
    <artifactId>mapper</artifactId>
    <version>2.3.0</version>
</dependency>

但是这个需要传入session,所以你可以在配置文件中把session初始化

代码实现很简单,第一个是sql语句可以设置占位符,第二个参数是占位符的数据,第三个是要封装的对象

public List<Map<String, Object>> getListMap(String sql,Map<String, Object> map,Class className){
		SqlMapper mapper=new SqlMapper(session);
		
		return mapper.selectList(sql, map, className);
	}

可以看到这里可以返回也有map结构很方便。

说一下hibernate,我们使用原生的sql:这样他就会根据列与bean的属性进行封装成userbean对象,但是移动要保证名字相同。当然这里如果有多个对象可以取别名继续加addEnntity就行了

this.getSession().createSQLQuery("select * from usermail").addEntity(UserBean.class).list();
如果要让他返回map的话可以这样写,key的话和表的列对应

List<Map<String, Object>> list=this.getSession().createSQLQuery("select * from usermail").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
如果是jdbcTemplate要在配置文件中初始好,然后就可以用也很简单,它提供很多方法,基本满足所有返回类型。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值