javaweb实战之商城项目开发(三)

作者:茶饮月 时间:2023-04-15 14:27:34 

接着上一篇《javaweb实战之商城项目开发(二)》这一篇主要实现通用的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

javaweb实战之商城项目开发(三)

按照这样的想法把其他函数补全

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,商城,项目开发
0
投稿

猜你喜欢

  • java自定义切面增强方式(关于自定义注解aop)

    2022-05-30 15:16:58
  • C#通过反射打开相应窗体方法分享

    2023-09-21 07:37:14
  • Android简易音乐播放器实现代码

    2021-12-22 23:26:53
  • Java与Kotlin互调原理讲解

    2023-08-19 00:07:41
  • Java使用Redis实现秒杀功能

    2023-04-11 11:26:54
  • Java的Struts框架中Action的编写与拦截器的使用方法

    2021-11-22 02:58:53
  • C#中using语句的用法

    2023-07-02 05:33:24
  • Android 区别真机和模拟器的几种方法

    2022-05-19 14:13:44
  • Springboot中Aspect切面的实现方式(以记录日志为例)

    2022-09-15 20:58:25
  • ListView实现下拉动态渲染数据

    2022-10-31 11:19:12
  • myeclipse安装Spring Tool Suite(STS)插件的方法步骤

    2023-02-22 00:56:02
  • Java实现FIFO任务调度队列策略

    2021-09-19 09:05:37
  • Java 事务注解@Transactional回滚(try catch、嵌套)问题

    2021-05-29 17:54:43
  • 解决Map集合使用get方法返回null抛出空指针异常问题

    2023-11-25 00:14:00
  • 关于Maven混合配置私有仓库和公共仓库的问题

    2021-10-15 20:30:51
  • mybatis源码解读之executor包懒加载功能 

    2022-09-17 00:28:05
  • C#中Socket与Unity相结合示例代码

    2022-09-15 23:24:15
  • android利用剪切板传递数据

    2022-06-24 06:37:40
  • C#查找字符串所有排列组合的方法

    2022-07-04 10:01:54
  • Android创建淡入淡出动画的详解

    2022-12-28 00:12:12
  • asp之家 软件编程 m.aspxhome.com