MyBatis工具類&mybatis+struts2整合
前提:主要內容
讀者
本教程是為需要詳細了解 MyBatis 框架及其架構和實際應用的 Java 程式員準備的,
教程中通俗易懂的講解了 MyBatis 開發程序中涉及的各種知識,并且為每個知識點都提供了實體,以幫助讀者快速入門學習,
-
Mybatis工具類
-
動態sql陳述句(if/foreach)
-
mybatis實作分頁
-
ResultSet結果集
-
mybatis+struts2+mybatis+jsp整合
-
解決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 生成,
實作規則 :
-
映射組態檔中的名稱空間必須和 Dao 層介面的全類名相同,
-
映射組態檔中的增刪改查標簽的 id 屬性必須和 Dao 層介面的方法名相同,
-
映射組態檔中的增刪改查標簽的 parameterType 屬性必須和 Dao 層介面方法的引數相同,
-
映射組態檔中的增刪改查標簽的 resultType 屬性必須和 Dao 層介面方法的回傳值相同, ?
-
獲取動態代理物件 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分頁插件總結
-
在企業級開發中,分頁也是一種常見的技術,而目前使用的 MyBatis 是不帶分頁功能的,如果想實作分頁的 功能,需要我們手動撰寫 LIMIT 陳述句,但是不同的資料庫實作分頁的 SQL 陳述句也是不同的,所以手寫分頁 成本較高,這個時候就可以借助分頁插件來幫助我們實作分頁功能,
-
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
標籤:其他
