mybatis操作Mysql小结
本文主要对mybatis操作mysql的一些注意点进行小结,作为以后开发的参考。
1. mybatis 的条件查询的三个方法实现
Mybatis的多条件查查询,传递参数,
第一种方法 传递map 型,
第二种方法 传递pojo
带三种方法 多个参数如果不封装成Map,就用序列号代替。
如果参数比较多且乱建议用map 型,如果有定义的pojo 则建议用pojo类型,如果传递的参数不多,则建议用序列号代替的方法。
1.Map 型(当传入多个参数时可以使用map型)
例 : mapper.java
//分页查询教师信息
public List<Teacher> findTeacherByPage(Map<String, Object> map);
相应地,这里用到了Map接口,就应该引入此接口:import java.util.Map。
在执行类Collection中,调用findTeacherByPage方法的相关代码如下:
Map<String,Object> params=new HashMap<String, Object>();
//以name字段升序排序,
params.put("sort", "name");
params.put("dir", "asc");
//查询结果从第0条开始,查询2条记录
params.put("start", 0);
params.put("limit", 2);
//查询职称为教授或副教授的教师
params.put("title", "%教授");
//分页查询教师信息
List<Teacher> teachers=mapper.findTeacherByPage(params);
可以看出,我们先把参数放在了一个Map中,这样我们就可以在相应的SQL语句中以#{…}的形式引用这些参数了。如下所示:
<selectid="findTeacherByPage"resultMap="upervisorResultMap"
parameterType="java.util.Map">
select * from teacher where title like #{title} order by ${sort} ${dir} limit #{start},#{limit}
</select>
2.pojo型
2.1 . mapper.xml
<sql id="query_items_where">
<!-- 使用动态sql,通过if判断,满足条件进行sql拼接
商品的查询条件需要通过ItemsQueryVo包装对象中itemsCustom属性传递
${}字符串的拼接
-->
<if test="itemsCustom!=null">
<if test="itemsCustom.name!=null and itemsCustom.name!=''">
items.name LIKE'%${itemsCustom.name}%'
</if>
</if>
</sql>
<select id="findItemsList"parameterType="cn.hpu.ssm.po.ItemsQueryVo" resultType="cn.hpu.ssm.po.ItemsCustom">
SELECT * FROM items
<where>
<include refid="query_items_where"></include>
</where>
2 Mapper.java
public interfaceItemsMapperCustom { //商品类表查询 public List<ItemsCustom> findItemsList (ItemsQueryVo itemsQueryVo)throws Exception; }
3.Serviceimpl.java 在服务实现类中调用
public List<ItemsCustom>findItemsList(ItemsQueryVo itemsQueryVo)throws Exception {
//通过ItemsMapperCustom查询数据库
//itemsQueryVo从service直接传递到dao
return itemsMapperCustom.findItemsList(itemsQueryVo);
}
2.3在controller 中调用 itemsCustom可以输入itemsCustom中的某个属性值具体看mapper.xml中的sql片段
@RequestMapping("/queryItems")
public ModelAndView queryItems(HttpServletRequest request,
ItemsQueryVo itemsCustom) throws Exception {
// 调用service查找数据库,查询商品列表,使用静态数据模
// 测试froward后能否拿到id
System.out.println(request.getParameter("id"));
List<ItemsCustom> itemsList = itemsService.findItemsList(itemsCustom);
// 返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 相当于requesr的setAttribut,在jsp页面中通过itemsList来取得数据
modelAndView.addObject("itemsList", itemsList);
// 指定视图
// 下边的路径在试图解析器中配置前缀和后缀
modelAndView.setViewName("items/itemsList");
//modelAndView.setViewName("/WEBINF/jsp/items/itemsList.jsp");
return modelAndView;
}
3.序列号代替
如果不想用map 也不想用pojo可以用序列号代替
Mapper.xml
<select id="login"parameterType="String" resultType="cn.hpu.back.po.Users">
SELECT * FROM users WHERE userphone= #{0} AND userpass=#{1}
</select>
Mapper.java
Users login (String userphone ,String userpass)throwsException;
Serviceimpl.java调用
//登录
public String logion(Stringuserphone, String userpass) throws Exception {
// TODO Auto-generated method stub
Usersstr= usersMapperCustom.login(userphone,userpass);
Stringresult=null;
if(str!=null)
result="ok";
else
result="no";
return result;
}
2. mybatis 查询时间戳类型(TIMESTAMP) 回显成时间字符串的问题
mybatis在select查询TIMESTAMP类型的时间时,如果resultType=”java.util.HashMap”,返回的map中时间的类型仍是TIMESTAMP类型,
想要回显成想要的字符串格式,则用时间函数 DATE_FORMAT(datetime,’%Y-%m-%d %H:%i:%s’)
此方法适用于连表查询时 想返回想要的时间串类型
<select id="selectByUserGroupId" parameterType="String" resultType="java.util.HashMap">
SELECT
u.user_id userId,
u.dept_id deptId,
u.user_name userName,
u.user_acc userAcc,
u.user_pwd userPwd,
u.user_salt userSalt,
u.user_state userState,
u.user_company userCompany,
u.user_mobile userMobile,
u.user_email userEmail,
u.user_last_login_time userLastLoginTime,
DATE_FORMAT(u.create_time,'%Y-%m-%d %H:%i:%s') createTime,
u.create_by createBy,
u.update_time updateTime,
u.update_by updateBy,
ud.dept_name deptName,
ur.role_name roleName,
ug.user_group_name userGroupName,
uu.user_ugroup_id userUgroupId
FROM
isomp_user_ugroup uu
INNER JOIN isomp_user_group ug ON ug.user_group_id = uu.user_group_id,
isomp_user u
INNER JOIN isomp_dept ud
ON u.dept_id = ud.dept_id
LEFT JOIN isomp_role ur
ON role_id = (SELECT ru.role_id FROM isomp_role_user ru WHERE ru.user_id = u.user_id)
WHERE uu.user_id = u.user_id AND uu.user_group_id = #{userGroupId,jdbcType=VARCHAR}
</select>
3. mybatis中Date和DateTime字段的插入
使用MyBatis3做数据持久层,在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,
Date会对应mysql的Date类型。
在MyBatis映射文件中要表明映射类型。
<result column="modified_date" jdbcType="TIMESTAMP" property="modified_date" javaType="java.sql.Timestamp" />
<result column="date" jdbcType="DATE" property="date" javaType="java.util.Date" />
<result column="modified_date" jdbcType="TIMESTAMP" property="modified_date" javaType="java.sql.Timestamp" />
<result column="date" jdbcType="DATE" property="date" javaType="java.util.Date" />
在使用字段的时候也要标明类型
#{modified_date,jdbcType=TIMESTAMP}、#{date,jdbcType=DATE}。
4.Mybatis返回list
<mapper namespace="com.mymaven.mybatisdemo.dao.DepartmentMapper">
<!--配置一个resultMap 指定返回的类型 -->
<resultMap id="departMent" type="Department">
<id column="dp_id" property="dp_id" />
<result column="dp_name" property="dp_name" />
<result column="cost_center" property="cost_center" />
</resultMap>
<!-- 返回一个list的写法 -->
<select id="queryAllDepartment" resultMap="departMent" >
select * from t_department
</select>
</mapper>
注意
<select id=”queryAllDepartment” resultMap=”departMent” 这里返回类型是resultMap,不是ResultType.