欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-08 19:43:06
上一篇已经把实体类,分页工具创建好了,这一篇利用mybatis创建dao层. 另外mybatis的api文档可以参考 一.mybatis的使用 1. 引入架包 这里...

上一篇已经把实体类,分页工具创建好了,这一篇利用mybatis创建dao层.

另外mybatis的api文档可以参考

一.mybatis的使用

1. 引入架包

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

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

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();
    }
  }

结果:

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

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;
  }

目前项目结构

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

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