国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

手機網(wǎng)站適合分開做百度開店怎么收費

手機網(wǎng)站適合分開做,百度開店怎么收費,wordpress 白色主題,手機剪輯app哪個最好在看本篇內(nèi)容之前,最好先理解一下Hibernate和MyBatis的本質(zhì)區(qū)別,這篇Hibernate和MyBatis使用對比實例做了實際的代碼級對比,而MyBatis作為更適合互聯(lián)網(wǎng)產(chǎn)品的持久層首選必定有必然的原因 MyBatis核心組件 MyBatis能夠成為數(shù)據(jù)持久層首選框&a…

在看本篇內(nèi)容之前,最好先理解一下Hibernate和MyBatis的本質(zhì)區(qū)別,這篇Hibernate和MyBatis使用對比實例做了實際的代碼級對比,而MyBatis作為更適合互聯(lián)網(wǎng)產(chǎn)品的持久層首選必定有必然的原因

MyBatis核心組件

MyBatis能夠成為數(shù)據(jù)持久層首選框,關鍵還是在于ORM(Object-Relational Mapping)的特性上:

  • 不屏蔽SQL,這意味著可以更精確的定位SQL語句,可以對其進行優(yōu)化和改造,非常有利于互聯(lián)網(wǎng)的高可用和高并發(fā)屬性,符合互聯(lián)網(wǎng)產(chǎn)品需要的高性能特點
  • 提供強大、靈活的映射機制,提供動態(tài)SQL的特性,允許根據(jù)不同條件組裝SQL,這個特點遠比其他工具或者Java編碼的可讀性和可維護性更好,滿足各種應用系統(tǒng)需求的同時滿足了需求經(jīng)常變化的互聯(lián)網(wǎng)產(chǎn)品要求
  • 提供Mapper接口編程,只需要一個接口和一個XML就能夠構建映射器,進一步簡化開發(fā)工作,從而可以更聚焦于業(yè)務邏輯

MyBatis的核心組件分為4個部分:

  • SqlSessionFactoryBuilder(構造器):根據(jù)配置或者代碼生成SqlSessionFactory,采用分布構建的Builder模式
  • SqlSessionFactory(工廠接口):生成SqlSession,使用工廠模式
  • SqlSession(會話):既可以發(fā)送SQL執(zhí)行返回結(jié)果,也可以獲取Mapper的接口,在現(xiàn)有的模式中,通常會使用MyBatis提供的SQL Mapper接口編程技術,以提高代碼的可讀性和可維護性
  • SqlMapper(映射器):由Java接口和XML文件(或注解)構成,需要給出對應的SQL和映射規(guī)則,由他來發(fā)送SQL去執(zhí)行,并返回結(jié)果

在這里插入圖片描述

SQLSessionFactory

在這里插入圖片描述
使用MyBatis需要使用配置或者代碼構建SQLSessionFactory(工廠接口)對象,MyBatis提供了構造器SQLSessionFactoryBuilder,而這就是建造者模式,一步構建SQLSessionFactoryBuilder會比較復雜,為了簡化這個對象的構建過程,MyBatis提供了一個配置類org.apache.ibatis.session.Configuration作為引導,實際的分步構建過程是在Configuration類里完成的

這里邊會有很多其他內(nèi)容,例如比較復雜的插件等等

構建SQLSessionFactory對象還可以采用讀取配置好的XML文件的形式(通過Java代碼的形式需要修改則會相對復雜),無論是配置了XML文件或者提供了代碼后,MyBatis會讀取配置文件,通過Configuration類對象構建整個MyBatis的上下文

  • SQLSessionFactory是一個接口,在MyBatis中存在SQLSessionManager和DefaultSQLSessionFactory兩個實現(xiàn)類,前者多用于多線程環(huán)境中,通常情況下是使用后者來實現(xiàn)的
  • 每個基于MyBatis的應用都是以一個SQLSessionFactory的實例為中心的,而SQLSessionFactory唯一的作用就是生產(chǎn)MyBatis的核心接口對象SQLSession,因此它的責任是唯一的,在這樣的情況下,我們應該只構建一個SQLSessionFactory對象,顯然就是一種單例模式
使用XML配置文件構建SQLSessionFactory對象
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--typeAliases必須放在properties后面,否則會報錯 --><properties resource="config.properties"/><typeAliases><typeAlias alias="role" type="com.ssm.pojo.Role" /></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--<property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm1?useUnicode=true;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="Ms123!@#"/>--><property name="driver" value="${className}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/t_role.xml"/></mappers>
</configuration>

這段XML代碼是MyBatis配置文件的示例。

  • typeAliases 定義了類型別名,這里將 com.ssm.Role 類型別名為 Role,定義別名后在MyBatis上下文中就可以使用別名代替全限定名
  • properties 用于加載外部屬性文件 config.properties。
  • environments 定義了數(shù)據(jù)庫連接的環(huán)境配置,默認使用 development 環(huán)境。
  • transactionManager 設置事務管理器類型為 JDBC。
  • dataSource 設置數(shù)據(jù)源類型為 POOLED,表示采用MyBatis內(nèi)部提供的連接池方式。
  • mappers 定義了映射文件的位置,這里指定了 mapper/t_role.xml。

有了這個配置就可以用一段代碼來構建SQLSessionFactory對象,代碼如下

package com.ssm;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** 創(chuàng)建SqlSessionFactory類,用于單例模式下創(chuàng)建MyBatis的SqlSessionFactory對象。* 這個類不包含任何參數(shù)構造函數(shù),通過靜態(tài)方法創(chuàng)建SqlSessionFactory實例。*/
public class CreateSqlSessionFactory
{/*** 靜態(tài)方法,創(chuàng)建并返回一個SqlSessionFactory實例。* 這個方法通過讀取配置文件"mybatis-config.xml"來構建SqlSessionFactory。** @return SqlSessionFactory MyBatis的SQL會話工廠對象。*/private static SqlSessionFactory createSqlSessionFactory() {SqlSessionFactory sqlSessionFactory = null; // 初始化SqlSessionFactory為nullString cfgFile = "mybatis-config.xml"; // MyBatis配置文件的路徑InputStream inputStream = null; // 初始化輸入流為nulltry {// 嘗試從資源中加載配置文件的輸入流inputStream = Resources.getResourceAsStream(cfgFile);// 使用輸入流構建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}catch (IOException e){e.printStackTrace(); // 捕獲并打印IO異常}return sqlSessionFactory; // 返回構建的SqlSessionFactory實例}
}
使用代碼構建SQLSessionFactory對象
    private static SqlSessionFactory createSqlSessionFactoryII(){// 初始化數(shù)據(jù)源PooledDataSource dataSource = new PooledDataSource();dataSource.setDriver("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("123456");dataSource.setUrl("jdbc://localhost:3306/ssm");dataSource.setDefaultAutoCommit(false);// 設置事務工廠和環(huán)境配置TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);// 配置MyBatisConfiguration configuration = new Configuration(environment);// 注冊別名,使得在映射文件中可以使用別名代替全類名configuration.getTypeAliasRegistry().registerAlias("role", Role.class);// 添加映射器,用于映射SQL語句到Java方法configuration.addMapper(RoleMapper.class);// 構建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);return sqlSessionFactory;}

這種方式比較復雜,如果修改代碼還需要重新編譯等動作,實際上完成了跟XML形式一樣的事情,但如果配置文件中配置的是加密后的數(shù)據(jù)庫用戶名和密碼,需要在構建SQLSessionFactory對象之前進行解密,可以采用這種形式

SQLSession

在MyBatis中,SQLSession也是核心接口之一,在MyBatis中有兩個實現(xiàn)類,DefaultSqlSession和SqlSessionManager,DefaultSqlSession是單線程環(huán)境下使用,而SqlSessionManager在多線程環(huán)境下使用;SqlSession的作用類似于一個JDBC中的Connection對象,代表著一個鏈接資源的啟用,如要作用有3個其一獲取Mapper接口、其二給數(shù)據(jù)庫發(fā)送SQL、其三控制數(shù)據(jù)庫事務

    public void executeSqlSessionOperation() {// 假設這里是你需要執(zhí)行的具體邏輯操作// 注意:由于原代碼沒有具體的業(yè)務邏輯,以下代碼將展示如何在try-with-resources中結(jié)構化處理SqlSessiontry (SqlSession sqlSession = createSqlSessionFactory().openSession()) {// 執(zhí)行SqlSession中的操作,例如:sqlSession.insert(...); sqlSession.update(...); 等// 提交事務sqlSession.commit();} catch (Exception e) {// 對異常進行處理,這里可以根據(jù)不同的異常類型進行更細致的捕獲和處理// 例如,對于數(shù)據(jù)庫連接異常、SQL執(zhí)行異常等,可以進行不同的日志記錄或者錯誤處理e.printStackTrace();// 回滾事務,由于在try塊中無法直接訪問到SqlSession,所以這里假設異常發(fā)生時需要回滾事務// 注意:實際中可能需要更復雜的邏輯來確保事務的正確回滾sqlSession.rollback();}finally {if(sqlSession != null){sqlSession.close();}}}

映射器

映射器是MyBatis中相對復雜的組件,它由一個接口和對應的XML文件(或注解)組成,它可以配置一下內(nèi)容

  • 描述映射規(guī)則
  • 提供SQL語句,并配置SQL參數(shù)類型、返回類型、緩存刷新等信息
  • 配置緩存
  • 提供動態(tài)SQL

首先定義一個POJO

package com.ssm.pojo;
/*** 角色類,用于表示系統(tǒng)中的角色信息*/
public class Role {private Integer id; // 角色IDprivate String roleName; // 角色名稱private String note; // 角色備注信息/*** 獲取角色ID* @return 角色的ID值*/public Integer getId() {return id;}/*** 設置角色ID* @param id 角色的新ID值*/public void setId(Integer id) {this.id = id;}/*** 獲取角色名稱* @return 角色的名稱*/public String getRoleName() {return roleName;}/*** 設置角色名稱* @param roleName 角色的新名稱*/public void setRoleName(String roleName) {this.roleName = roleName;}/*** 獲取角色備注信息* @return 角色的備注信息*/public String getNote() {return note;}/*** 設置角色備注信息* @param note 角色的新備注信息*/public void setNote(String note) {this.note = note;}@Overridepublic String toString() {return "Role{" +"id=" + id +", roleName='" + roleName + '\'' +", note='" + note + '\'' +'}';}
}

在Java中,使用private關鍵字來修飾類的成員變量(如上述Role類中的id, roleName, note)的主要原因如下:

  • 封裝性(Encapsulation):這是面向?qū)ο缶幊?#xff08;OOP)的基本原則之一。將數(shù)據(jù)成員聲明為private意味著它們不能直接被外部訪問或修改。這樣可以隱藏對象內(nèi)部實現(xiàn)細節(jié),對外提供一個清晰、穩(wěn)定的接口。通過只暴露必要的公共方法(如getId(), setId(), getRoleName(), setRoleName()等),控制了對這些私有成員變量的訪問和操作,確保了數(shù)據(jù)的安全性和一致性。
  • 數(shù)據(jù)保護:private修飾的變量僅能在該類的內(nèi)部方法中訪問和修改。這樣可以防止外部代碼(如其他類或同一個類的不同實例)意外地更改或錯誤地使用這些數(shù)據(jù),從而避免潛在的數(shù)據(jù)損壞或邏輯錯誤。例如,對于id這樣的標識符,通常希望其一旦初始化后就不允許隨意變更,通過將其設為private并提供無set方法,就可以有效防止外部代碼誤改。
  • 實現(xiàn)內(nèi)聚性:將變量設為private并提供對應的getter和setter方法(即訪問器和修改器),可以集中處理與這些變量相關的業(yè)務邏輯。例如,在setNote()方法中,可以添加額外的校驗邏輯(如檢查輸入字符串是否合法)、觸發(fā)相關事件(如更新日志記錄)或執(zhí)行其他與設置note屬性相關的操作。這樣使得類的職責更加明確,提高了代碼的內(nèi)聚性。
  • 靈活性與可維護性:將來如果需要更改Role類內(nèi)部數(shù)據(jù)的存儲方式(如從使用String存儲roleName改為使用枚舉類型),或者添加新的約束條件(如限制note的最大長度),由于外部代碼僅依賴于提供的公共方法,而不直接操作私有變量,因此無需修改大量外部代碼,極大地提高了代碼的靈活性和可維護性。

綜上所述,將POJO(Plain Old Java Object,簡單Java對象)中的變量定義為private,是為了實現(xiàn)面向?qū)ο缶幊讨械姆庋b性原則,保護數(shù)據(jù)安全,增強代碼內(nèi)聚性,以及提高代碼的靈活性和可維護性。

MyBatis的映射器的作用主要是在POJO和SQL之間建立映射關系

用XML實現(xiàn)映射器

用XML定義映射器分為接口和XML兩部分,首先定義一個映射器接口

package com.ssm.Dao;import com.ssm.pojo.Role;import java.util.List;
/*** 角色數(shù)據(jù)訪問接口*/
public interface RoleDao {/*** 根據(jù)角色ID獲取角色信息* @param id 角色的唯一標識符* @return 返回對應ID的角色對象,如果不存在則返回null*/public Role getRoleById(Integer id);/*** 根據(jù)角色名稱獲取角色信息* @param name 角色的名稱* @return 返回對應名稱的角色對象,如果不存在則返回null*/public Role getRoleByName(String name);/*** 新增角色信息* @param role 需要新增的角色對象*/public void insertRole(Role role);/*** 更新角色信息* @param role 需要更新的角色對象*/public void updateRole(Role role);/*** 根據(jù)角色ID刪除角色信息* @param id 需要刪除的角色的唯一標識符*/public void deleteRole(Integer id);/*** 獲取所有角色信息* @return 返回所有角色的列表*/public List<Role> findRoles(String roleName);
}

在mybatis-config.xml文件里有一行mapper的配置

    <mappers><mapper resource="mapper/t_role.xml"/></mappers>

其作用是引入一個XML配置文件,通過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的命名空間 -->
<mapper namespace="com.ssm.mapper.RoleMapper"><!-- 定義結(jié)果映射,用于將數(shù)據(jù)庫中的數(shù)據(jù)映射成Role對象 --><resultMap id="roleMap" type="com.ssm.pojo.Role"><id property="id" column="id"/> <!-- 主鍵映射 --><result property="roleName" column="roleName"/> <!-- 角色名映射 --><result property="note" column="note"/> <!-- 備注映射 --></resultMap><!-- 插入一個新的Role記錄 --><insert id="insertRole" parameterType="com.ssm.pojo.Role">INSERT INTO t_role(roleName, note) VALUES (#{roleName}, #{note})</insert><!-- 根據(jù)ID查詢Role信息,返回Role對象 --><select id="getRoleById" parameterType="int" resultMap="roleMap">SELECT * FROM t_role WHERE id = #{id}</select><!-- 更新Role的信息 --><update id="updateRole" parameterType="com.ssm.pojo.Role">UPDATE t_role SET roleName = #{roleName}, note = #{note} WHERE id = #{id}</update><!-- 根據(jù)ID刪除一個Role記錄 --><delete id="deleteRole" parameterType="int">DELETE FROM t_role WHERE id = #{id}</delete>
</mapper>

有了接口和XML映射文件,就完成了一個映射器的定義,MyBatis在默認情況下提供自動映射功能,只要SQL返回的列名能和POJO對應起來即可;很顯然定義映射器只用到了接口,而沒有實現(xiàn)類,接口是不能直接運行的,MyBatis是用動態(tài)代理技術,來處理了相關的映射邏輯

用注解實現(xiàn)映射器
/*** RoleMapperII接口,用于通過ID獲取角色信息*/
package com.ssm.mapper;import com.ssm.pojo.Role;
import org.apache.ibatis.annotations.Select;public interface RoleMapperII {/*** 根據(jù)角色ID獲取角色詳細信息* @param id 角色的唯一標識符* @return 返回對應ID的角色對象*/@Select("select * from role where id = #{id}")public Role getRoleById(Integer id);
}

這完全等同于通過XML方式構建映射器,如果兩個方式同時定義時,XML方式將覆蓋掉注解方式,如果使用注解的方式則需要在MyBatis基礎配置文件中添加mapper接口,和配置XML類似

    <mappers><mapper resource="mapper/t_role.xml"/><mapper class="com.ssm.mapper.RoleMapperII"/></mappers>

并且在代碼中使用Configuration對象注冊這個映射器接口configuration.addMapper(RoleMapperII.class);

用SQLSession發(fā)送SQL

有了映射器就可以通過SQLSession發(fā)送SQL了,如下代碼所示

Role role=(Role)sqlSession;
selectOne("com.ssm.mapper.RoleMapper.getRoleByID", 1);

selectOne方法表示使用查詢并且只返回一個對象,參數(shù)一看就很清楚來自哪里,如此字符串對象由一個命名空間加上SQL ID組合而成,它完全定位到了一條SQL,這條語句也可以簡化為Role role=(Role)sqlSession.selectOne("getRole",1);這是MyBatis的前身IBATIS留下的方式

用Mapper接口發(fā)送SQL

SQLSession還可以獲取Mapper接口,用Mapper接口發(fā)送SQL,代碼如下

RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1);

因為XML文件或者接口注解定義的SQL都可以通過“類的全限定名+方法名”查找,因此MyBatis會啟用對應接口執(zhí)行SQL并返回結(jié)果

  • 用注解的形式實現(xiàn)映射器,如果遇到很復雜的SQL,那代碼的可讀性實在太差了,更嚴重的如果遇到動態(tài)SQL,那就會更加復雜,Java代碼和SQL混雜一起,非常難讀且難以維護
  • 發(fā)送SQL如果使用SQLSession直接發(fā)送,那只會在運行過程中才能知道是否會產(chǎn)生錯誤,而如果使用Mapper的方式發(fā)送SQL,IDE會提示錯誤和校驗,并且使用SQLSession發(fā)送SQL也會給代碼帶來一定的復雜度,雖然不至于很難讀,但也不那么美觀

生命周期

生命周期是MyBatis組件的重要問題,尤其在多線程環(huán)境中,控制不好會造成嚴重的多線程并發(fā)或者系統(tǒng)資源浪費問題

  • SQLSessionFactoryBuilder:的作用是構建SQLSessionFactory,構建成功后,SQLSessionFactoryBuilder就失去了作用,所以他只能存在于構建SQLSessionFactory的方法中,而不能長期存在
  • SQLSessionFactory:可以認為它是一個數(shù)據(jù)庫的連接池,其作用是構建SQLSession接口對象,而MyBatis的本質(zhì)是對數(shù)據(jù)庫的操作,因此SQLSessionFactory的生命周期存在于整個MyBatis的應用中,一旦構建了SQLSessionFactory,就要長期保存,直到不再使用MyBatis應用;而由于SQLSessionFactory相當于一個對數(shù)據(jù)庫的連接池,它占據(jù)著數(shù)據(jù)庫的鏈接資源,如果構建多個SQLSessionFactory,就存在多個連接池,這樣不利于對數(shù)據(jù)庫資源的合理使用,容易導致數(shù)據(jù)庫連接多不好管理,數(shù)據(jù)庫資源快速耗光而宕機,因此通常希望只有一個SQLSessionFactory作為單例,然后讓他在應用中被共享
  • SQLSession:如果SQLSessionFactory相當于數(shù)據(jù)庫連接池,那么SQLSession就相當于一個數(shù)據(jù)庫連接(Connection對象),用戶可以在一個事務里執(zhí)行多條SQL,然后通過它的commit、rollback等方法進行提交或者回滾事務;SQLSession應該只存在當前業(yè)務請求中,處理完整個請求后,應該關閉這條連接,讓它歸還給SQLSessionFactory,否則數(shù)據(jù)庫資源很快會耗光,導致系統(tǒng)癱瘓,所以需要用try...catch...finally結(jié)構體來保證其能夠正確關閉并釋放詩句哭鏈接資源
  • Mapper:Mapper是一個接口,由SQLSession構建,所以它的生命周期至多和SQLSession保持一致,會隨著SQLSession的關閉而消失,這是合理的,Mapper代表一個業(yè)務處理,一旦處理完相關業(yè)務,就應該拋棄它

代碼示例

在這里插入圖片描述

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ssm</groupId><artifactId>ChapterMybatis</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>ChapterMybatis</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.24.1-GA</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.10</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>7.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.26</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.26</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies>
</project>
package com.ssm.Dao;import com.ssm.pojo.Role;import java.util.List;
/*** 角色數(shù)據(jù)訪問接口*/
public interface RoleDao {/*** 根據(jù)角色ID獲取角色信息* @param id 角色的唯一標識符* @return 返回對應ID的角色對象,如果不存在則返回null*/public Role getRoleById(Integer id);/*** 根據(jù)角色名稱獲取角色信息* @param name 角色的名稱* @return 返回對應名稱的角色對象,如果不存在則返回null*/public Role getRoleByName(String name);/*** 新增角色信息* @param role 需要新增的角色對象*/public void insertRole(Role role);/*** 更新角色信息* @param role 需要更新的角色對象*/public void updateRole(Role role);/*** 根據(jù)角色ID刪除角色信息* @param id 需要刪除的角色的唯一標識符*/public void deleteRole(Integer id);/*** 獲取所有角色信息* @return 返回所有角色的列表*/public List<Role> findRoles(String roleName);}
package com.ssm.pojo;
/*** 角色類,用于表示系統(tǒng)中的角色信息*/
public class Role {private Integer id; // 角色IDprivate String roleName; // 角色名稱private String note; // 角色備注信息/*** 獲取角色ID* @return 角色的ID值*/public Integer getId() {return id;}/*** 設置角色ID* @param id 角色的新ID值*/public void setId(Integer id) {this.id = id;}/*** 獲取角色名稱* @return 角色的名稱*/public String getRoleName() {return roleName;}/*** 設置角色名稱* @param roleName 角色的新名稱*/public void setRoleName(String roleName) {this.roleName = roleName;}/*** 獲取角色備注信息* @return 角色的備注信息*/public String getNote() {return note;}/*** 設置角色備注信息* @param note 角色的新備注信息*/public void setNote(String note) {this.note = note;}@Overridepublic String toString() {return "Role{" +"id=" + id +", roleName='" + roleName + '\'' +", note='" + note + '\'' +'}';}
}
package com.ssm.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;/*** 創(chuàng)建SqlSessionFactory類,用于單例模式下創(chuàng)建MyBatis的SqlSessionFactory對象。* 這個類不包含任何參數(shù)構造函數(shù),通過靜態(tài)方法創(chuàng)建SqlSessionFactory實例。*/
public class SqlSessionFactoryUtils {//同步鎖,用于確保線程安全地創(chuàng)建單例SqlSessionFactory對象private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;//SqlSessionFactory單例對象private static SqlSessionFactory sqlSessionFactory = null;//私有構造函數(shù),防止外部實例化本類private SqlSessionFactoryUtils(){System.out.println("SqlSessionFactoryUtils類被實例化了");}/*** 靜態(tài)方法,創(chuàng)建并返回一個SqlSessionFactory實例。* 這個方法通過讀取配置文件"mybatis-config.xml"來構建SqlSessionFactory。* 方法是線程安全的,確保了SqlSessionFactory的單例特性。*/public static void getSqlSessionFactory() {synchronized (LOCK) { //使用同步代碼塊,保證線程安全if (sqlSessionFactory != null) {//如果SqlSessionFactory已經(jīng)存在,則直接返回,避免重復創(chuàng)建return;}//讀取配置文件String configFile = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(configFile);//基于配置文件構建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}}/*** 打開一個SqlSession會話。* 如果SqlSessionFactory尚未創(chuàng)建,則先創(chuàng)建之。** @return 返回一個SqlSession實例。*/public static SqlSession openSqlSession(){//確保SqlSessionFactory已經(jīng)創(chuàng)建if(sqlSessionFactory ==null){getSqlSessionFactory();}//返回一個新的SqlSession實例return sqlSessionFactory.openSession();}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--typeAliases必須放在properties后面,否則會報錯 --><properties resource="config.properties"/><typeAliases><typeAlias alias="Role" type="com.ssm.pojo.Role"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--<property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm1?useUnicode=true;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="Ms123!@#"/>--><property name="driver" value="${className}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/RoleMapper.xml"/><mapper class="com.ssm.Dao.RoleDaoII"/></mappers>
</configuration>
# 此段為配置文件內(nèi)容,而非函數(shù)或類代碼,故按行進行注釋解釋# 指定MySQL連接的驅(qū)動類
className=com.mysql.cj.jdbc.Driver# 設置數(shù)據(jù)庫連接的URL,包括數(shù)據(jù)庫地址、端口和數(shù)據(jù)庫名稱等信息
url=jdbc:mysql://localhost:3306/ssm1?useUnicode=true&characterEncoding=utf8# 指定數(shù)據(jù)庫的用戶名
username=root# 指定數(shù)據(jù)庫的密碼
password=Ms123!@#
# 配置文件的根記錄器設置
log4j.rootLogger=DEBUG, stdout# 設置org.mybatis包的記錄級別為DEBUG
log4j.logger.org.mybatis=DEBUG# 配置標準輸出流作為日志的輸出目標
log4j.appender.stdout=org.apache.log4j.ConsoleAppender# 配置標準輸出流的布局模式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
# 上述模式為日志輸出的格式,%5p表示日志級別,%d表示日期,%C表示類別,%m表示日志消息,%n表示換行
# 下面的注釋掉的配置是一種替代的日期格式和日志輸出格式
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
<?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的命名空間 -->
<mapper namespace="com.ssm.Dao.RoleDao"><!-- 定義結(jié)果映射,用于將數(shù)據(jù)庫中的數(shù)據(jù)映射成Role對象 --><resultMap id="roleMap" type="com.ssm.pojo.Role"><id property="id" column="id"/> <!-- 主鍵映射 --><result property="roleName" column="roleName"/> <!-- 角色名映射 --><result property="note" column="note"/> <!-- 備注映射 --></resultMap><!-- 插入一個新的Role記錄 --><insert id="insertRole" parameterType="com.ssm.pojo.Role">INSERT INTO t_role(roleName, note) VALUES (#{roleName}, #{note})</insert><!-- 根據(jù)ID查詢Role信息,返回Role對象 --><select id="getRoleById" parameterType="int" resultMap="roleMap">SELECT id, roleName, note FROM t_role WHERE id = #{id}</select><select id="findRoles" parameterType="string" resultMap="roleMap">select id, roleName, note from t_role where roleName like concat ('%',#{roleName},'%')</select><!-- 更新Role的信息 --><update id="updateRole" parameterType="com.ssm.pojo.Role">UPDATE t_role SET roleName = #{roleName}, note = #{note} WHERE id = #{id}</update><!-- 根據(jù)ID刪除一個Role記錄 --><delete id="deleteRole" parameterType="int">DELETE FROM t_role WHERE id = #{id}</delete>
</mapper>
package com.ssm;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import com.ssm.Dao.RoleDao;
import com.ssm.pojo.Role;
import com.ssm.Utils.SqlSessionFactoryUtils;import java.util.List;/*** 主程序類,用于演示通過MyBatis進行數(shù)據(jù)庫操作。*/
public class Main {public static void main(String[] args) {// 獲取日志記錄器Logger log = Logger.getLogger(Main.class);SqlSession sqlSession = null;try{// 獲取SqlSession實例sqlSession = SqlSessionFactoryUtils.openSqlSession();// 通過SqlSession獲取RoleDao接口的實現(xiàn)RoleDao roleDao = sqlSession.getMapper(RoleDao.class);// 調(diào)用方法查詢角色列表List<Role> role = roleDao.findRoles("zhang");// 記錄查詢結(jié)果log.info(role.toString());// 通過ID查詢單個角色Role role1 = roleDao.getRoleById(2);// 記錄查詢結(jié)果log.info(role1.toString());// 插入角色到數(shù)據(jù)庫roleDao.insertRole(role1);} finally {// 確保SqlSession在操作完成后關閉if (sqlSession != null){sqlSession.close();}}}
}
http://m.aloenet.com.cn/news/42472.html

相關文章:

  • 和縣網(wǎng)站制作杭州seo排名費用
  • 什么網(wǎng)站可以免費做兼職網(wǎng)絡推廣的方式有哪些?
  • ui設計師培訓騙局seo實戰(zhàn)培訓
  • 大連做網(wǎng)站公司網(wǎng)站發(fā)布與推廣
  • 網(wǎng)站流量怎么做百度手機快速排名點擊軟件
  • 萊蕪信息港金點子招聘天津seo優(yōu)化公司
  • 廈門網(wǎng)站建設找維品競猜世界杯
  • 網(wǎng)站做全局搜索百度文庫賬號登錄入口
  • 網(wǎng)站模板 帝國 phpcms今日新聞播報
  • 制作營銷網(wǎng)站模板下載花都網(wǎng)站建設公司
  • 廣州工商注冊公司代辦專業(yè)全網(wǎng)優(yōu)化
  • 做網(wǎng)站視頻圖片加載不出來適合成人參加的培訓班
  • seo如何做網(wǎng)站建設網(wǎng)站推廣去哪家比較好
  • 做網(wǎng)站 0元代理百度賬號登錄入口網(wǎng)頁版
  • 網(wǎng)站過期怎么找回來亞馬遜跨境電商開店流程及費用
  • 門戶網(wǎng)站建設總結(jié)百度搜索次數(shù)統(tǒng)計
  • 網(wǎng)站下載到本地合肥seo按天收費
  • 網(wǎng)站推廣渠道seo專業(yè)培訓班
  • 重慶做網(wǎng)站的網(wǎng)絡公司域名注冊好了怎么弄網(wǎng)站
  • 哪個網(wǎng)站可以做水果銷售代理免費seo快速排名工具
  • 有什么網(wǎng)站做熱圖代寫文章價格表
  • 做感恩網(wǎng)站的圖片廣州網(wǎng)頁seo排名
  • 一臺vps兩個wordpress網(wǎng)站營銷型網(wǎng)站建設套餐
  • 寧波網(wǎng)站建設設計公司信息上海百度公司總部
  • 建網(wǎng)站買空間seo高端培訓
  • 做視頻網(wǎng)站的備案要求優(yōu)化服務是什么意思
  • 成都品牌網(wǎng)站建設域名注冊萬網(wǎng)
  • 坪山網(wǎng)站開發(fā)軟件外包公司有前途嗎
  • 中央最新指示停止核酸檢測東莞seo軟件
  • 很長的網(wǎng)站域名怎么做短注冊安全工程師