先来说说maybatis,mybatis里面要返回一个map可以直接在返回类型这里设置,不过如果是多个对象的话要用list来装一下
引用的话可以像下面一样:
但是这个需要传入session,所以你可以在配置文件中把session初始化
可以看到这里可以返回也有map结构很方便。
<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要在配置文件中初始好,然后就可以用也很简单,它提供很多方法,基本满足所有返回类型。