Day62 Mybatis基於SqlSession對象的查詢

Mybatis框架配置文件的進一步補充

Mybatis學習(第二天):
    eclipse配置本地dtd文件:
        在根盤符下創建dtd文件夾,例如:D盤下
        在mybatis的源碼中搜索DTD文件,將其複製到dtd文件夾中
        在eclipse的window下preferces中選擇-->xmlcatalog-->add--->location選擇dtd文件夾中的dtd文件路徑,key的值爲dtd引入的網址
        例如:
            http://mybatis.org/dtd/mybatis-3-config.dtd
    mybatis常見錯誤:
        第一:Mapped Statements collection does not contain value for com.bjsxt.mapper.FlowerMapper.selF2
            問題:因爲mybatis.xml中的mapper路徑配置不正確,獲取sqlPath書寫不正確造成的
        第二:Unknown DataSource property: user
            問題:數據庫源配置參數名寫錯了
    mybatis開啓自定義別名:
        在mybatis.xml中使用typeAliases標籤開啓自定義別名
        <typeAliases>
        <!-- 給指定的實體類添加指定的別名 -->
        <!-- <typeAlias type="com.bjsxt.pojo.Flower" alias="f"/> -->
        <!-- 包中的類名即別名,不區分大小寫 -->
        <package name="com.bjsxt.pojo"/>
        </typeAliases>
    mybatis.xml配置文件開啓log4j支持
        只需要在src下創建log4j.properties文件,即可開啓。mybatis的log4j默認是開啓狀態
        <!--開啓mybatis的日誌支持  -->
        <settings>
            <setting name="logImpl" value="SLF4J"/>
        </settings>
    mybatis集成了數據庫連接池:
        單例設計模式:
            問題:
                我們現有獲取了類對象的方式是通過new關鍵字進行創建,每new一次,就會創建
            一個新的對象,數據也就不同了。但是,在不同的處理代碼中,我們往往需要獲取到同一個對象,這樣才能獲取到相同的數據,。
            解決:
                使用單例設計模式
            使用:
                餓漢式
                懶漢式
        數據庫連接池的原理:
            數據庫連接池中長存固定個數的數據庫連接對象
                我們不在直接的進行數據庫連接對象的創建和關閉,通過數據庫連接池進行獲取數據庫連接對象
        數據庫連接池的優點:
            避免了數據庫的頻繁的打開和關閉
        數據庫連接池的使用:
            導入jar包
            創建並配置數據庫連接池的配置文件
            使用數據庫連接池獲取數據庫連接對象
                第一種方式:
                    使用工具類進行數據庫連接池的創建和使用,注意:連接池是在第一次訪問的時候被創建的。
                第二種方式:
                     服務器啓動數據庫連接池即創建完畢
                    配置web.xml
                    獲取數據庫連接池conn對象即可

基於SqlSession對象的數據庫操作:

mybatis完成單表無參數查詢  
    mybatis完成單表單參數的增刪改查   
        單參數:
            指的是原生的JDBC數據操作方法的參數爲一個參數,不是SQL語句的參數爲一個參數
        原因:
            因爲SqlSession對象封裝增刪改查方法只接受一個數據庫操作相關的實參。
        mapper配置文件中的標籤屬性:
            parameterType:聲明的單參數的實參類型
        查詢:
            參數爲基本類型
                佔位符使用#{0}
            <!--參數爲基本變量類型  -->
                <select id="selById" parameterType="string"  resultType="flower">
                    select * from flower where name=#{0}
                </select>

                //單表單參數查詢---參數爲基本類型
                    Flower f=ss.selectOne("com.bjsxt.mapper.FlowerMapper.selById","百日草");
                    System.out.println(f);

            參數爲引用類型
                佔位符使用#{鍵名}
                <!--參數爲引用類型  map集合 佔位符中書寫鍵名 -->
            <select id="selByObj" parameterType="map" resultType="flower">
                select * from flower where production like #{production} and price> #{price}
            </select>

            Map<String,String> map=new HashMap<String,String>();
            map.put("production", "%商%");
            map.put("price", "3.5");
            List<Flower> lf2=ss.selectList("com.bjsxt.mapper.FlowerMapper.selByObj", map);
            System.out.println(lf2);


        <!--參數爲引用類型 實體類對象 佔位符中書寫屬性名 -->
            <select id="selByPojo" parameterType="flower" resultType="flower">
                select * from flower where production=#{production}
            </select>
            Flower f2=new Flower(0, "", 4.3, "巴西");
            Flower f3=ss.selectOne("com.bjsxt.mapper.FlowerMapper.selByPojo", f2);
            System.out.println(f3);

            查詢方法使用
                selectOne(String sqlPath,Object obj)
                selectList(String sqlPath,Object obj)
        注意:
            增加刪除修改需要手動進行數據的提交:
                ss.commit();//提交數據
        增加:
            <!--添加數據  -->
            <insert id="insF" parameterType="flower">
                insert into flower values(default,#{name},#{price},#{production});
            </insert>
        //添加
            Flower fs=new Flower(0,"花",5.55,"商丘");
            int i=ss.insert("com.bjsxt.mapper.FlowerMapper.insF",fs );      
            System.out.println(i);
        修改:
            <!--修改數據  -->
            <update id="upF" parameterType="map">
                update flower set name=#{name} where id=#{id}
            </update>
        Map<String,String> map2=new HashMap<String,String>();   
            map2.put("name", "花樣少年");
            map2.put("id", "8");
            int i2=ss.update("com.bjsxt.mapper.FlowerMapper.upF", map2);
            System.out.println(i2);
        刪除:
            <!--刪除數據  -->
            <delete id="delF" parameterType="string">
                delete from flower where name like #{0}
            </delete>

        int i3=ss.delete("com.bjsxt.mapper.FlowerMapper.delF", "花%");
        System.out.println(i3);

        注意:
            在mybatis中使用#{0}或者#{鍵名}進行sql語句的參數佔位,底層調用的是preparedStatement對象完成的數據庫操作。
            ${}在mybatis中代表的是Statement對象,底層SQL語句使用的是字符串拼接方式.

其他知識點:

ORM:對象關係映射(英語:(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不同類型系統的數據之間的轉換[1]  。從效果上說,它其實是創建了一個可在編程語言裏使用的--“虛擬對象數據庫”。
Mybatis是半自動化的ORM框架
注意:xml的參數的配置順序問題:
(properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, 
 objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers?)

log4J的配置文件:
在myeclipse或者myeclipse的文件裏搜索log4j.  即可找到,然後複製到項目中src文件夾下修改參數即可。
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO
#log4j.rootCategory=INFO, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.com.bjsxt.mapper=debug, CONSOLE      //設置要打印日誌的位置

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=C:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m%n

數據庫連接池:
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的數據庫連接來避免因爲沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。

單例模式:單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例

記住設置transactionManager  爲JDBC時,是指使用原生的JDBC,提交事務是手動的,所以在增刪改的時候要用sqlSession對象手動提交事務。


註解和sevlet3.0https://blog.csdn.net/estelle_belle/article/details/51751828
10 /**
11  * 註解WebServlet用來描述一個Servlet
12  * 屬性name描述Servlet的名字,可選
13  * 屬性urlPatterns定義訪問的URL,或者使用屬性value定義訪問的URL.(定義訪問的URL是必選屬性)
14  */
15 @WebServlet(name="Servlet3Demo",urlPatterns="/Servlet3Demo")

parameterType的類型爲別名
mybatis的內置別名:
這是一些爲常見的 Java 類型內建的相應的類型別名。它們都是大小寫不敏感的,需要注意的是由基本類型名稱重複導致的特殊處理。
別名  映射的類型
_byte   byte
_long   long
_short  short
_int    int
_integer    int
_double     double
_float  float
_boolean    boolean
string  String
byte    Byte
long    Long
short   Short
int     Integer
integer     Integer
double  Double
float   Float
boolean     Boolean
date    Date
decimal     BigDecimal
bigdecimal  BigDecimal
object  Object
map     Map
hashmap     HashMap
list    List
arraylist   ArrayList
collection  Collection
iterator    Iterator 

小案例:

需求:

實現:簡單的轉賬功能

這裏寫圖片描述
這裏寫圖片描述

思路分析:

Mybatis第三天:
    作業處理:
        需求:實現銀行轉賬功能
        需求分析:
            功能分析:
                銀行轉賬:
                         -------------------------------------------------------------------------(前端頁面--VIEW層)
                    點擊轉賬,將轉賬信息發送給對應的Servlet(前端頁面--VIEW層)
                    數據:
                        轉賬賬戶
                        密碼
                        金額
                        收款賬號
                        收款人姓名
                        操作符
                    提交方式:
                        使用form表單
                -------------------------------------------------------------------(Servlet層---Controller層)
                tomcat服務器接受到請求,調用指定的servlet進行處理
                設置請求編碼格式
                設置響應編碼格式
                獲取請求信息
                處理請求信息
                    調用業務層對象
                    將轉賬信息流轉給業務層進行處理 
                    返回處理結果
                響應處理結果
                    重定向
                        根據業務層處理的結果進行頁面響應
                    ----------------------------------------------------------------------業務層
                     根據轉賬賬戶和密碼校驗賬戶信息
                        正確:校驗轉賬賬戶的餘額
                            正確:校驗收款人賬號的姓名
                                正確:開始轉賬
                                    轉賬成功
                                        提交數據
                                    轉賬失敗
                                        回滾數據
                                不正確:直接返回
                            不正確:直接返回
                      不正確:直接返回
                    ----------------------------------------------------------------------mapper層
                        根據賬號和密碼查詢賬戶信息
                        根據賬號和姓名查詢賬戶信息
                        轉賬語句
                轉賬日誌記錄:
                    在業務層中,當轉賬成功時,執行一個插入語句即可
                    數據:
                        轉賬賬號
                        入賬賬號
                        金額
            數據庫設計:
                賬戶信息表:
                    賬戶ID
                    賬戶姓名
                    賬戶密碼
                    金額
                日誌記錄表
                    轉賬ID            
                    入賬ID                
                    轉賬金額
            代碼設計:
                 使用myBatis技術進行實現(Servlet+jsp+mybatis)
                 搭建mybatis運行環境          
    搭建mybatis運行環境
        導入jar包
        配置mybatis.xml
        配置mapper.xml
        基於sqlsession的單表增刪改查


mybatis框架構建:
這裏寫圖片描述

編碼過程中需要導入mybatis相關的Jar包,何Gson的jar包,數據庫使用MySQL,表中字段在實體類裏。
com.bjsxt.mapper:
AccountMapper.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.bjsxt.mapper.AccountMapper">
    <!-- 根據賬號和密碼查詢賬戶信息 -->
    <select id="selAcOut" parameterType="account" resultType="account">
        select * from account where aid=#{aid} and apwd=#{apwd}
    </select>
    <!--根據賬號和用戶名查詢賬戶信息  -->
    <select id="selAcIn" parameterType="account" resultType="account">
        select  * from account where aid=#{aid} and aname=#{aname}
    </select>
    <!--轉賬  -->
    <update id="upMoney" parameterType="account">
        update account set money=money+#{money} where aid=#{aid}
    </update>
 </mapper>

LogMapper.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.bjsxt.mapper.LogMapper">
    <!--插入轉賬日誌  -->
    <insert id="insLog" parameterType="map">
        insert into Log values(#{outid},#{inid},#{money})
    </insert>
    <!--查詢日誌信息  -->
    <select id="selLog" parameterType="pageInfo" resultType="log">
        select * from log limit #{pageStart},#{pageSize}
    </select>
  </mapper>

com.bjsxt.pojo:
Account.java:

package com.bjsxt.pojo;

public class Account {
    private int aid;
    private String aname;
    private String apwd;
    private double money;
    public int getAid() {
        return aid;
    }
    public void setAid(int aid) {
        this.aid = aid;
    }
    public String getAname() {
        return aname;
    }
    public void setAname(String aname) {
        this.aname = aname;
    }
    public String getApwd() {
        return apwd;
    }
    public void setApwd(String apwd) {
        this.apwd = apwd;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    @Override
    public String toString() {
        return "Account [aid=" + aid + ", aname=" + aname + ", apwd=" + apwd + ", money=" + money + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + aid;
        result = prime * result + ((aname == null) ? 0 : aname.hashCode());
        result = prime * result + ((apwd == null) ? 0 : apwd.hashCode());
        long temp;
        temp = Double.doubleToLongBits(money);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Account other = (Account) obj;
        if (aid != other.aid)
            return false;
        if (aname == null) {
            if (other.aname != null)
                return false;
        } else if (!aname.equals(other.aname))
            return false;
        if (apwd == null) {
            if (other.apwd != null)
                return false;
        } else if (!apwd.equals(other.apwd))
            return false;
        if (Double.doubleToLongBits(money) != Double.doubleToLongBits(other.money))
            return false;
        return true;
    }
    public Account() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Account(int aid, String aname, String apwd, double money) {
        super();
        this.aid = aid;
        this.aname = aname;
        this.apwd = apwd;
        this.money = money;
    }




}

Log.java:

package com.bjsxt.pojo;

public class Log {
    private int outid;
    private int inid;
    private double money;
    public int getOutid() {
        return outid;
    }
    public void setOutid(int outid) {
        this.outid = outid;
    }
    public int getInid() {
        return inid;
    }
    public void setInid(int inid) {
        this.inid = inid;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    @Override
    public String toString() {
        return "Log [outid=" + outid + ", inid=" + inid + ", money=" + money + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + inid;
        long temp;
        temp = Double.doubleToLongBits(money);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        result = prime * result + outid;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Log other = (Log) obj;
        if (inid != other.inid)
            return false;
        if (Double.doubleToLongBits(money) != Double.doubleToLongBits(other.money))
            return false;
        if (outid != other.outid)
            return false;
        return true;
    }
    public Log() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Log(int outid, int inid, double money) {
        super();
        this.outid = outid;
        this.inid = inid;
        this.money = money;
    }



}

PageInfo.java:

package com.bjsxt.pojo;

import java.util.List;

public class PageInfo {
    private int pageNum;
    private int pageStart;
    private int pageSize;
    private List<Log> ll;
    public int getPageNum() {
        return pageNum;
    }
    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }
    public int getPageStart() {
        return pageStart;
    }
    public void setPageStart(int pageStart) {
        this.pageStart = pageStart;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public List<Log> getLl() {
        return ll;
    }
    public void setLl(List<Log> ll) {
        this.ll = ll;
    }
    @Override
    public String toString() {
        return "PageInfo [pageNum=" + pageNum + ", pageStart=" + pageStart + ", pageSize=" + pageSize + ", ll=" + ll
                + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((ll == null) ? 0 : ll.hashCode());
        result = prime * result + pageNum;
        result = prime * result + pageSize;
        result = prime * result + pageStart;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PageInfo other = (PageInfo) obj;
        if (ll == null) {
            if (other.ll != null)
                return false;
        } else if (!ll.equals(other.ll))
            return false;
        if (pageNum != other.pageNum)
            return false;
        if (pageSize != other.pageSize)
            return false;
        if (pageStart != other.pageStart)
            return false;
        return true;
    }
    public PageInfo() {
        super();
        // TODO Auto-generated constructor stub
    }
    public PageInfo(int pageNum, int pageStart, int pageSize, List<Log> ll) {
        super();
        this.pageNum = pageNum;
        this.pageStart = pageStart;
        this.pageSize = pageSize;
        this.ll = ll;
    }



}

com.bjsxt.service:
AccountService.java:

package com.bjsxt.service;

import java.io.IOException;

import com.bjsxt.pojo.Account;

public interface AccountService {

    /**
     * 轉賬賬戶ID和密碼不匹配
     */
    int ACCOUNT_OUT_ID_PWD_NOTMACTH=1;
    /**
     * 賬戶餘額不足
     */
    int ACCOUNT_OUT_MONEY_NOT_ENOUGH=3;
    /**
     * 入賬賬戶ID和用戶名不匹配
     */
    int ACCOUNT_IN_ID_NAME_NOTMATCH=4;
    /**
     * 轉賬成功
     */
    int ACCOUNT_SUCCESS=2;
    /**
     * 轉賬失敗
     */
    int ACCOUNT_FAILED=-1;
    /**
     * 實現銀行轉賬功能
     * @param acout
     * @param acin
     * @return
     */
    int transferAccount(Account acout,Account acin)throws IOException;
}

LogService.java:

package com.bjsxt.service;

import java.io.IOException;

import com.bjsxt.pojo.PageInfo;

public interface LogService {

    PageInfo getLogInfoService(int pageNum,int pageSize)throws IOException;
}

com.bjsxt.serviceImpl:
AccountServiceImpl.java:

package com.bjsxt.serviceImpl;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

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 org.apache.log4j.Logger;

import com.bjsxt.pojo.Account;
import com.bjsxt.service.AccountService;

public class AccountServiceImpl implements AccountService{
    //聲明Logger日誌對象
    private Logger logger=Logger.getLogger(AccountServiceImpl.class);
    //銀行轉賬
    @Override
    public int transferAccount(Account acout, Account acin) throws IOException {
        //獲取SqlSession對象
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            SqlSession ss=factory.openSession();
        //校驗轉賬賬戶信息
            Account acout2=ss.selectOne("com.bjsxt.mapper.AccountMapper.selAcOut",acout);
            if(acout2!=null){
                //校驗金額
                    if(acout.getMoney()<=acout2.getMoney()){
                        //校驗入賬賬戶信息
                            Account acin2=ss.selectOne("com.bjsxt.mapper.AccountMapper.selAcIn",acin);
                            if(acin2!=null){
                                //開始轉賬
                                    //轉賬賬戶轉出
                                        acout.setMoney(-acout.getMoney());
                                        int i=ss.update("com.bjsxt.mapper.AccountMapper.upMoney", acout);
                                    //入賬賬戶轉入
                                        i+=ss.update("com.bjsxt.mapper.AccountMapper.upMoney", acin);
                                    //校驗
                                        if(i==2){
                                            //將轉賬日誌插入到數據庫中
                                            Map<String,Object> map=new HashMap<String,Object>();
                                            map.put("outid", acout.getAid());
                                            map.put("inid", acin.getAid());
                                            map.put("money", acin.getMoney());
                                            ss.insert("com.bjsxt.mapper.LogMapper.insLog", map);
                                            //提交
                                            ss.commit();
                                            //打印log日誌
                                            logger.debug(acout.getAid()+"在"+new Date().toLocaleString()+"給"+acin.getAid()+"轉了"+acin.getMoney()+"元錢");
                                            return ACCOUNT_SUCCESS;
                                        }else{
                                            ss.rollback();
                                            return ACCOUNT_FAILED;
                                        }
                            }else{
                                return ACCOUNT_IN_ID_NAME_NOTMATCH; 
                            }

                    }else{
                        return ACCOUNT_OUT_MONEY_NOT_ENOUGH;
                    }

            }else{
                return ACCOUNT_OUT_ID_PWD_NOTMACTH;
            }
    }

}

LogServiceImpl.java:

package com.bjsxt.serviceImpl;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.bjsxt.pojo.Log;
import com.bjsxt.pojo.PageInfo;
import com.bjsxt.service.LogService;

public class LogServiceImpl implements LogService{

    @Override
    public PageInfo getLogInfoService(int pageNum, int pageSize) throws IOException {
        //創建SqlSession對象
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            SqlSession ss=factory.openSession();
        //創建pageStart
        int pageStart=pageNum*pageSize-pageSize;
        //將數據存儲到PageInfo中
        PageInfo p=new PageInfo();
        p.setPageStart(pageStart);
        p.setPageNum(pageNum);
        p.setPageSize(pageSize);
        List<Log> ll=ss.selectList("com.bjsxt.mapper.LogMapper.selLog",p);
        p.setLl(ll);
        return p;
    }

}

com.bjsxt.servlet:
AccountServlet.java:

package com.bjsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjsxt.pojo.Account;
import com.bjsxt.service.AccountService;
import com.bjsxt.serviceImpl.AccountServiceImpl;

/**
 * Servlet implementation class AccountServlet
 */
@WebServlet("/as")
public class AccountServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設置請求編碼格式
        req.setCharacterEncoding("utf-8");
        //設置響應編碼格式
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //獲取請求信息
            int  outid=Integer.parseInt(req.getParameter("outid"));
            String outpwd=req.getParameter("outpwd");
            double money=Double.parseDouble(req.getParameter("money"));
            int inid=Integer.parseInt(req.getParameter("inid"));
            String inname=req.getParameter("inname");
        //處理請求信息
            //將請求數據存儲到實體類對象中
            Account acout=new Account();
                acout.setAid(outid);
                acout.setApwd(outpwd);
                acout.setMoney(money);
            Account acin=new Account();
                acin.setAid(inid);
                acin.setAname(inname);
                acin.setMoney(money);
            //調用業務層實現轉賬
                AccountService as=new AccountServiceImpl();
                int i=as.transferAccount(acout, acin);
                //創建Session
                req.getSession().setAttribute("i", i);
                if(i==as.ACCOUNT_SUCCESS){
                    //響應處理結果
                        //使用重定向
                        resp.sendRedirect("log.jsp");
                }else{  
                    //使用重定向
                    resp.sendRedirect("error.jsp");
                }

    }

}

LogServlet.java:

package com.bjsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjsxt.pojo.PageInfo;
import com.bjsxt.service.LogService;
import com.bjsxt.serviceImpl.LogServiceImpl;
import com.google.gson.Gson;

/**
 * Servlet implementation class LogServlet
 */
@WebServlet("/log")
public class LogServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設置請求編碼格式
        req.setCharacterEncoding("utf-8");
        //設置響應編碼格式
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //獲取請求信息
        int pageNum=req.getParameter("pageNum")!=null?Integer.parseInt(req.getParameter("pageNum")):1;
        int pageSize=req.getParameter("pageSize")!=null?Integer.parseInt(req.getParameter("pageSize")):2;
        //處理請求信息
        LogService ls=new LogServiceImpl();
        PageInfo p=ls.getLogInfoService(pageNum, pageSize);
        //響應處理結果
        resp.getWriter().write(new Gson().toJson(p));
    }

}

log4j.properties:


log4j.rootCategory=info



log4j.logger.com.bjsxt.mapper=debug, CONSOLE
log4j.logger.com.bjsxt.serviceImpl=debug, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %c-%d-%m%n


log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %c-%d-%m%n

mybatis.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>
    <!-- 開啓別名支持 -->
    <typeAliases>
        <package name="com.bjsxt.pojo"/>
    </typeAliases>
    <!--創建數據庫環境  -->
    <environments default="mysql">
        <!--配置數據庫環境  -->
        <environment id="mysql">
            <!--配置事務  -->
                <transactionManager type="JDBC"></transactionManager>
            <!--配置數據源  -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="1234"/>
                </dataSource>
        </environment>
    </environments> 
    <!-- 配置mapper -->
        <mappers>
            <mapper resource="com/bjsxt/mapper/AccountMapper.xml"/>
            <mapper resource="com/bjsxt/mapper/LogMapper.xml"/>
        </mappers>
  </configuration>

transfer.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <form action="as" method="post">
        轉賬賬戶ID:<input type="text" name="outid" value=""/><br />
        密碼:<input type="password" name="outpwd" value="" /><br />
        金額:<input type="text" name="money" value=""/><br />
        入賬賬戶ID:<input type="text" name="inid" value=""/><br />
        姓名:<input type="text" name="inname" value=""/><br />
        <input type="submit" value="提交" /><br />
    </form>
</body>
</html>

log.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<!--引入jQuery文件  -->
<script type="text/javascript" src="js/j.js"></script>
<!--聲明js代碼域  -->
<script type="text/javascript">
    $(function(){
        //聲明變量記錄當前頁碼數據
        var page;
        //上一頁功能
        $("#up").click(function(){
            getData(page-1,2);
        })
        //下一頁功能
        $("#down").click(function(){
            getData(page+1,2);
        })

        getData(1,2);
        function getData(pageNum,pageSize){
            $.get("log",{pageNum:pageNum,pageSize:pageSize},function(data){
                //使用eval轉換
                eval("var p="+data);
                page=p.pageNum;
                //獲取表格對象
                var ta=$("#ta");
                //清空原有內容
                ta.empty();
                //增加表頭
                ta.append("<tr>"+
                        "<td>轉賬賬戶</td>"+
                        "<td>入賬賬戶</td>"+
                        "<td>金額</td>"+
                        "</tr>");
                //遍歷數據填充到表格
                for(var i=0;i<p.ll.length;i++){
                    ta.append("<tr>"+
                            "<td>"+p.ll[i].outid+"</td>"+
                            "<td>"+p.ll[i].inid+"</td>"+
                            "<td>"+p.ll[i].money+"</td>"+
                            "</tr>");
                }

            })
        }
    })


</script>
</head>
<body>
    <table id="ta">

    </table>
    <a id="up" href="javascript:void(0)">上一頁</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a id="down" href="javascript:void(0)">下一頁</a>
</body>
</html>

error.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    轉賬失敗,錯誤代碼爲:${i}
</body>
</html>

導入js1.9版本

源碼地址:
鏈接:https://pan.baidu.com/s/1M_PMsShIv2EmsnkKUX18Gg 密碼:bsm8

小結

mybatis配置文件的進一步補充
數據庫連接池的概念
單例模式
基於SqlSession對象的簡單操作(增刪改查)
小案例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章