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

上一篇《javaweb实战之商城项目开发(一)》已经把实体类,分页工具创建好了,这一篇利用mybatis创建DAO层.

另外mybatis的api文档可以参考

一.mybatis的使用

1. 引入架包

这里引入mybatis和mysql的架包到lib中

2. 编写Config.xml配置数据库环境

先贴代码,然后逐个解释

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <properties resource="Config.properties"/>
  <typeAliases>
    <package name="com.model"/>
  </typeAliases>
  <environments default="development">

    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
    <!--第二个环境-->
    <environment id="publish">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED"/>
    </environment>
  </environments>
</configuration>

第一步是要引入xml文件格式,也就是dtd,这个要直接复制mybatis提供的模版

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

问题1
properties 功能是配置相应的properties文件,resource是指定相应的路线,properties文件里面我们可以配置数据库驱动,url,用户名,密码等,参考下面,这样的话mybatis就会自动读取下面的参数,你可以在xml中用${}来引用.

driver = com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/shop
username=root
password=123456

问题2
typeAliases配置指定路径下的别名,我们可以配置单个别名
单个名称<typeAlias type="com.model.User" alias="User"/>这样就把com.model.User修改为别名User,后面就不需要写全部名称了,只需要User即可代替
批量修改<package name="com.model"/>这样就可以把一个包的类全部修改,默认别名为实体类类名
问题3
environments是配置数据库环境的,可以配置多个环境,例如开发环境和发布环境,default是指默认环境
environment注意没有s,代表environments下的一个环境,通过id区分,因此id必须唯一
transactionManager代表连接数据库类型,JDBC连接java
dataSource配置数据源模式,pooled就是连接池模式,具体其他模式可以去官方文档看下,根据需要选择
property这个就是配置数据库连接了,name不用动,修改value=”driver",这里是用{}是读取最上方properties 这个文件里面的配置,这里注意匹配名称才能读取进来的哈
3.编写mapper映射sql语句

这里编写UserDao的load方法,也就是根据id读取一个用户,下面代码就是相当于public User load(int id)函数
对于mybatis有两种替换#{}替换会根据类型自动带上引号,例如string类型#{name}替换后为'name'.另一种是${}替换,这种是与按照原格式直接替换,不会添加其他东西

<?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>
  <select id="load" parameterType="int" resultType="User">
    SELECT * from user WHERE id=#{id}
  </select>
</mapper>

第一步还是引入dtd头文件,制定xml文件规则

select 标签,说明当前是一个select语句
id属性,相当于是函数名,通过id引用
parameterType属性,代表传入参数类型,可以指定基本类型,也可以是自定义类型,是自定义类型的话,会自动调用其get方法,获取其属性
resultType属性,返回值类型,可以直接自定义类型,会自动调用set方法把查询出来的参数设置进去
更多属性在后续文章中使用到再说.
4.调用mapper映射

调用之前需要先在Config.xml中配置映射,注意这里配置的xml是文件路径哈

<mappers>
  <mapper resource="com/model/User.xml"/>
</mappers>

然后写测试类

public static void main(String[] args) {
    try {
      InputStream is = Resources.getResourceAsStream("Config.xml");//读取配置文件
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//利用配置文件创建factory
      SqlSession session = factory.openSession();//获取session
      User user = session.selectOne(User.class.getName()+".load",1);//调用load函数
      System.out.println(user.getNickname());//输出昵称
      session.close();//关闭session
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

结果:

5.Sqlsession工具类

像上面那样写测试类太麻烦,就把Sqlsession封装下,方便DAO层的使用

package com.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by nl101 on 2016/2/23.
 */
public class SessionUtil {
  private static SqlSessionFactory factory= null;
  static {
    try {
      InputStream is = Resources.getResourceAsStream("Config.xml");//读取配置文件
      factory = new SqlSessionFactoryBuilder().build(is);//利用配置文件创建factory
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  /**
   * 获取session
   * @return
   */
  public static SqlSession getSession(){
    return factory.openSession();
  }

  /**
   * 关闭session
   * @param session
   */
  public static void closeSession(SqlSession session){
    if (session!=null) session.close(); session = null;
  }
}

以上就是mybatis的基本使用,下面开始封装DAO层

二.封装DAO

1.UserDao.java

public User load(int id)根据id获取一个User
上面已经写过了
public boolean add(User user) 增加一个用户
XML代码

 <!--增加一个用户-->
  <insert id="add" parameterType="User">
    INSERT INTO user VALUES
    (null,#{username},#{password},#{nickname},#{type})
  </insert>

JAVA代码

/**
   /**
   * 添加一个用户
   * @param user 要添加的用户
   * @return true成功
   */
  public boolean add(User user){
    int isAdd = 0;
    SqlSession session = SessionUtil.getSession();
    try {
      isAdd = session.insert(User.class.getName()+".add",user);
      session.commit();//提交
    } catch (Exception e) {
      session.rollback();//提交失败则回滚

    }finally {
      SessionUtil.closeSession(session);
    }
    System.out.println(isAdd);
    return isAdd>0;
  }

public boolean delete(int id)删除一个用户

xml代码

 <!--删除一个用户-->
  <delete id="delete" parameterType="int">
    DELETE FROM user WHERE id=#{id}
  </delete>

java代码

/**
   *根据id删除用户
   * @param id 要删除用户的id
   * @return true成功
   */
   public boolean delete(int id){
    int isDelete = 0;
    SqlSession session = SessionUtil.getSession();
    try {
      isDelete = session.delete(User.class.getName()+".delete",id);
      session.commit();
    } catch (Exception e) {
      session.rollback();//失败返回
      System.out.println("删除用户失败");
      e.printStackTrace();
    }finally {
      SessionUtil.closeSession(session);
    }
    return isDelete>0;
  }

public boolean update(User user)更新用户

xml代码

<!--修改一个用户-->
  <update id="update" parameterType="User" >
    UPDATE user SET username=#{username},password=#{password},nickname=#{nickname},type=#{type} where id=#{id}
  </update>

java代码

/**
   *更新用户
   * @param user 要更新的用户
   * @return true成功
   */
   public boolean update(User user){
    int isUpdate = 0;
    SqlSession session = SessionUtil.getSession();
    try {
      isUpdate = session.delete(User.class.getName()+".update",user);
      session.commit();
    } catch (Exception e) {
      session.rollback();//失败返回
      System.out.println("更新用户失败");
      e.printStackTrace();
    }finally {
      SessionUtil.closeSession(session);
    }
    return isUpdate>0;
  }

public User login(String username, String password)判断用户是否存在

xml代码

<!--用户登录判断-->
  <select id="login" parameterType="String" resultType="User">
    SELECT * FROM user WHERE username=#{username}
  </select>

java代码

/**
   * 判断一个用户是否存在
   * @param username 用户名
   * @param password 密码
   * @return 存在返回User 不存在返回null
   */
  public User login(String username, String password){
    User user = null;
    SqlSession session = SessionUtil.getSession();
    try {
      user = session.selectOne(SOAPBinding.Use.class.getName()+".login",username);
      //当密码不对的时候置user为null
      if (!user.getPassword().equals(password)){
        user = null;
      }

    } finally {
      SessionUtil.closeSession(session);
    }
    return user;
  }

public Pager find(String name,String sort,String order)分页处理

xml代码:
这里用到了动态sql,关于动态sql,就是where,if,chose等标签的使用,可以参考官方文档
另外在mybatis中,null的概念是不存在,举个例子,你传个user=null,但是在替换的时候替换为”null”串.没有这个值才为null

 <!--分页代码-->
  <select id="find" parameterType="Map" resultType="User">
    SELECT * from user
    <if test="name!=null">WHERE (username LIKE #{name} or nickname LIKE #{name})</if>
     ORDER BY ${sort} ${order}
      LIMIT #{pageStart},#{pageSize}
  </select>
  <!--分页总记录数-->
  <select id="findcount" parameterType="Map" resultType="int">
    SELECT count(*) from user
    <if test="name!=null">WHERE (username LIKE #{name} or nickname LIKE #{name})</if>
  </select>

java代码:总体还是按照前面文章设计的分页

/**
   * 根据指定条件分页查询
   * @param name 查询条件,null代表无条件
   * @param sort 排序条件,null代表按照id排序
   * @param order 排序条件,null代表升序
   * @return
   */
  public Pager<User> find(String name,String sort,String order){
    int pageStart = SystemContext.getPageStart();//分页起始
    int pageSize = SystemContext.getPageSize();//分页大小
    Pager<User> pagers = new Pager<>();
    Map<String,Object> maps = new HashMap<>();
    if (name!=null && !name.equals("")){
      name = "%"+name+"%";
      maps.put("name",name);
    }
    if (sort==null || sort.equals("")){
      sort = "id";//默认按照id排序
    }
    if (order==null || order.equals("")){
      order = "asc";//默认排序
    }
    maps.put("sort",sort);
    maps.put("order",order);
    maps.put("pageStart",pageStart);
    maps.put("pageSize",pageSize);
    SqlSession session = SessionUtil.getSession();
    List<User> datas = null;
    try {
      datas = session.selectList(User.class.getName()+".find",maps);//获取记录
      pagers.setDatas(datas);
      pagers.setPageSize(pageSize);
      pagers.setPageStart(pageStart);
      int totalRecord = session.selectOne(User.class.getName()+".findcount",maps);//获取记录总数
      pagers.setTotalRecord(totalRecord);
      pagers.setPageIndex(pageStart/pageSize+1);

    } finally {
      SessionUtil.closeSession(session);
    }

    return pagers;
  }

目前项目结构

下一篇写一个通用的BaseDao,以方便代码书写.并且继续学习mybatis其他属性的使用,感谢大家的阅读。

(0)

相关推荐

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

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

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

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

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

    接着上一篇<javaweb实战之商城项目开发(二)>这一篇主要实现通用的BaseDao.java和使用resultMap映射关联对象 一.通用的BaseDao.java 既然要大家都能用,所以使用了泛型.其中要注意的问题就是类似User.getClass().getName()这样的代码是需要修改的.修改方法就是使用参数Class tc传递过来,然后在使用tc.getName()即可. 完整代码: package com.dao; import com.model.Pager; import

  • 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

  • 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'

  • 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

  • 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服务器搭建方法整理(apache)

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

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

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

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

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

随机推荐