超詳細整合SSM框架--(Spring + Spring MVC + MyBatis)

来源:https://www.cnblogs.com/xw-01/archive/2023/07/16/17558383.html
-Advertisement-
Play Games

## 超詳細整合SSM框架--(Spring + Spring MVC + MyBatis) 閱讀該文章之前首先要清楚Spring框架,SpringMVC框架,Mybatis框架。 SSM框架,是Spring + Spring MVC + MyBatis的縮寫,這個是繼SSH之後,目前比較主流的Ja ...


超詳細整合SSM框架--(Spring + Spring MVC + MyBatis)

閱讀該文章之前首先要清楚Spring框架,SpringMVC框架,Mybatis框架。

SSM框架,是Spring + Spring MVC + MyBatis的縮寫,這個是繼SSH之後,目前比較主流的Java EE企業級框架,適用於搭建各種大型的企業級應用系統。



SpringMVC框架:

MVC簡介

MVC 全名是 Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫, 是一種用於設計創建 Web 應用程式表現層的模式。


Model(模型): 通常指的就是我們的數據模型。作用一般情況下用於封裝數據。
View(視圖): 通常指的就是我們的 jsp 或者 html。作用一般就是展示數據的。 通常視圖是依據模型數據創建的。
Controller(控制器): 是應用程式中處理用戶交互的部分。作用一般就是處理程式邏輯的。


SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動類型的輕量級 Web 框架,屬於 Spring FrameWork 的後續產品,已經融合在 Spring Web Flow 裡面。Spring 框架提供了構建 Web

應用程式的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構,從而在使用 Spring 進行 WEB 開發時,可以選擇使用 Spring 的 Spring MVC 框架或集成其他 MVC 開發框架。

SpringMVC 已經成為目前最主流的 MVC 框架之一,並且隨著 Spring3.0 的發佈,已成為最優秀的 MVC 框架。



image


SpringMVC中的常用註解

@GetMapping

作用:用於建立請求URL和處理請求方法之間的對應關係

可以出現在類上,請求URL的第一級訪問目錄
可以出現在方法上,請求URL的第二級訪問目錄
value:用於指定請求的URL。它和path屬性的作用是一樣的
method:用於指定請求的方式
params:用於指定限制請求參數的條件

"""

@Controller
//@RequestMapping("SpringMVC/")
public class HelloController {

//請求方法為get  請求參數必須有username
@RequestMapping(value = "/hello",method = RequestMethod.GET,params = {"username"})
//@RequestMapping("/hello")
public String sayHello(){
    System.out.println("SpringMVC hello~~~");
    return "success";
}

}

"""



@RequestParam

作用:把請求中指定名稱的參數給控制器中的形參賦值

value:請求參數的名稱
required:請求參數中必須提供此參數。預設值:true,表示必須提供,如果不提供就報錯。

"""

@RequestMapping("/testRequestParam")
	//RequestParam --更名  
	// 屬性  value=別名 required=必須含有的參數
	public String testRequestParam(@RequestParam(value = "username") String  name){
		System.out.printf(name);
		System.out.println("testRequestParam執行了~~~");
		return "success";
	}

"""



@RequestBody

作用:用於獲取請求體內容。直接使用得到key=value&key=vaule...結構的數據。get請求方式不適用

required:是否必須有請求體。當取值為true時,get請求會報錯。如果取值為false,get請求得到是null

"""

 @RequestMapping("/testRequestBody")
	//RequestBody 獲取請求體中的內容  如:username=benshan&password=98989&money=200
	public String testRequestBody(@RequestBody String body){
		System.out.println("testRequestBody執行了~~~");
		System.out.println(body);
		return "success";
	}

"""



@PathVariable

作用:用於綁定URL中的占位符。url中有/delete/{id},{id}就是占位符。

"""

  @RequestMapping("/testPathVariable/{id}")
	//PathVariable使用Restful風格,結構清晰,拓展方便
	public String testPathVariable(@PathVariable(value = "id") String id){
		System.out.println("testPathVariable~~~");
		System.out.println(id);
		return "success";
	}

"""



@RequestHeader

作用:用於獲取請求消息頭

value 提供消息頭名稱
required:是否必須有此消息頭

"""

  @RequestMapping("/testRequestHeader")
	//testRequestHeader獲取請求頭的值
	public String testRequestHeader(@RequestHeader(value = "Accept") String header){
		System.out.println("testRequestHeader~~~");
		System.out.println(header);
		return "success";
	}

"""



@CookieValue

作用:用於把指定cookie名稱的值傳入控制器方法參數

 value:指定cookie的名稱
 required:是否必須有此cookie

"""

 @RequestMapping("/testCookieValue")
	//testRequestHeader獲取請求頭的值
	public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookie){
		System.out.println("testCookieValue~~~");
		System.out.println(cookie);
		return "success";
	}

"""


@ModelAttribute

作用:可以修飾方法和參數。出現在方法上,表示當前方法會在控制器的方法執行之前執行,先執行。出現在參數上,獲取指定的數據給參數賦值

value 用於獲取數據的key

"""

@RequestMapping("/testModelAttribute")
	public String testModelAttribute(){
		System.out.println("testModelAttribute~~~");
		return "success";
	}
	@ModelAttribute
	//在控制器執行之前  執行
	public void showUser(){
		System.out.println("showUser執行了~~~");
	}

"""


@SessionAttributes

作用:用於多次執行控制器方法間的參數共用

value 用於指定存入的屬性名稱

type:用於指定存入的數據類型


新註解

@RequestMapping 和 @GetMapping @PostMapping 區別

@GetMapping是一個組合註解,是@RequestMapping(method = RequestMethod.GET)的縮寫。

@PostMapping是一個組合註解,是@RequestMapping(method = RequestMethod.POST)的縮寫。



Spring框架

Spring是什麼?

Spring是一個輕量級Java開發框架,最早有Rod Johnson創建,目的是為瞭解決企業級應用開發的業務邏輯層和其他各層的耦合問題。它是一個分層的JavaSE/JavaEE full-stack(一站式)輕量級開源框架,為開發Java應用程式提供全面的基礎架構支持。Spring負責基礎架構,因此Java開發者可以專註於應用程式的開發。


體繫結構

image



核心容器(Core Container):Spring的核心容器是其他模塊建立的基礎,有Spring-core、Spring-beans、Spring-context、Spring-context-support和Spring-expression(String表達式語言)等模塊組成

數據訪問/集成(Data Access)層:數據訪問/集成層由JDBC、ORM、OXM、JMS和事務模塊組成。

Web層:Web層由Spring-web、Spring-webmvc、Spring-websocket和Portlet模塊組成。

AOP(Aspect Oriented Programming)模塊:提供了一個符合AOP要求的面向切麵的編程實現,允許定義方法攔截器和切入點,將代碼按照功能進行分離,以便乾凈地解耦。

植入(Instrumentation)模塊:提供了類植入(Instrumentation)支持和類載入器的實現,可以在特定的應用伺服器中使用。

消息傳輸(Messaging):Spring4.0以後新增了消息(Spring-messaging)模塊,該模塊提供了對消息傳遞體繫結構和協議的支持。

測試(Test)模塊:Spring-test模塊支持使用JUnit或TestNG對Spring組件進行單元測試和集成測試。



引入jar包

"""

 <dependencies>
		<!--spring的jar包 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.0.11.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>5.0.11.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>5.0.11.RELEASE</version>
		</dependency>       
</dependencies>

"""


導入約束

"""

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/context
			http://www.springframework.org/schema/context/spring-context.xsd">
	   <!--spring的約束 -->
	<!--把對象的創建交給Spring來管理 -->
	<!--獲取容器中對象時使用id-->
   <!-- <bean id="accountServiceImpl" class="com.dynamic2.service.Impl.AccountServiceImpl"></bean>
	<bean id="accountDaoImpl" class="com.dynamic2.dao.Impl.AccountDaoImpl"></bean>-->

	<context:component-scan base-package="com.dynamic2"></context:component-scan>

</beans>

"""


常見註解


用於創建對象

@Component:把資源讓spring來管理。相當於xml中配置一個bean。value:指定bean的id,如果不指定value屬性,預設bean的id是當前類的類名。首字母小寫

@Controller:與@Component功能一樣,一般用在表現層,便於分層

@Service:與@Component功能一樣,一般用在業務層,便於分層

@Repository:與@Component功能一樣,一般用於持久層,便於分層



"""

/**
 * @Author: Promsing
 * @Date: @Date: 2023/7/17 - 11:34
 * @Description: 用於創建對象
 * @version: 1.0
 *  XML配置 <bean id="accountServiceImpl" class="com.dynamic2.service.Impl.AccountServiceImpl"></bean>
 */
@Repository("accountDao ")
public class AccountDaoImpl implements IAccountDao {
			......
}

@Service("accountService")
public class AccountServiceImpl implements IAccountService {
			......
}

@Component("accountServiceImpl")
@Scope("prototype")//多例
public class AccountServiceImpl2 implements IAccountService {
			 ......
}

"""



用於註入數據

@Autowired:自動按照類型註入。當使用註解註入屬性時,set方法可以省略。它只能註入其他bean類型。當有多個類型匹配時。使用要註入的對象變數名稱作為bean的id,在spring容器中查找,找到了註入成功,找不到就報錯。

@Qualifier:在自動按照類型註入的基礎上,再按照Bean的id註入。它在給欄位註入時不能單獨使用,必須和@Autowire一起使用;但是給方法參數註入時,可以單獨使用。value屬性是指定Bean的id

@Resource:直接按照Bean的id註入。它也只能註入其他Bean類型。name屬性是指定Bean的id

@Value:註入基本數據類型和String類型數據

"""

/**
 * @Author: Promsing
 * @Date: @Date: 2023/7/17 - 11:34
 * @Description: 用於創建對象
 * @version: 1.0
 *  XML配置 <bean id="accountServiceImpl" class="com.dynamic2.service.Impl.AccountServiceImpl"></bean>
 */
@Component("accountServiceImpl")
@Scope("prototype")//多例
public class AccountServiceImpl implements IAccountService {


	//註入成員變數
   /* @Autowired  自動按照類型註入--尋找類型
	@Qualifier("accountDao2")*/ //尋找id

	//以上兩個註解相加的作用等於這個
	@Resource(name = "accountDao2")
	private IAccountDao accountDao2;

	@Override
	public void saveAccount() {
		accountDao2.saveAccount();
		//System.out.println("service中的saveAccount執行了~~");
	}

}

"""



用於改變作用範圍

@Scope:指定Bean的作用範圍。value屬性指定範圍的值--singleton單例,prototype多例,request作用與web應用的請求範圍,session作用與web應用的會話範圍,global-session作用與集群環境中會話範圍


"""

@Component("accountServiceImpl")
@Scope("prototype")//多例
public class AccountServiceImpl implements IAccountService {

	......    

}

"""



和生命周期相關(瞭解)

@PostConstruct:用於指定初始化方法

@PreDestroy:用於指定銷毀方法


Spring5

@Configuration:用於指定當前類是一個spring配置類,當有容器時會從該類上載入註解。獲取容器是使用AnnotationApplicationContext(有@Configuration註解的類.class)

@ComponentScan:用於指定spring在初始化容器時要掃描的包。作用和在spring的xml配置文件找那個的

@Bean:該註解只用用在方法上,表明使用此方法創建一個對象,並且放入spring容器中

@Import:用於導入其他配置類,解耦合


"""

/**
 * @Author: Promsing
 * @Date: @Date: 2023/7/17 - 0:36
 * @Description: Spring配置類
 * @version: 1.0
 */
@Configuration//指定當前類是一個配置類
@ComponentScan("com.dynamic_transaction_anno")//用於指定spring在初始化容器時需要掃描的包
@Import({JdbcConfig.class,TransactionConfig.class})//導入其他配置類
@EnableTransactionManagement//開啟spring註解事務的支持
public class SpringConfig {

	@Bean("jdbcTemplate")
	public JdbcTemplate createJdbcTemplate(DataSource ds){
		return new JdbcTemplate(ds);
	}
	@Bean("dataSource")
	public DataSource createDataSource(){
		DriverManagerDataSource dr=new DriverManagerDataSource();
		dr.setDriverClassName("com.mysql.jdbc.Driver");//com.mysql.jdbc.Driver
		dr.setUrl("jdbc:mysql//localhost:330b/eesy");
		dr.setUsername("root");
		dr.setPassword("root");
		return dr;
	}
}

"""


Spring整合Junit

@RunWith:替代原有的運行器

@ContextConfiguration:指定配置文件的位置


"""

@RunWith(SpringJUnit4ClassRunner.class)//替代原有運行器
@ContextConfiguration(classes=SpringConfiguration.class)//指定配置類
public class AccountServiceTest {
	@Test
	public void testFindAll(){
	   //執行測試方法

	}
}

"""


從IOC容器中獲取對象

"""

/**
 * @Author: Promsing
 * @Date:@Date: 2023/7/17 - 11:22
 * @Description: 單元測試
 * @version: 1.0
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=SpringConfiguration.class)
public class AccountServiceTest {

	  @Resource(name = "accountServiceImpl")
	  private IAccountService accountService;
	@Test
	//從容器中獲取對象
	public void test(){
		//一、獲取容器
		//使用配置文件載入
		ApplicationContext ac=new ClassPathXmlApplicationContext("bean3_1.xml");
		//使用配置類載入
	  ///  ApplicationContext ac=new AnnotationConfigApplicationContext(SpringConfiguration.class);
		//二、獲取對象
		 accountService=(IAccountService)ac.getBean("accountServiceImpl",IAccountService.class);
		//三、執行方法
		List<Account> allAccounts = accountService.findAllAccount();
		for (Account allAccount : allAccounts) {
			System.out.println(allAccount);
		}
	}
}

"""



Mybatis框架

MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。


image


Mybatis簡介

官網鏈接:https://mybatis.org/mybatis-3/zh/index.html。
更加詳細的信息可以去官網查看。


MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。

要使用 MyBatis, 只需將 mybatis-x.x.x.jar 文件置於類路徑(classpath)中即可。

如果使用 Maven 來構建項目,則需將下麵的依賴代碼置於 pom.xml 文件中:


"""

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

"""


配置步驟

1.引入Mybatis的jar包

2.編寫實體類與DAO介面

3.添加主配置文件(配置mysql環境,事務類型,數據源,連接資料庫的基本信息,映射文件的位置)

4.添加DAO介面的映射文件(需要指明DAO介面的位置,為每個方法做一個映射)註:所在路徑在Resource文件夾下,目錄路徑需要DAO的層次結構一樣

5.使用mybatis框架


使用步驟(所有的xml配置已配置完畢)

1.讀取配置文件,可使用mybatis封裝的Resources類。

2.創建SQLSessionFactory工廠

3.使用工廠生產SQLsession對象

4.使用SQLSession創建DAO介面的代理對象

5.使用代理對象執行方法

6.提交事務,釋放資源


基礎數據

實體類
"""

public class User implements Serializable {

	/**
	 * Java實體類為什麼要實現Serializable介面
	 *  1.用於序列化與反序列化--一個類只有實現了Serializable介面,它的對象才能被序列化。
	 *  2.Serializable介面就是Java提供用來進行高效率的異地共用實例對象的機制,實現這個介面即可。
	 */


	private Integer id;
	private String username;
	private Date birthday;
	private String sex;
	private String address;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "User{" +
				"id=" + id +
				", username='" + username + '\'' +
				", birthday=" + birthday +
				", sex='" + sex + '\'' +
				", address='" + address + '\'' +
				'}';
	}

"""


DAO層的介面

"""

public interface IUserDao {

	/**
	 * 查詢所有
	 * @return 所有的User信息
	 */
	//@Select("select * from User")
	List<User> findAll();

	/**
	 * 保存操作
	 * @param user
	 */
	//@Insert("insert into User(username,address,sex,birthday)values()")
	void saveUser(User user);

	/**
	 * 更改操作
	 */
	void updateUser(User user);

	/**
	 * 刪除操作
	 * @param i
	 */
	void deleteUser(Integer i);

	/**
	 * 根據id查詢單個用戶
	 * @param id
	 * @return
	 */
	User findById(Integer id);

	/**
	 * 根據名稱模糊查詢
	 * @param name
	 * @return
	 */
	List<User> findByName(String name);

	/**
	 * 查詢總用戶數
	 * @return
	 */
	int findTotal();


}

"""


主配置文件

"""

<?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">
<!--myBatis的主配置文件 -->
<configuration>
	<!--配置環境-->
	<environments default="mysql">
		<!--配置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/eesy"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<!--映射文件 配置文件方式-->
	<mappers>
		<mapper resource="com/dynamic_basics/dao/IUserDao.xml"></mapper>
	</mappers>


	<!--映射文件 註解方式(使用註解就要刪除源配置文件)-->
   <!-- <mappers>
		<mapper class="com.dynamic_basics.dao.IUserDao"></mapper>
	</mappers>-->
</configuration>

"""


子配置文件

"""

<?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.dynamic_basics.dao.IUserDao">

	<!--使用配置的方式解決Java實體類與資料庫列名不一致的問題-->
	<resultMap id="userMap" type="com.dynamic_basics.domain.User">
		<!--主鍵欄位-->
		<id property="userId" column="id"></id>
		<!--非主鍵欄位-->
		<result property="userName" column="username"></result>
		<result property="userAddress" column="address"></result>
		<result property="userSex" column="sex"></result>
		<result property="userBirthday" column="birthday"></result>
	</resultMap>

	<!--查詢所有 id使用方法名-->
	<select id="findAl l" resultType="com.dynamic_basics.domain.User" resultMap="userMap">
		select * from user
	</select>

	<!--保存用戶-->
	<insert id="saveUser" parameterType="com.dynamic_basics.domain.User">
		<!--參數使用了ognl表達式-->
		insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
	</insert>

	<!--更新用戶-->
	<insert id="updateUser" parameterType="com.dynamic_basics.domain.User">
	   update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
	</insert>

	<!--刪除用戶-->
	<delete id="deleteUser" parameterType="int">
		delete from User where id=#{id}
	</delete>

	<!--根據id查詢用戶-->
	<select id="findById" parameterType="int" resultType="com.dynamic_basics.domain.User">
		select * from user where id=#{id}
	</select>

	<!--根據名稱模糊查詢-->
	<select id="findByName" resultType="com.dynamic_basics.domain.User" parameterType="String">
		select * from user where username like #{name}
	</select>

	<!--獲取用戶的總記錄數-->
	<select id="findTotal" resultType="int">
		SELECT COUNT(id) FROM `user`;
	</select>


</mapper>

"""


測試類

"""

/**
 * @Author: Promsing
 * @Date: @Date: 2023/7/17 - 8:58
 * @Description: 描述 形容
 * @version: 1.0
 */
public class MyBatisTest {

	private InputStream in;
	private SqlSession sqlSession;
	private IUserDao userDao;
	@Before
	public void init()throws Exception{
		//1.讀取配置文件  Resources是myBatis封裝的類
		in= Resources.getResourceAsStream("SqlMapConfig.xml");
		//2.創建SQLSessionFactory工廠
		//  SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
		SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
		SqlSessionFactory factory=builder.build(in);
		//3.使用工廠生產SQLSession對象
		sqlSession = factory.openSession();
		//4.使用SQLSession創建DAO介面的代理對象
		 userDao = sqlSession.getMapper(IUserDao.class);
	}
	@After
	public void destory()throws Exception{
		//6.釋放資源
		//提交事務
		sqlSession.commit();
		sqlSession.close();
		in.close();
	}
	//入門案例

	/**
	 * 查詢操作
	 */
	@Test
   public void selectUser(){

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		List<User> all = userDao.findAll();
		for (User user : all) {
			System.out.println(user);
		}
		//釋放資源-使用註解After

	}

	/**
	 * 測試保存
	 */
	@Test
	public void testSave() {
		User user=new User();
		user.setUsername("mybatis");
		user.setAddress("北京市延慶區");
		user.setSex("女");
		user.setBirthday(new Date());

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		userDao.saveUser(user);

		//釋放資源-使用註解After


	}

	/**
	 * 測試修改
	 */
	@Test
	public void testUpdate() {
		User user=new User();
		user.setId(50);
		user.setUsername("mybatis_plus");
		user.setAddress("北京市安次");
		user.setSex("男");
		user.setBirthday(new Date());

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		userDao.updateUser(user);

		//釋放資源-使用註解After


	}

	/**
	 * 測試刪除
	 */
	@Test
	public void testDelete() {

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		userDao.deleteUser(50);

		//釋放資源-使用註解After

	}
	/**
	 * 查詢單個人員信息
	 */
	@Test
	public void testFindById() {

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		User user=userDao.findById(49);
		System.out.println(user);

		//釋放資源-使用註解After

	}

	/**
	 * 模糊查詢
	 */
	@Test
	public void testFindByName() {

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		List<User> users=userDao.findByName("%王%");
	   users.forEach(i-> System.out.println(i));

		//釋放資源-使用註解After

	}

	/**
	 * 測試查詢總記錄條數
	 */
	@Test
	public void testFindTotal() {

		//初始化資源-使用註解Before

		//5.使用代理對象執行方法
		int total=userDao.findTotal();
		System.out.println(total);

		//釋放資源-使用註解After

	}


}

"""


總結

Mybatis其實使用的方法很簡單,需要多記住一些配置,當配置做好了,使用的時候很簡單。Mybatis框架將JDBC中複雜的註冊驅動、獲取連接,使用不同的服務類---
(DriverManager,Connection,Statement,ResultSet)都封裝了。其實框架的學習就是瞭解框架、熟悉配置,使用框架的階段。


配置頂層結構:


image


常用標簽設置


image


具體配置的詳解請去mybatis官網



整合思路

1.先搭建整合的環境

2.把Spring的配置搭建完成

3.再使用Spring整合SpringMVC框架

4.最後使用Spring整合Mybatis框架


設計資料庫

"""

CREATE DATABASE ssm;
USE ssm;
CREATE TABLE account ( id INT PRIMARY KEY auto_increment, NAME VARCHAR ( 20 ), money DOUBLE );

"""


搭建環境,選擇maven工程,選擇骨架webapp


image


導入依賴

"""

 <name>SSM Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<maven.compiler.source>1.7</maven.compiler.source>
	<maven.compiler.target>1.7</maven.compiler.target>
  <!--    版本鎖定-->
	<spring.version>5.0.2.RELEASE</spring.version>
	<slf4j.version>1.6.6</slf4j.version>
	<log4j.version>1.2.12</log4j.version>
	<mysql.version>5.1.6</mysql.version>
	<mybatis.version>3.4.5</mybatis.version>
  </properties>

  <dependencies>
	<dependency>
	  <groupId>junit</groupId>
	  <artifactId>junit</artifactId>
	  <version>4.11</version>
	  <scope>test</scope>
	</dependency>

	<!-- spring -->
	<dependency>
	  <groupId>org.aspectj</groupId>
	  <artifactId>aspectjweaver</artifactId>
	  <version>1.6.8</version>
	</dependency>

	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-aop</artifactId>
	  <version>5.0.2.RELEASE</version>
	</dependency>

	<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	  <version>5.0.2.RELEASE</version>
	</dependency>

	<dependency>
	<groupId>org.springframework</groupId>
	  <artifactId>spring-web</artifactId>
	  <version>5.0.2.RELEASE</version>
	</dependency>

	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-webmvc</artifactId>
	  <version>5.0.2.RELEASE</version>
	</dependency> <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>5.0.2.RELEASE</version>
  </dependency> <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>5.0.2.RELEASE</version>
  </dependency> <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>5.0.2.RELEASE</version>
  </dependency>
	<dependency>
	  <groupId>junit</groupId>
	  <artifactId>junit</artifactId>
	  <version>4.12</version>
	<scope>compile</scope>
	</dependency>
	<dependency>
	  <groupId>mysql</groupId>
	  <artifactId>mysql-connector-java</artifactId>
	  <version>${mysql.version}</version>
	</dependency>
	<dependency>
	  <groupId>javax.servlet</groupId>
	  <artifactId>servlet-api</artifactId>
	  <version>2.5</version>
	  <scope>provided</scope>
	</dependency> <dependency>
	<groupId>javax.servlet.jsp</groupId>
	<artifactId>jsp-api</artifactId>
	<version>2.0</version>
	<scope>provided</scope>
  </dependency>
	<dependency>
	  <groupId>jstl</groupId>
	  <artifactId>jstl</artifactId>
	  <version>1.2</version>
	</dependency>
	<!-- log start -->
	<dependency>
	  <groupId>log4j</groupId>
	  <artifactId>log4j</artifactId>
	  <version>${log4j.version}</version>
	</dependency>
	<dependency>
	<groupId>org.slf4j</groupId>
	  <artifactId>slf4j-api</artifactId>
	  <version>${slf4j.version}</version>
	</dependency> <dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>${slf4j.version}</version>
  </dependency>
	<!-- log end -->
	<dependency>
	  <groupId>org.mybatis</groupId>
	  <artifactId>mybatis</artifactId>
	  <version>${mybatis.version}</version>
	</dependency>
	<dependency>
	  <groupId>org.mybatis</groupId>
	  <artifactId>mybatis-spring</artifactId>
	  <version>1.3.0</version>
	</dependency>
	<dependency>
	  <groupId>c3p0</groupId>
	  <artifactId>c3p0</artifactId>
	  <version>0.9.1.2</version>
	  <type>jar</type>
	  <scope>compile</scope>
	</dependency>

  </dependencies>

"""


創建目錄結構,創建domain,controller,service,dao

web依賴於service,service依賴於dao,dao依賴於domain

image


domain

"""

package com.dynamic.domain;

import java.io.Serializable;

/**
 * @Author: Promsing
 * @Date: 2023/7/17 - 17:44
 * @Description: 實體類-Account
 * @version: 1.0
 */
public class Account implements Serializable {

	private Integer id;
	private String name;
	private Double money;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Double getMoney() {
		return money;
	}

	public void setMoney(Double money) {
		this.money = money;
	}

	@Override
	public String toString() {
		return "Account{" +
				"id=" + id +
				", name='" + name + '\'' +
				", money=" + money +
				'}';
	}
}

"""


Controller層

"""

package com.dynamic.controller;

/**
 * @Author: Promsing
 * @Date: 2023/7/17 - 17:50
 * @Description: Web層賬戶
 * @version: 1.0
 */
@Controller
@RequestMapping("/account")
public class AccountController {

	@Autowired
	private AccountService service;


	//需要加 /
	@GetMapping("/findAll")
	public String findAll(Model model){
		System.out.println("表現層查詢所有信息!");
		//調用Service方法
		List<Account> all = service.findAll();
		for (Account account : all) {
			System.out.println(account);
		}
		model.addAttribute("all",all);
		return "success";
	}

	@PostMapping("/save")
	public String save(Account account){
	  service.saveAccount(account);
		return "success";
	}

}

"""


service層

"""

public interface AccountService {
	/**
	 * 查詢所有
	 * @return
	 */
	public List<Account> findAll();

	/**
	 * 保存賬戶信息
	 * @param account
	 */
	public void saveAccount(Account account);

}

@Service("accountService")
public class AccountServiceImpl implements AccountService {

	@Autowired
	private AccountDao dao;

	@Override
	public List<Account> findAll() {
		System.out.println("業務層:查詢所有信息!");
		return  dao.findAll();
	}

	@Override
	public void saveAccount(Account account) {
		System.out.println("業務層:保存賬戶。。。");
		dao.saveAccount(account);
	}
}

"""


dao層

"""

/**
 * @Author: Promsing
 * @Date: 2023/7/17 - 17:46
 * @Description: DAO層  使用註解
 * @version: 1.0
 */
@Repository
public interface AccountDao {

	/**
	 * 查詢所有
	 * @return
	 */
	@Select("select * from account")
	public List<Account> findAll();

	/**
	 * 保存賬戶信息
	 * @param account
	 */
	@Insert("insert into account (name,money) values(#{name},#{money})")
	public void saveAccount(Account account);
}

"""


index頁面

"""

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/7/17
  Time: 19:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
	<title>首頁</title>
</head>
<body>

	<a href="account/findAll">測試查詢</a>

	<form action="account/save" method="post">
		姓名:<input type="text" name="name"><br/>
		金額:<input type="text" name="money"><br/>
		<input type="submit" value="保存"><br/>
	</form>

</body>
</html>

"""


Success頁面

"""

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/7/17
  Time: 19:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
	<title>成功頁面</title>
</head>
<body>

	<h1>成功頁面</h1>
	${all}
	<br/>
	<c:forEach items="${all}" var="account">
		${account.name}
		${account.money}
	</c:forEach>
</body>
</html>

"""


編寫Spring框架

applicationContext文件

"""

<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
		   http://www.springframework.org/schema/beans/spring-beans.xsd
		   http://www.springframework.org/schema/context
			http://www.springframework.org/schema/context/spring-context.xsd
			http://www.springframework.org/schema/aop
			http://www.springframework.org/schema/aop/spring-aop.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--    1.導入約束
		2.開啟註解掃描支持-->

<!--    開啟註解的掃描-->
	<context:component-scan base-package="com.dynamic">
<!--        配置哪些註解不掃描,進行忽略-->
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>

</beans>

"""


Spring整合SpringMVC框架

編寫SpringMVC框架

web.xml

"""

<!DOCTYPE web-app PUBLIC
		"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
		"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<display-name>Archetype Created Web Application</display-name>


	<!-- 配置前端控制器-->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--    載入springmvc.xml配置文件-->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<!--  啟動伺服器,創建該Servlet-->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!--    解決中文亂碼的過濾器-->
	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

"""


Springmvc.xml

"""

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation=" http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/context
		 http://www.springframework.org/schema/context/spring-context.xsd">

	<!--   開啟註解掃描  只掃描Controller註解-->
		<context:component-scan base-package="com.dynamic">
			<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
		</context:component-scan>
	<!--   配置視圖解析器對象     -->
	<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	<!--    過濾靜態資源-->
	<!-- 設置靜態資源不過濾 -->
	<mvc:resources location="/css/" mapping="/css/**" />
	<mvc:resources location="/images/" mapping="/images/**" />
	<mvc:resources location="/js/" mapping="/js/**" />

	<!--    開啟springMVC註解的支持-->
	<mvc:annotation-driven></mvc:annotation-driven>
</beans>

"""


整合SpringMVC框架

在Controller中能夠成功調用service對象中的方法


image

image


在web.xml中配置ContextLoaderListener監聽器。載入applicationContext.xml文件

在項目啟動的時候,就去載入applicationContext.xml的配置文件,在web.xml中配置ContextLoaderListener監聽器。(該監聽器只能載入WEB-INF目錄下的applicationContext.xml的配置文件)

"""

<!DOCTYPE web-app PUBLIC
		"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
		"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<display-name>Archetype Created Web Application</display-name>

	<!--    配置Spring的監聽器,預設只載入 WEB-INF目錄下的applicationContext.xml-->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!--    設置配置文件的路徑-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>


	<!-- 配置前端控制器-->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--    載入springmvc.xml配置文件-->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<!--  啟動伺服器,創建該Servlet-->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!--    解決中文亂碼的過濾器-->
	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

"""


Spring整合Mybatis框架

編寫Mybatis框架

在web項目中編寫SqlMapConfig.xml的配置文件,編寫核心配置文件(AccountDAO介面的方法上添加註解,編寫Sql語句)

"""

<?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>
	<!--    配置環境-->
	<environments default="mysql">
		<environment id="mysql">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql:///ssm"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<!--    引入映射配置文件 resource-->
	<!-- 使用的是註解 class -->
	<mappers>
		<!-- 該包下所有的dao介面都可以使用 -->
		<package name="com.dynamic.dao"/>
	</mappers>
</configuration>

"""


整合Mybatis框架

把SqlMapConfig.xml配置文件中的內容配置到applicationContext.xml配置文件中,同時配置Spring的聲明式事務管理

"""

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   http://www.springframework.org/schema/beans/spring-beans.xsd
	   http://www.springframework.org/schema/context
	   http://www.springframework.org/schema/context/spring-context.xsd
	   http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx.xsd">

	<!--    1.導入約束
			2.開啟註解掃描支持-->

	<!--    開啟註解的掃描-->
	<context:component-scan base-package="com.dynamic">
		<!--        配置哪些註解不掃描,進行忽略-->
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>

	<!--    spring整合Mybatis框架-->
	<!--    配置資料庫連接池-->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver"/>
		<property name="jdbcUrl" value="jdbc:mysql:///ssm"/>
		<property name="user" value="root"/>
		<property name="password" value="root"/>
	</bean>
	<!--    配置sqlSessionFactory工廠-->
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!--    配置AccountDAO介面所在的包-->
	<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.dynamic.dao"></property>
	</bean>

<!--    配置Spring框架聲明式事務管理-->
<!--    配置事務管理器-->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!--配置事務通知-->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="find*" read-only="true"></tx:method>
			<tx:method name="*" isolation="DEFAULT"></tx:method>
		</tx:attributes>
	</tx:advice>
<!--    配置AOP增強-->
	<aop:config>
		<aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.dynamic.service..ServiceImpl.*(..))"/>
	</aop:config>
</beans>

"""




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230713141300146-1450511408.png) # 1. 水平擴展 ## 1.1. 有助於提高系統的整體容量和韌性 ## 1.2. 現階段構建的幾乎所有系統,都 ...
  • 電腦編程發展至今,一共只有三個編程範式: - 結構化編程 - 面向對象編程 - 函數式編程 ### 編程範式和軟體架構的關係 - 結構化編程是各個模塊的演算法實現基礎 - 多態(面向對象編程)是跨越架構邊界的手段 - 函數式編程是規範和限制數據存放位置與訪問許可權的手段 **軟體架構的三大關註重點** ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 作為《Java擴展Nginx》系列的第七 ...
  • ## 介紹 在數據科學和分析的領域,數據能力的釋放不僅是通過提取見解的方式, 同時也要能通過有效的方式來傳達見解.這就是數據可視化發揮見解的地方. ![image](https://img2023.cnblogs.com/blog/682547/202307/682547-2023070809272 ...
  • 本文主要介紹如何通過 dockerfile-maven-plugin 插件把 Java 服務構建成 docker 鏡像;文中所使用到的軟體版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、dockerfile-maven- ...
  • 這篇技術博客探討了為什麼不推薦在頭文件中直接定義函數。它解釋了在將函數定義放在頭文件中的潛在問題,並提供了更好的替代方案。通過避免在頭文件中定義函數,讀者可以更好地管理代碼的複雜性,並提高代碼的可讀性和可維護性 ...
  • 一. 介紹 在Java中,集合是一種用於存儲和操作多個元素的容器。它更方便地操作和管理一組對象,集合類提供了比傳統的數組更強大和靈活的功能,可以動態地添加、刪除和查找元素,以及進行排序、過濾等操作。集合類有一個共同特點,就是它們只容納對象,如果想在集合中使用基本類型數據,可以使用其對應的包裝類。 集 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...