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

接着上一篇《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

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

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)

相关推荐

  • Windows下SVN服务器搭建方法整理(apache)

    本节和大家谈谈Windows下SVN服务器搭建问题,在这里拿出来和大家分享一下,希望对大家有用. 1,软件下载 Windows下SVN服务器搭建,下载Subversion服务器程序.到官方网站的下载二进制安装文件,来到二进制包下载部分,找到WindowsNT,2000,XPand2003部分,然后选择"thisdirectory",这样我们可以看到许多下载的内容,目前可以下载svn-1.4.0-setup.exe.下载Subversion的Windows客户端TortoiseSVN.T

  • Tomcat7.0安装配置详细(图文)

    说明:Tomcat服务器上一个符合J2EE标准的Web服务器,在tomcat中无法运行EJB程序,如果要运行可以选择能够运行EJB程序的容器WebLogic,WebSphere,Jboss等 Tomcat的下载: http://tomcat.apache.org/ 1.进入上面的网站然后如下操作使用Window Service Installer(为Window 添加服务) 2.然后我们进行安装 说明一下: 以前的版本是没有关于Role的设定,到了7.0的时候就有有关的设定,这也说明Tomcat

  • windows tomcat配置大全[详细]

    Tomcat下JSP.Servlet和JavaBean环境的配置 经常看到jsp的初学者问tomcat下如何配置jsp.servlet和bean的问题,于是总结了一下如何tomcat下配置jsp.servlet和ben,希望对那些初学者有所帮助. 第一步:下载j2sdk和tomcat:到sun官方站点(http://java.sun.com/j2se/1.4.2/download.html)下载j2sdk,注意下载版本为Windows Offline Installation的SDK,同时最好下

  • WINDOWS下搭建SVN服务器端的步骤分享(Subversion)

    1.获取svn程序 2.安装 Subversion(以下简称SVN)的服务器端和客户端.下载下来的服务器端是个 zip压缩包,直接解压缩即可,比如我解压到 E:\subversion .客户端安装文件是个 exe 可执行文件,直接运行按提示安装即可,客户端安装完成后提示重启. 3.先建立空目录 E:\svn\repos1 ,注意一定是要空的.然后在 repos1 文件夹上"右键->TortoiseSVN->Create Repository here...",然后可以选择版

  • Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    Javaweb开发环境的配置也是比较繁琐的一件事情,虽然理论上使用记事本,完全可以写出一个Javaweb工程, 但是在团队大型开发的Javaweb过程中,你必须配置好Eclipse.SVN.Tomcat与JDK1.6,当然还有Mysql数据库,不过数据库配置的事情属于后台内容,本文仅讨论前台开发环境的配置. 之所以选择Myeclipse6.5是因为其他高版本的Myeclipse实在是太卡,编辑小型程序还好,编辑大型程序完全吃不消,Eclipse的功能毕竟简陋,所以还是选择了旧版本.经典版本Mye

  • VisualSVN Server的配置和使用方法 图文

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权限,另外如果要想以Web方式[http协议]访问,一般还要安装配置Apache,如果是新手,岂不是很头痛?而VisualSVN Serve集成了Subversion和Apache,省去了以上所有的麻烦.安装的时候SVN Server已

  • eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置数据库连接池

    now begin: step 1: 建立数据库连接池. 1. 从Tomcat的主页上下载Tomcat5.5.27,推荐绿色版(zip),不用为重做系统而发愁. 2. 下载Tomcat5.5.27的admin包,解压缩后覆盖Tomcat5.5.27的根目录. 3. 在Tomcat5.5.27的根目录下conf文件夹里的tomcat-users.xml里, </tomcat-users>之前加上一行 <user username="admin" password=&qu

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

    一.项目功能结构 1.功能 2.实体 3.对应sql语句 CREATE DATABASE shop; use shop; create table user( id int(11) primary key auto_increment, username varchar(100), password varchar(100), nickname varchar(100), type int(5) ); INSERT INTO user VALUES (null,'admin','7946521'

  • 解决常见的Eclipse SVN插件报错方法详解

    在学习SVN的过程中,你经常会遇到SVN插件问题,本文介绍一下在安装SVN插件时常见Eclipse SVN插件报错信息问题,希望本文介绍对你的学习有所帮助. AD: 本节和大家一起看一下SVN插件在安装过程中遇到的常见Eclipse SVN插件报错信息,和大家一起分享一下,希望通过本节的介绍大家知道当出现SVN插件报错时该如何处理. 常见Eclipse SVN插件报错信息: 1.update-rHEADD:/dev/workforceWorkingcopynotlocked;thisisprob

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

    上一篇<javaweb实战之商城项目开发(一)>已经把实体类,分页工具创建好了,这一篇利用mybatis创建DAO层. 另外mybatis的api文档可以参考 一.mybatis的使用 1. 引入架包 这里引入mybatis和mysql的架包到lib中 2. 编写Config.xml配置数据库环境 先贴代码,然后逐个解释 <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE configur

随机推荐