javaweb实战之商城项目开发(三)
程序员文章站
2024-03-09 12:43:59
接着上一篇这一篇主要实现通用的basedao.java和使用resultmap映射关联对象
一.通用的basedao.java
既然要大家都能用,所以使用了泛型.其中要...
接着上一篇这一篇主要实现通用的basedao.java和使用resultmap映射关联对象
一.通用的basedao.java
既然要大家都能用,所以使用了泛型.其中要注意的问题就是类似user.getclass().getname()这样的代码是需要修改的.修改方法就是使用参数class tc传递过来,然后在使用tc.getname()即可.
完整代码:
package com.dao; import com.model.pager; import com.util.sessionutil; import com.util.systemcontext; import org.apache.ibatis.session.sqlsession; import java.util.hashmap; import java.util.list; import java.util.map; /** * created by nl101 on 2016/2/23. */ public class basedao<t> { /** * 根据id取出一个t类型 * @param id 要取出t类型的id * @return */ public t load(class<t> tc,int id){ sqlsession session = sessionutil.getsession(); t t = null; try { t = session.selectone(tc.getname()+".load",id); } finally { sessionutil.closesession(session); } return t; } /** * 添加一个t类型 * @param t 要添加的t类型 * @return true成功 */ public boolean add(t t){ int isadd = 0; sqlsession session = sessionutil.getsession(); try { isadd = session.insert(t.getclass().getname()+".add",t); session.commit();//提交 } catch (exception e) { session.rollback();//提交失败则回滚 }finally { sessionutil.closesession(session); } return isadd>0; } /** *根据id删除t类型 * @param id 要删除t的id * @return true成功 */ public boolean delete(class<t> t,int id){ int isdelete = 0; sqlsession session = sessionutil.getsession(); try { isdelete = session.delete(t.getname()+".delete",id); session.commit(); } catch (exception e) { session.rollback();//失败返回 system.out.println("删除用户失败"); e.printstacktrace(); }finally { sessionutil.closesession(session); } return isdelete>0; } /** *更新t类型 * @param t 要更新的用户 * @return true成功 */ public boolean update(t t){ int isupdate = 0; sqlsession session = sessionutil.getsession(); try { isupdate = session.delete(t.getclass().getname()+".update",t); session.commit(); } catch (exception e) { session.rollback();//失败返回 system.out.println("更新用户失败"); e.printstacktrace(); }finally { sessionutil.closesession(session); } return isupdate>0; } /** * 根据指定条件分页查询 * @param maps 指定条件集合 * @return */ public pager<t> find(class<t> t,map<string,object> maps){ int pagestart = systemcontext.getpagestart();//分页起始 int pagesize = systemcontext.getpagesize();//分页大小 pager<t> pagers = new pager<>(); maps.put("pagestart",pagestart); maps.put("pagesize",pagesize); sqlsession session = sessionutil.getsession(); list<t> datas = null; try { datas = session.selectlist(t.getname()+".find",maps);//获取记录 pagers.setdatas(datas); pagers.setpagesize(pagesize); pagers.setpagestart(pagestart); int totalrecord = session.selectone(t.getname()+".findcount",maps);//获取记录总数 pagers.settotalrecord(totalrecord); pagers.setpageindex(pagestart/pagesize+1); } finally { sessionutil.closesession(session); } return pagers; } /** * 根据指定条件取出部分数据 * @param maps 指定条件集合 * @return */ public pager<t> list(class<t> t,map<string,object> maps){ pager<t> pagers = new pager<>(); sqlsession session = sessionutil.getsession(); list<t> datas = null; try { datas = session.selectlist(t.getname()+".list",maps);//获取记录 pagers.setdatas(datas); pagers.settotalrecord(datas.size()); } finally { sessionutil.closesession(session); } return pagers; } }
同样的userdao.java也需要相应的修改
public class userdao extends basedao<user>{ /** * 根据id取出一个用户 * @param id 要取出用户的id * @return */ public user load(int id){ return super.load(user.class,id); } /* 其他函数就不一一贴出来了,都是类似的写法*/ }
二.resultmap的映射
简单来说当数据库中的字段信息和对象的属性不一致时需要通过resultmap来映射.
举个例子:address属性中有一个user的实体类,如下
public class address { private int id; private string name; private string phone; private string postcode; //直接给user对象,来代替user_id private user user; ````````` }
那么我们想取出来一个address的同时也取出其对应的user,然而这是两个对象,且两者都有id属性,所以对于mybatis在调用set方法设置属性时就会混乱而使用resultmap的目的就是消除这种混乱.
编写load的sql
<!--加载一个地址--> <!--这里需要表连接,取出user,又连接保证取出的地址不为空,并且为重复属性id取别名--> <select id="load" parametertype="int" resultmap="addressmap"> select *,t1.id as 'a_id' from address t1 right join user t2 on (t1.user_id = t2.id) where t1.id=#{id}; </select>
这里就使用的resultmap来映射,这个resultmap的名字叫做addressmap.
addressmap
<resultmap id="addressmap" type="address" automapping="true"> <!--把结果中的a_id映射为id,其他的automapping = true会自动匹配--> <id column="a_id" property="id"/> <!--取出关联属性--> <association property="user" javatype="user" > <!--把user_id映射为user的id--> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="nickname" property="nickname"/> <result column="type" property="type"/> </association> </resultmap>
- type 代表其类型,不包括关联属性
- automapping true表示消除冲突后,剩下的属性会自动匹配
- id和result id 和 result 都映射一个单独列的值到简单数据类型,不同是 id 表示的结果将是当比较对象实例时用到的标识属性,一般是主键
- association 代表关联属性,这里设置的是user,对于关联映射,其里面想要显示的属性必须要手动指定property,不然会无法映射
上面配置完,当搜索出来的时候,mybatis就会自动调用其相应的set方法,把属性设置到实体类中.
测试
package com.dao; import com.model.address; public class addressdao extends basedao<address> { public static void main(string[] args) { addressdao addressdao = new addressdao(); address address = addressdao.load(1); system.out.println(address.tostring()); } /** * 加载一个地址 * @param id 要加载地址的id * @return 返回要加载的地址,null则加载失败 */ public address load(int id){ return super.load(address.class,id); } }
效果图可以看出来,只要是映射的关联属性都取出来了,没映射的都为null
按照这样的想法把其他函数补全
xml代码:
<?xml version="1.0" encoding="utf-8" ?> <!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.model.address"> <!--当数据库中的字段信息和对象的属性不一致时需要通过resultmap来映射 --> <resultmap id="addressmap" type="address" automapping="true"> <!--把结果中的a_id映射为id,其他的automapping = true会自动匹配--> <id column="a_id" property="id"/> <!--取出关联属性--> <association property="user" javatype="user" > <!--把user_id映射为user的id--> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="nickname" property="nickname"/> <result column="type" property="type"/> </association> </resultmap> <!--加载一个地址--> <!--这里需要表连接,取出user,又连接保证取出的地址不为空,并且为重复属性id取别名--> <select id="load" parametertype="int" resultmap="addressmap"> select *,t1.id as 'a_id' from address t1 right join user t2 on (t1.user_id = t2.id) where t1.id=#{id}; </select> <!--增加一个地址--> <insert id="add" parametertype="address"> insert into address values (null,#{name},#{phone},#{postcode},${user_id}) </insert> <!--删除一个地址--> <delete id="delete" parametertype="int"> delete from address where id=#{id} </delete> <!--修改一个地址--> <update id="update" parametertype="address"> update address set name=#{name},phone=#{phone},postcode=#{postcode} where id=#{id} </update> <!--找出指定用户所有的地址--> <select id="list" parametertype="map" resultmap="addressmap"> select *,t1.id as 'a_id' from address t1 right join user t2 on (t1.user_id=t2.id) where t1.user_id=#{user_id} </select> </mapper>
java代码:
package com.dao; import com.model.address; import com.model.pager; import java.util.hashmap; import java.util.map; /** * created by nl101 on 2016/2/23. */ public class addressdao extends basedao<address> { public static void main(string[] args) { addressdao addressdao = new addressdao(); pager<address> pagers = addressdao.list(1); system.out.println(pagers.getdatas().size()); } /** * 加载一个地址 * @param id 要加载地址的id * @return 返回要加载的地址,null则加载失败 */ public address load(int id){ return super.load(address.class,id); } /** * 添加一个地址 * @param address 要添加的地址 * @param user_id 要添加的地址对应的user_id * @return true成功 */ public boolean add(address address,int user_id){ userdao userdao = new userdao(); if (userdao.load(user_id)==null){ return false; } return super.add(address); } /** * 删除一个地址 * @param id 要删除地址对应的id * @return true删除成功 */ public boolean delete(int id){ return super.delete(address.class,id); } /** * 更新一个地址 * @param address 要更新的地址 * @return true更新成功 */ public boolean update(address address){ return super.update(address); } /** * 根据用户id取出该用户所有地址 * @param user_id * @return */ public pager<address> list(int user_id){ map<string,object> maps = new hashmap<>(); maps.put("user_id",user_id); return super.list(address.class,maps); } }
ado层按照这样写,就没问题了。
以上就是本文的全部内容,整个javaweb商城项目开发就为大家分享到这,希望对大家的学习有所帮助。
上一篇: 15个*Java多线程面试题(附答案)