主頁 > 軟體設計 > 如何優雅設計mybtis工具類及實作分頁查詢,動態SQL&mybatis+struts組合使用

如何優雅設計mybtis工具類及實作分頁查詢,動態SQL&mybatis+struts組合使用

2021-10-14 10:43:15 軟體設計

MyBatis工具類&mybatis+struts2整合

前提:主要內容

讀者
本教程是為需要詳細了解 MyBatis 框架及其架構和實際應用的 Java 程式員準備的,
教程中通俗易懂的講解了 MyBatis 開發程序中涉及的各種知識,并且為每個知識點都提供了實體,以幫助讀者快速入門學習,

  1. Mybatis工具類

  2. 動態sql陳述句(if/foreach)

  3. mybatis實作分頁

  4. ResultSet結果集

  5. mybatis+struts2+mybatis+jsp整合

  6. 解決Mybatis報錯問題

MyBatis 簡介

MyBatis 是一個開源、輕量級的資料持久化框架,是 JDBC 和 Hibernate 的替代方案,
MyBatis 前身為 IBatis,2002 年由 Clinton Begin 發布,2010 年從 Apache 遷移到 Google,并改名為 MyBatis,2013 年又遷移到了 Github,
MyBatis 內部封裝了 JDBC,簡化了加載驅動、創建連接、創建 statement 等繁雜的程序,開發者只需要關注 SQL 陳述句本身,
MyBatis 支持定制化 SQL、存盤程序以及高級映射,可以在物體類和 SQL 陳述句之間建立映射關系,是一種半自動化的 ORM 實作,
MyBatis、Hibernate 和 JDBC
和 Hibernate 相比,MyBatis 封裝性低于 Hibernate,但性能優秀、小巧、簡單易學、應用廣泛,
和 JDBC 相比,MyBatis 減少了 50% 以上的代碼量,并且滿足高并發和高回應的要求,

一、MyBatisUtil工具類的封裝

  • 快捷鍵:castvar:強轉快捷鍵

借鑒jdbcUtil工具類的封裝,
1.冗余問題

封裝:
1、獲取鏈接
class xxx{
//工具方法 獲取sqlSession物件
   public static SqlSession openSession(){
      InputStream is=Resources.getResourceAsStream("mybatis-confug.xml");
      SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
       SqlSession sqlSession=factory.onenSession();
   }
}
2、關閉資源
  • MybatisUtil工具類
package com.tjcu.utils;

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;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 20:53
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class MybatisUtil {
    private static final ThreadLocal<SqlSession> t=new ThreadLocal<>();
    private static  SqlSessionFactory factory;
    /**
     * 靜態代碼塊只加載一次
     */
    static{
        //1.Resources加載Mybatis核心組態檔[只加載一次]
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis-config.xml");
            //2.sqlSessionFactoryBuilder
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
    public static SqlSession openSession() throws IOException {
       SqlSession sqlSession=t.get();
        //工廠開啟sqlSession
        if(sqlSession==null){
            sqlSession = factory.openSession();
            t.set(sqlSession);
        }
        return sqlSession;
    }

    public static void close(SqlSession sqlSession){
        if(sqlSession!=null){
            sqlSession.close();
            t.remove();
        }
    }

}


  • 測驗方法
    @Test
    public void selectLikeUsername() throws IOException {
        SqlSession sqlSession = MybatisUtil.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        String str="恒";
        List<User> users = mapper.selectUserLikeUsername("%" +str + "%");
        for (User user : users) {
            System.out.println(user);
        }
        MybatisUtil.close(sqlSession);
    }
  • mapper.xml
  <select id="selectUserLikeUsername" resultType="user">
        select * from t_user where username like #{username}
    </select>

2、MybatisUtil工具類升級版

package com.tjcu.utils;

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;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/12 9:52
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class MybatisUtil {
    /**
     * 執行緒系結物件,保證是同一個物件
     */
    private static final ThreadLocal<SqlSession> t1 = new ThreadLocal<>();
    private static SqlSessionFactory factory;

    static {
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        factory = new SqlSessionFactoryBuilder().build(is);
    }

    /**
     * 創建SqlSession
     * @return sqlSession
     */
    public static SqlSession openSession() {
        SqlSession sqlSession = t1.get();
        if (sqlSession == null) {
            sqlSession = factory.openSession();
            t1.set(sqlSession);
        }
        return sqlSession;
    }

    /**
     * 呼叫功能方法
     * @param clazz
     * @return Object
     */
    public static Object getMapper(Class clazz) {
        return openSession().getMapper(clazz);
    }

    /**
     * 提交事務,關閉資源
     */
    public static void commit(){
        //1、提交事務
        openSession().commit();
        //2、關閉資源
        openSession().close();
        t1.remove();
    }

    /**
     * 關閉資源
     */
    public static void close(){
        if(openSession()!=null){
            openSession().close();
        }
        t1.remove();
    }

}

二、介面代理方式實作Dao

1、代理開發方式介紹

采用 Mybatis 的代理開發方式實作 DAO 層的開發,這種方式是我們后面進入企業的主流,

Mapper 介面開發方法只需要程式員撰寫Mapper 介面(相當于Dao 介面),由Mybatis 框架根據介面定義

創建介面的動態代理物件,代理物件的方法體同上邊Dao介面實作類方法,

  • Mapper 介面開發需要遵循以下規范
1) Mapper.xml檔案中的namespace與mapper介面的全限定名相同

2) Mapper介面方法名和Mapper.xml中定義的每個statement的id相同

3) Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql的parameterType的型別相同

4) Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同

總結:

介面開發的方式: 程式員只需定義介面,就可以對資料庫進行操作,那么具體的物件怎么創建?

1.程式員負責定義介面

2.在操作資料庫,mybatis框架根據介面,通過動態代理的方式生成代理物件,負責資料庫的crud操作

2、原始碼分析

  • 分析動態代理物件如何生成的?
通過動態代理開發模式,我們只撰寫一個介面,不寫實作類,
我們通過 getMapper() 方法最侄訓取到 org.apache.ibatis.binding.MapperProxy 代理物件,
然后執行功能,而這個代理物件正是 MyBatis 使用了 JDK 的動態代理技術,
幫助我們生成了代理實作類物件,從而可以進行相關持久化操作, 
  • 分析方法是如何執行的?
動態代理實作類物件在執行方法的時候最終呼叫了 mapperMethod.execute() 方法,
這個方法中通過 switch 陳述句根據操作型別來判斷是新增、修改、洗掉、查詢操作,
最后一步回到了 MyBatis 最原生的 SqlSession 方式來執行增刪改查,  

3、知識小結

介面代理方式可以讓我們只撰寫介面即可,而實作類物件由 MyBatis 生成,

實作規則 :

  1. 映射組態檔中的名稱空間必須和 Dao 層介面的全類名相同,

  2. 映射組態檔中的增刪改查標簽的 id 屬性必須和 Dao 層介面的方法名相同,

  3. 映射組態檔中的增刪改查標簽的 parameterType 屬性必須和 Dao 層介面方法的引數相同,

  4. 映射組態檔中的增刪改查標簽的 resultType 屬性必須和 Dao 層介面方法的回傳值相同, ?

  5. 獲取動態代理物件 SqlSession 功能類中的 getMapper() 方法,

三、動態sql陳述句

1、動態sql陳述句概述

  Mybatis 的映射檔案中,前面我們的 SQL 都是比較簡單的,有些時候業務邏輯復雜時,我們的 SQL是動態變化的,此時在前面的學習中我們的 SQL 就不能滿足要求了,

2、動態 SQL 之<if>

我們根據物體類的不同取值,使用不同的 SQL陳述句來進行查詢,比如在 id如果不為空時可以根據id查詢,如果username 不同空時還要加入用戶名作為條件,這種情況在我們的多條件組合查詢中經常會碰到,

如下圖:

  • UserDao介面
 /**
     * 多條件查詢 condition:情況
     * @param user
     * @return User
     */
    public List<User> selectCondition(User user);
  • UserDaoImpl.xml
   <!-- 多條件查詢-->
    <select id="selectCondition" resultType="user" parameterType="user">
        select * from t_user
        <where>
            <if test="id!=0">and id=#{id}</if>
            <if test="username!=null">and username=#{username}</if>
        </where>
    </select>
  • 1.當查詢條件id和username都存在時,控制臺列印的sql陳述句如下:
  public void selectByCondition() throws IOException {
        SqlSession sqlSession = MybatisUtil.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setId(1);
        user.setUsername("王恒杰");
        List<User> users = mapper.selectCondition(user);
        for (User user1 : users) {
            System.out.println(user1);
        }
        MybatisUtil.close(sqlSession);
    }

在這里插入圖片描述

  • 當查詢條件只有id存在時,控制臺列印的sql陳述句如下:
    @Test
    public void selectByCondition() throws IOException {
        SqlSession sqlSession = MybatisUtil.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setId(1);
        user.setUsername("楊福君");
        List<User> users = mapper.selectCondition(user);
        for (User user1 : users) {
            System.out.println(user1);
        }
        MybatisUtil.close(sqlSession);
    }
}

總結語法:

<where>:條件標簽,如果有動態條件,則使用該標簽代替 where 關鍵字,
<if>:條件判斷標簽,
<if test=“條件判斷”>
  查詢條件拼接
</if>

3、動態 SQL 之<foreach>

回圈執行sql的拼接操作,例如:SELECT * FROM student WHERE id IN (1,3,4),

  • UserDao

    /**
     * foreach查詢多個id
     * @param id
     * @return  List<User>
     */
    public List<User> selectByIds(List<Integer> id);
  • UserDaoImpl.xml配置
 <!--
    foreach查詢多個id
      collection:引數容器型別, (list-集合, array-陣列),
      open:開始的 SQL 陳述句,
      close:結束的 SQL 陳述句,
      item:引數變數名,
      separator:分隔符,
    -->
    <select id="selectByIds" resultType="user">
        select * from t_user
        <where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
  • 測驗類
 @Test
    public void selectByIts() throws IOException {
        SqlSession sqlSession = MybatisUtil.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(4);
        List<User> users = mapper.selectByIds(list);
        for (User user : users) {
            System.out.println(user);
        }
        MybatisUtil.close(sqlSession);
    }

總結語法:

<foreach>:回圈遍歷標簽,適用于多個引數或者的關系,
    <foreach collection=“”open=“”close=“”item=“”separator=“”>
    獲取引數
  </foreach>

屬性
collection:引數容器型別, (list-集合, array-陣列),
open:開始的 SQL 陳述句,
close:結束的 SQL 陳述句,
item:引數變數名,
separator:分隔符,

4、 include 實作SQL片段抽取

Sql 中可將重復的 sql 提取出來,使用時用 include 參考即可,最終達到 sql 重用的目的

<!--抽取sql片段簡化撰寫-->
<sql id="selectStudent"> select * from student</sql>

<select id="findById" parameterType="int" resultType="student">
    <include refid="selectStudent"></include> 
    where id=#{id}
</select>

<select id="findByIds" parameterType="list" resultType="student">
    
    <include refid="selectStudent"></include>
    
    <where>
        <foreach collection="array" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>

總結語法:

我們可以將一些重復性的 SQL 陳述句進行抽取,以達到復用的效果,

<sql>:抽取 SQL 陳述句標簽, 
<include>:引入 SQL 片段標簽, 
<sql id=“片段唯一標識”>抽取的 SQL 陳述句</sql> <include refid=“片段唯一標識”/>

5、知識小結

MyBatis映射檔案配置:

<select>:查詢

<insert>:插入

<update>:修改

<delete>:洗掉

<where>:where條件

<if>:if判斷

<foreach>:回圈

<sql>:sql片段抽取

四、分頁插件

1、分頁插件介紹

  • 分頁可以將很多條結果進行分頁顯示,

  • 如果當前在第一頁,則沒有上一頁,如果當前在最后一頁,則沒有下一頁,

  • 需要明確當前是第幾頁,這一頁中顯示多少條結果,

  • MyBatis分頁插件總結

  1. 在企業級開發中,分頁也是一種常見的技術,而目前使用的 MyBatis 是不帶分頁功能的,如果想實作分頁的 功能,需要我們手動撰寫 LIMIT 陳述句,但是不同的資料庫實作分頁的 SQL 陳述句也是不同的,所以手寫分頁 成本較高,這個時候就可以借助分頁插件來幫助我們實作分頁功能,

  2. PageHelper:第三方分頁助手,將復雜的分頁操作進行封裝,從而讓分頁功能變得非常簡單,

2、分頁插件的使用

MyBatis可以使用第三方的插件來對功能進行擴展,分頁助手PageHelper是將分頁的復雜操作進行封裝,使用簡單的方式即可獲得分頁的相關資料

  • 開發步驟:

①匯入與PageHelper的jar包

在這里插入圖片描述

jsqlparser-3.1.jar

pagehelper-5.1.10.jar

②在mybatis核心組態檔中配置PageHelper插件

  <!--
    注意:分頁助手的插件 配置在通用Mapper之前
    interceptor:攔截器
     -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
           <!-- 指定方言 dialect:方言 -->
         <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>

在這里插入圖片描述

③測驗分頁資料獲取


public void  testPageHelper() throws IOException {
        SqlSession sqlSession = MybatisUtil.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        //通過分頁助手來實作分頁功能
        // 第一頁:顯示3條資料
        //PageHelper.startPage(1,3);
        // 第二頁:顯示3條資料
        //PageHelper.startPage(2,3);

        // 第三頁:顯示3條資料
        PageHelper.startPage(1,2);
        //呼叫實作類的方法,接收結果
        List<User> users = mapper.selectUserAll();
        // 處理結果
        for (User user : users) {
            System.out.println(user);
        }
        //獲取分頁相關引數
     PageInfo<User> info = new PageInfo<>(users);
     System.out.println("總條數"+info.getTotal());
     System.out.println("總頁數"+info.getPages());
     System.out.println("當前頁面"+info.getPageNum());
     System.out.println("每頁顯示條數"+info.getPageSize());
     System.out.println("上一頁"+info.getPrePage());
     System.out.println("下一頁"+info.getNextPage());
     System.out.println("是否是第一頁"+info.isIsFirstPage());
     System.out.println("是否是最后一頁"+info.isIsLastPage());
     MybatisUtil.close(sqlSession);
 }
}

3、分頁插件的引數獲取

//其他分頁的資料
PageInfo<User> pageInfo = new PageInfo<User>(select);
System.out.println("總條數:"+pageInfo.getTotal());
System.out.println("總頁數:"+pageInfo.getPages());
System.out.println("當前頁:"+pageInfo.getPageNum());
System.out.println("每頁顯示長度:"+pageInfo.getPageSize());
System.out.println("是否第一頁:"+pageInfo.isIsFirstPage());
System.out.println("是否最后一頁:"+pageInfo.isIsLastPage());

4、分頁插件知識小結

分頁:可以將很多條結果進行分頁顯示,

  • 分頁插件 jar 包: pagehelper-5.1.10.jar jsqlparser-3.1.jar

  • :集成插件標簽,

  • 分頁助手相關 API

????1. PageHelper:分頁助手功能類,

????2. startPage():設定分頁引數

????3. PageInfo:分頁相關引數功能類,

????4. getTotal():獲取總條數

????5. getPages():獲取總頁數

????6. getPageNum():獲取當前頁

????7. getPageSize():獲取每頁顯示條數

????8. getPrePage():獲取上一頁

????9. getNextPage():獲取下一頁

????10. isIsFirstPage():獲取是否是第一頁

????11. isIsLastPage():獲取是否是最后一頁

五、結果映射ResultMap

1、簡化開發步驟 mapper.xml
2、自動進行ORM映射 前提:表中欄位名和物體類中的屬性名一致
3、查詢優化 快取Cache

1、Mybatis自動封裝(ORM映射)

  • Mybatis自動ORM映射時,表中的欄位名和物體類名一致

2、手工實作封裝(ORM映射)mapResult

多表-->Mybatis不自動映射,可以匹配對應關系結果映射
作用:用于查詢結果和物體類不匹配時,完成列名和屬性名對應關系的映射

主鍵映射用id,其他用result

  • UserDaoImpl.xml實作手工映射(ORM映射)
<mapper namespace="com.tjcu.dao.UserDao">
    <!--結果映射 id:唯一標識 type:要映射的物體類名 全限定名,可以書寫別名-->
    <resultMap id="UserResultMap" type="user">
        <!--主鍵映射比較特殊 column:資料庫列 property:物體類屬性名-->
        <id column="id" property="id1"></id>
        <result column="username" property="username1"></result>
        <result column="password" property="password1"></result>
        <result column="age" property="age1"></result>
        <result column="birthday" property="birthday1"></result>
    </resultMap>
    <!--查詢所有 resultMap映射-->
    <select id="selectUserAll" resultMap="UserResultMap">
        select *
        from t_user;
    </select>
</mapper>


3、單表起別名實作ORM自動封裝【簡化操作】

單表操作簡化寫法,通過列名對應物體屬性名

  • 給資料庫中表的列名取別名

   </select>
    <!--查詢所有  單表簡化方式-->
    <select id="selectUserAll" resultType="user">
        select id as id1,
         username as username1, 
         password as password1, 
         age as age1,
         birthday as birthday1
        from t_user;
    </select>

五、mybatis+Struts2整合開發

1、分析框架的特點
2、根據框架特點完成整合
3、開發

1、編碼流程

1、建表
2、物體
3、dao介面【Mybatis框架】
4、service介面
5、service實作類
6、action【Struts2框架】
7、jsp

2、Struts2框架+Mybatis框架整合

1、搭建開發環境

1、搭建開發環境
a、引入jar包
   struts2 核心jar 三方依賴jar包 Servlet包 jstl jsp 驗證碼
   mybatis  核心jar包 三方依賴jar包 資料庫驅動jar包 Junit測驗jar包
   注意:
     (1)jar包存放WEB-INF的lib目錄中
     (2)jar包沖突 避免相同Jar包出現多次 選擇依據:就高不就低
 b、引入組態檔
    Struts2 核心組態檔 struts.xml 名字固定 位置固定:src下
    Mybatis: 核心組態檔 mybatis-config.xml 名字隨意 位置隨意 建議 src下
    日志相關組態檔 log4j.properties 名字隨意 位置隨意 建議 src下
    mapper檔案模型 xxxDaoImpl.Xml 名字隨意 建議:dao層
    資料庫鏈接引陣列態檔:jdbc.properties
c、初始化配置 讓框架生效
   Struts2 Web.xml中核心過濾器配置 攔截所有請求交由Struts2處理
   Mybatis 資料庫鏈接配置

  • mybatis+struts2整合開發jar包+環境配置:

gitee檔案夾名:mybatis+struts2整合開發jar包環境配置:

https://gitee.com/wanghengjie563135/mybatis_struts2.git

2、編程步驟

1、建表
2、創建物體類
3、物體類起別名
4、創建Dao介面
5、書寫Dao介面 書寫Dao介面對應的mapper檔案
6、注冊Mapper 在mybatis-config.xml配置完成mapper檔案路徑注冊
7、測驗 用Mybatis中的Dao介面實作
8、創建Service介面
9、實作Service介面 MybatisUtil工具類
10、測驗Service  測驗業務方法是否正確 創建業務實作物件呼叫業務方法查看結果
11、Action 接收資料 呼叫業務 跳轉頁面
     (1)寫類 服務方法
     (2)在struts.xml中進行配置
12、jsp展示資料 EL運算式+EL標簽庫

六、案例實戰(mybatis+struts2+jsp)

注:全部源代碼在githee倉庫:詳細源代碼見文章底部

(1)搭建開發環境

1、jar包

  • jar包Gitee位置:https://gitee.com/wanghengjie563135/mybatis_struts2.git

2、初始化配置

初始化配置Gitee位置:https://gitee.com/wanghengjie563135/mybatis_struts2.git

1、web.xml

  • struts2核心過濾器配置 攔截所有請求交由Struts2處理
  <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2、struts.xml

<struts>
  <package name="user" extends="struts-default" namespace="/user">
  <action name="queryAll" class="com.tjcu.action.UserAction">
    <result name="success">/queryAll.jsp</result>
  </action>
  </package>
</struts>

3、mybatis-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>
    <!--引入資料庫鏈接的組態檔jdbc.properties-->
    <properties resource="jdbc.properties"></properties>
    <!--起別名優化-->
    <typeAliases>
        <typeAlias type="com.tjcu.entity.User" alias="user"></typeAlias>
<!--        !給物體類所在的包下所有類起別名 name:書寫物體類所在的包 自動取別名 默認:類名或類首字母小寫 User/user-->
        <package name="com.tjcu.entity"/>
    </typeAliases>
    <!--
      注意:分頁助手的插件 配置在通用Mapper之前
      interceptor:攔截器
       -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED:OOMybatis框架默認連接池-->
            <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>
    </environments>
    <!--將mapper檔案路徑注冊到mybatis核心組態檔中-->
    <mappers>
        <mapper resource="com/tjcu/dao/UserDaoImpl.xml"></mapper>
    </mappers>

</configuration>

4、UserDaoImpl.xml

<mapper namespace="com.tjcu.dao.UserDao">
    <select id="selectUserAll" resultType="user">
        select * from t_user;
    </select>
</mapper>

5、jdbc.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username=root
password=root

6、log4j.properties

log4j.rootLogger=DEBUG, stdout

# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

(2)編程

1、建表

2、創建物體類

    private Integer id;
    private String username;
    private String password;
    private int age;
    private Date birthday;

3、物體類起別名

    <!--配置別名-->
<typeAliases>
     <typeAlias type="com.tjcu.entity.User" alias="user"></typeAlias>
 </typeAliases>

4、創建Dao介面

    /**
     * 查詢所有
     * @return用戶集合
     */
    public List<User> selectUserAll();

5、書寫Dao介面mapper.xml實作

<mapper namespace="com.tjcu.dao.UserDao">
    <select id="selectUserAll" resultType="user">
        select * from t_user;
    </select>
</mapper>

6、注冊Mapper mybatis-config.xml中實作

  <!--  配置mappers-->
    <mappers>
        <mapper resource="com/tjcu/dao/UserDaoImpl.xml"></mapper>
    </mappers>

7、創建Service介面

  /**
     *  查詢所有
     * @return
     */
    public List<User> queryAll();

8、實作Service介面

  @Override
    public List<User> queryAll() {
        //呼叫DAO
        UserDao mapper = (UserDao) MybatisUtil.getMapper(UserDao.class);
        List<User> users = mapper.selectUserAll();
        MybatisUtil.close();
        return  users;
    }

9、測驗Service

   @Test
    public void testSelectAll() throws IOException {
        UserDao userDAO = (UserDao) MybatisUtil.getMapper(UserDao.class);
        List<User> users = userDAO.selectUserAll();
        for (User user : users) {
            System.out.println(user);
        }
        MybatisUtil.close();
    }

10、Action 接收資料 呼叫業務 跳轉頁面

(1)寫類 服務方法

package com.tjcu.action;

import com.opensymphony.xwork2.Action;
import com.tjcu.entity.User;
import com.tjcu.service.UserServiceImpl;

import java.util.List;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/13 11:11
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class UserAction {
    //接收資料
    /**
     * 替換request作用域傳遞資料
     */
    private List<User> users;

    public String execute() throws Exception {
        //呼叫業務
        UserServiceImpl userService = new UserServiceImpl();
        users = userService.queryAll();

        //跳轉頁面
        return Action.SUCCESS;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}

(2)在struts.xml中進行配置

<struts>
  <package name="user" extends="struts-default" namespace="/user">
  <action name="queryAll" class="com.tjcu.action.UserAction">
    <result name="success">/queryAll.jsp</result>
  </action>
  </package>
</struts>

11、jsp展示資料 EL運算式+EL標簽庫

<%@page contentType="text/html; UTF-8" pageEncoding="utf-8" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<style>
    td,th {
        /*設定邊框*/
        border: 1px solid black;
    }
</style>
<body>
<center>
<table style=" border: 1px solid black;border-collapse: collapse;">
    <%--
       private Integer id;
        private String username;
        private String password;
        private int age;
        private Date birthday;
    --%>
    <tr>
        <td>ID</td>
        <td>NAME</td>
        <td>PASSWORD</td>
        <td>AGE</td>
        <td>BIRTHDAY</td>
        <td>洗掉</td>
        <td>修改</td>
    </tr>
    <c:forEach var="user" items="${requestScope.users}">
        <tr>
            <td>${user.id}</td>
            <td>${user.username}</td>
            <td>${user.password}</td>
            <td>${user.age}</td>
            <td><fmt:formatDate value="${user.birthday}" pattern="yyyy年MM月dd日"></fmt:formatDate></td>
            <td>洗掉</td>
            <td>修改</td>
        </tr>
    </c:forEach>
</table>
</center>
</body>
</html>

mybatis+struts2整合案例源代碼在githee倉庫:

程式員小王Gitee: https://gitee.com/wanghengjie563135/mybatis.git

七、解決Mybatis報錯問題

1:Type interface com.tjcu.dao.UserDao is not known to the MapperRegistry.

詳細可參考鏈接:https://www.wolai.com/wnaghengjie/ifdVAvtCZ7D47ukWqg22RP?theme=light

JavaWeb專案 jsp頁面無法加載樣式問題:

詳細可參考鏈接:

https://blog.csdn.net/weixin_44385486/article/details/120735230

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/312468.html

標籤:其他

上一篇:SocketError:無法打開到ruby??gmes.org:443的TCP連接

下一篇:無法在ubuntu上卸載numpy

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more