最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(二)

 更新時(shí)間:2021年08月31日 15:09:33   作者:茶飲月  
這篇文章主要針對(duì)javaweb商城項(xiàng)目開(kāi)發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),利用mybatis創(chuàng)建DAO層,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

上一篇《javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(一)》已經(jīng)把實(shí)體類(lèi),分頁(yè)工具創(chuàng)建好了,這一篇利用mybatis創(chuàng)建DAO層.

另外mybatis的api文檔可以參考

一.mybatis的使用

1. 引入架包

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

2. 編寫(xiě)Config.xml配置數(shù)據(jù)庫(kù)環(huán)境

先貼代碼,然后逐個(gè)解釋

<?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>
    <!--第二個(gè)環(huán)境-->
    <environment id="publish">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED"/>
    </environment>
  </environments>
</configuration>

第一步是要引入xml文件格式,也就是dtd,這個(gè)要直接復(fù)制mybatis提供的模版

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

問(wèn)題1

properties 功能是配置相應(yīng)的properties文件,resource是指定相應(yīng)的路線(xiàn),properties文件里面我們可以配置數(shù)據(jù)庫(kù)驅(qū)動(dòng),url,用戶(hù)名,密碼等,參考下面,這樣的話(huà)mybatis就會(huì)自動(dòng)讀取下面的參數(shù),你可以在xml中用${}來(lái)引用.

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

問(wèn)題2

typeAliases配置指定路徑下的別名,我們可以配置單個(gè)別名
單個(gè)名稱(chēng)<typeAlias type="com.model.User" alias="User"/>這樣就把com.model.User修改為別名User,后面就不需要寫(xiě)全部名稱(chēng)了,只需要User即可代替
批量修改<package name="com.model"/>這樣就可以把一個(gè)包的類(lèi)全部修改,默認(rèn)別名為實(shí)體類(lèi)類(lèi)名

問(wèn)題3

environments是配置數(shù)據(jù)庫(kù)環(huán)境的,可以配置多個(gè)環(huán)境,例如開(kāi)發(fā)環(huán)境和發(fā)布環(huán)境,default是指默認(rèn)環(huán)境
environment注意沒(méi)有s,代表environments下的一個(gè)環(huán)境,通過(guò)id區(qū)分,因此id必須唯一
transactionManager代表連接數(shù)據(jù)庫(kù)類(lèi)型,JDBC連接java
dataSource配置數(shù)據(jù)源模式,pooled就是連接池模式,具體其他模式可以去官方文檔看下,根據(jù)需要選擇
property這個(gè)就是配置數(shù)據(jù)庫(kù)連接了,name不用動(dòng),修改value=”driver",這里是用{}是讀取最上方properties 這個(gè)文件里面的配置,這里注意匹配名稱(chēng)才能讀取進(jìn)來(lái)的哈
3.編寫(xiě)mapper映射sql語(yǔ)句

這里編寫(xiě)UserDao的load方法,也就是根據(jù)id讀取一個(gè)用戶(hù),下面代碼就是相當(dāng)于public User load(int id)函數(shù)
對(duì)于mybatis有兩種替換#{}替換會(huì)根據(jù)類(lèi)型自動(dòng)帶上引號(hào),例如string類(lèi)型#{name}替換后為'name'.另一種是${}替換,這種是與按照原格式直接替換,不會(huì)添加其他東西

<?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文件規(guī)則

select 標(biāo)簽,說(shuō)明當(dāng)前是一個(gè)select語(yǔ)句
id屬性,相當(dāng)于是函數(shù)名,通過(guò)id引用
parameterType屬性,代表傳入?yún)?shù)類(lèi)型,可以指定基本類(lèi)型,也可以是自定義類(lèi)型,是自定義類(lèi)型的話(huà),會(huì)自動(dòng)調(diào)用其get方法,獲取其屬性
resultType屬性,返回值類(lèi)型,可以直接自定義類(lèi)型,會(huì)自動(dòng)調(diào)用set方法把查詢(xún)出來(lái)的參數(shù)設(shè)置進(jìn)去
更多屬性在后續(xù)文章中使用到再說(shuō).

4.調(diào)用mapper映射

調(diào)用之前需要先在Config.xml中配置映射,注意這里配置的xml是文件路徑哈

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

然后寫(xiě)測(cè)試類(lèi)

public static void main(String[] args) {
    try {
      InputStream is = Resources.getResourceAsStream("Config.xml");//讀取配置文件
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//利用配置文件創(chuàng)建factory
      SqlSession session = factory.openSession();//獲取session
      User user = session.selectOne(User.class.getName()+".load",1);//調(diào)用load函數(shù)
      System.out.println(user.getNickname());//輸出昵稱(chēng)
      session.close();//關(guān)閉session
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

結(jié)果:

5.Sqlsession工具類(lèi)

像上面那樣寫(xiě)測(cè)試類(lèi)太麻煩,就把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);//利用配置文件創(chuàng)建factory
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

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

  /**
   * 關(guān)閉session
   * @param session
   */
  public static void closeSession(SqlSession session){
    if (session!=null) session.close(); session = null;
  }
}

以上就是mybatis的基本使用,下面開(kāi)始封裝DAO層

二.封裝DAO

1.UserDao.java

public User load(int id)根據(jù)id獲取一個(gè)User
上面已經(jīng)寫(xiě)過(guò)了
public boolean add(User user) 增加一個(gè)用戶(hù)
XML代碼

 <!--增加一個(gè)用戶(hù)-->
  <insert id="add" parameterType="User">
    INSERT INTO user VALUES 
    (null,#{username},#{password},#{nickname},#{type})
  </insert>

JAVA代碼

/**
   /**
   * 添加一個(gè)用戶(hù)
   * @param user 要添加的用戶(hù)
   * @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)刪除一個(gè)用戶(hù)

xml代碼

 <!--刪除一個(gè)用戶(hù)-->
  <delete id="delete" parameterType="int">
    DELETE FROM user WHERE id=#{id}
  </delete>

java代碼

/**
   *根據(jù)id刪除用戶(hù)
   * @param id 要?jiǎng)h除用戶(hù)的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("刪除用戶(hù)失敗");
      e.printStackTrace();
    }finally {
      SessionUtil.closeSession(session);
    }
    return isDelete>0;
  }

public boolean update(User user)更新用戶(hù)

xml代碼

<!--修改一個(gè)用戶(hù)-->
  <update id="update" parameterType="User" >
    UPDATE user SET username=#{username},password=#{password},nickname=#{nickname},type=#{type} where id=#{id}
  </update>

java代碼

/**
   *更新用戶(hù)
   * @param user 要更新的用戶(hù)
   * @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("更新用戶(hù)失敗");
      e.printStackTrace();
    }finally {
      SessionUtil.closeSession(session);
    }
    return isUpdate>0;
  }


public User login(String username, String password)判斷用戶(hù)是否存在

xml代碼

<!--用戶(hù)登錄判斷-->
  <select id="login" parameterType="String" resultType="User">
    SELECT * FROM user WHERE username=#{username}
  </select>

java代碼

/**
   * 判斷一個(gè)用戶(hù)是否存在
   * @param username 用戶(hù)名
   * @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);
      //當(dāng)密碼不對(duì)的時(shí)候置user為null
      if (!user.getPassword().equals(password)){
        user = null;
      }

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

public Pager find(String name,String sort,String order)分頁(yè)處理

xml代碼:
這里用到了動(dòng)態(tài)sql,關(guān)于動(dòng)態(tài)sql,就是where,if,chose等標(biāo)簽的使用,可以參考官方文檔
另外在mybatis中,null的概念是不存在,舉個(gè)例子,你傳個(gè)user=null,但是在替換的時(shí)候替換為”null”串.沒(méi)有這個(gè)值才為null

 <!--分頁(yè)代碼-->
  <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>
  <!--分頁(yè)總記錄數(shù)-->
  <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代碼:總體還是按照前面文章設(shè)計(jì)的分頁(yè)

/**
   * 根據(jù)指定條件分頁(yè)查詢(xún)
   * @param name 查詢(xún)條件,null代表無(wú)條件
   * @param sort 排序條件,null代表按照id排序
   * @param order 排序條件,null代表升序
   * @return
   */
  public Pager<User> find(String name,String sort,String order){
    int pageStart = SystemContext.getPageStart();//分頁(yè)起始
    int pageSize = SystemContext.getPageSize();//分頁(yè)大小
    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";//默認(rèn)按照id排序
    }
    if (order==null || order.equals("")){
      order = "asc";//默認(rèn)排序
    }
    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);//獲取記錄總數(shù)
      pagers.setTotalRecord(totalRecord);
      pagers.setPageIndex(pageStart/pageSize+1);

    } finally {
      SessionUtil.closeSession(session);
    }

    return pagers;
  }

目前項(xiàng)目結(jié)構(gòu)

下一篇寫(xiě)一個(gè)通用的BaseDao,以方便代碼書(shū)寫(xiě).并且繼續(xù)學(xué)習(xí)mybatis其他屬性的使用,感謝大家的閱讀。

相關(guān)文章

  • Java語(yǔ)法基礎(chǔ)之for語(yǔ)句練習(xí)

    Java語(yǔ)法基礎(chǔ)之for語(yǔ)句練習(xí)

    以下是對(duì)Java語(yǔ)法基礎(chǔ)中的for語(yǔ)句進(jìn)行了詳細(xì)介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • Spring Boot支持HTTPS步驟詳解

    Spring Boot支持HTTPS步驟詳解

    這篇文章主要介紹了Spring Boot支持HTTPS步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • spring的同一定時(shí)任務(wù)上一次的任務(wù)未結(jié)束前不會(huì)啟動(dòng)這次任務(wù)問(wèn)題

    spring的同一定時(shí)任務(wù)上一次的任務(wù)未結(jié)束前不會(huì)啟動(dòng)這次任務(wù)問(wèn)題

    這篇文章主要介紹了spring的同一定時(shí)任務(wù)上一次的任務(wù)未結(jié)束前不會(huì)啟動(dòng)這次任務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)

    Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)

    這篇文章主要介紹了Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot的application.yml不生效問(wèn)題及解決

    SpringBoot的application.yml不生效問(wèn)題及解決

    這篇文章主要介紹了SpringBoot的application.yml不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • maven解決包沖突方法詳解

    maven解決包沖突方法詳解

    這篇文章主要介紹了maven解決包沖突方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • lambdaQueryWrapper多條件嵌套查詢(xún)方式

    lambdaQueryWrapper多條件嵌套查詢(xún)方式

    這篇文章主要介紹了lambdaQueryWrapper多條件嵌套查詢(xún)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • mybatis中如何實(shí)現(xiàn)一個(gè)標(biāo)簽執(zhí)行多個(gè)sql語(yǔ)句

    mybatis中如何實(shí)現(xiàn)一個(gè)標(biāo)簽執(zhí)行多個(gè)sql語(yǔ)句

    這篇文章主要介紹了mybatis中如何實(shí)現(xiàn)一個(gè)標(biāo)簽執(zhí)行多個(gè)sql語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Mybatis步驟分解實(shí)現(xiàn)一個(gè)增刪改查程序

    Mybatis步驟分解實(shí)現(xiàn)一個(gè)增刪改查程序

    MybatisPlus是國(guó)產(chǎn)的第三方插件, 它封裝了許多常用的CURDapi,免去了我們寫(xiě)mapper.xml的重復(fù)勞動(dòng)。本文將整合MybatisPlus實(shí)現(xiàn)增刪改查功能,感興趣的可以了解一下
    2022-05-05
  • Java?8中?Stream小知識(shí)小技巧方法梳理

    Java?8中?Stream小知識(shí)小技巧方法梳理

    這篇文章主要介紹了Java8中Stream小知識(shí)小技巧方法梳理,Stream流和迭代器一樣,它只能夠迭代一次。當(dāng)它遍歷完的時(shí)候,我們就稱(chēng)它已經(jīng)消費(fèi)完了。如果還想重新執(zhí)行操作,那么就只能從原來(lái)的地方再獲取一個(gè)流
    2022-09-09

最新評(píng)論

昭通市| 昆明市| 银川市| 浦县| 阳春市| 禹城市| 西华县| 泰宁县| 陆良县| 武鸣县| 巴彦淖尔市| 兴化市| 壶关县| 南雄市| 临猗县| 阿勒泰市| 陆川县| 太仆寺旗| 黑河市| 潼南县| 原阳县| 通渭县| 宣恩县| 仪征市| 腾冲县| 西华县| 涟源市| 康马县| 稷山县| 巨野县| 云安县| 荣昌县| 罗甸县| 平凉市| 松阳县| 柘荣县| 沐川县| 腾冲县| 乌兰察布市| 尚志市| 全椒县|