詳解SpringMVC和MyBatis框架開(kāi)發(fā)環(huán)境搭建和簡(jiǎn)單實(shí)用
1、下載SpringMVC框架架包,下載地址:
點(diǎn)擊打開(kāi)地址如圖所示,點(diǎn)擊下載即可
然后把相關(guān)的jar復(fù)制到lib下導(dǎo)入
2、MyBatis(3.4.2)下載
MyBatis中文文檔地址
下載解壓之后把jar復(fù)制到lib下導(dǎo)入,大概是這樣子的
3、jdbc連接庫(kù)還沒(méi)有下載。。。這個(gè)是5.1.41版本的。。。
解壓之后這樣子。。。
4、fastjson 阿里巴巴的json解析庫(kù)
版本是1.2.24 這個(gè)是托管到了github上面的,地址是:點(diǎn)擊進(jìn)入
5、創(chuàng)建WebProject
注意下一步有個(gè)選項(xiàng),如果不勾選,默認(rèn)是不會(huì)生成web.xml的
6、項(xiàng)目創(chuàng)建完畢,把之前的包都弄進(jìn)來(lái)。。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>CoolWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>CoolWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>classpath:application-context.xml</param-value> -->
<param-value>classpath:CoolWeb-servlet.xml</param-value>
</init-param><!-- classpath:只會(huì)到你的class路徑中查找找文件;
classpath*:不僅包含class路徑,還包括jar文件中(class路徑)進(jìn)行查找. -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 如果不配置servlet-mapping服務(wù)器就無(wú)法響應(yīng)/請(qǐng)求 -->
<servlet-mapping>
<servlet-name>CoolWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
7、在src下創(chuàng)建CoolWeb-servlet.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
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-4.3.xsd">
<!-- 開(kāi)啟SpringMVC注解 -->
<context:component-scan base-package="com.vincent.lwx"/>
<mvc:annotation-driven/>
</beans>
8、在src下編寫ApplicationContext.xml文件
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
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-4.3.xsd">
<context:component-scan base-package="com.vincent.lwx"/>
<mvc:annotation-driven/>
<!-- User實(shí)體類 -->
<bean id="user" class="com.vincent.lwx.bean.User"/>
<!-- 支持上傳文件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<!-- max size:10M -->
<property name="maxUploadSize" value="10485760"/>
</bean>
</beans>
User實(shí)體類要在這里注冊(cè)
9、在src下編寫mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置數(shù)據(jù)庫(kù)連接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 注意3306后面是數(shù)據(jù)庫(kù)名稱 autoReconnect自動(dòng)重連-->
<property name="url" value="jdbc:mysql://localhost:3306/cool?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/vincent/lwx/dao/UserMapping.xml" />
</mappers>
</configuration>
10、log4j.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
</Console>
<RollingFile name="RollingFile" fileName="D:logs/schoolmallapi.log"
filePattern="log/$${date:yyyy-MM}yimoServiceRun-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
<SizeBasedTriggeringPolicy size="15MB" />
</RollingFile>
</appenders>
<loggers>
<root level="DEBUG">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
</loggers>
<!-- 下面是打印 mybatis語(yǔ)句的配置 -->
<logger name="com.ibatis" additivity="true">
<level value="DEBUG" />
</logger>
<logger name="java.sql.Connection" additivity="true">
<level value="DEBUG" />
</logger>
<logger name="java.sql.Statement" additivity="true">
<level value="DEBUG" />
</logger>
<logger name="java.sql.PreparedStatement" additivity="true">
<level value="DEBUG" />
</logger>
<logger name="java.sql.ResultSet" additivity="true">
<level value="DEBUG" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="CONSOLE" />
<!-- <appender-ref ref="FILE" /> -->
<!-- <appender-ref ref="framework" /> -->
</root>
</configuration>
這個(gè)配置貌似有點(diǎn)問(wèn)題,雖然不影響使用,不過(guò)我也沒(méi)有去深入研究還,最近還要準(zhǔn)備面試Android哎。。。
現(xiàn)在差不多是這樣子咯
11、環(huán)境搭建差不多了,現(xiàn)在開(kāi)始擼代碼,寫一個(gè)注冊(cè)的動(dòng)能吧
簡(jiǎn)歷一個(gè)實(shí)體類User.Java
package com.vincent.lwx.bean;
import java.io.Serializable;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @Title: User.java
* @Package com.vincent.lwx.bean
* @Description: TODO(用一句話描述該文件做什么)
* @author Vincent
* @date 2017年3月3日 下午6:36:58
* @version V1.0
*/
public class User implements Serializable{
/**
* 序列化id
*/
private static final long serialVersionUID = -6375697395831845246L;
/**
* 用戶id
*/
private @Getter String user_id;
/**
* 用戶手機(jī)號(hào)碼
*/
private @Setter@Getter String phone;
/**
* 密碼
*/
private @Setter@Getter String password;
/**
* 用戶名
*/
private @Setter@Getter String nickname;
/**
* 用戶頭像地址
*/
private @Setter@Getter String head;
/**
* 性別
*/
private @Setter@Getter String sex;
/**
* 生日
*/
private @Setter@Getter String birthday;
/**
* 生活狀態(tài)(發(fā)表的說(shuō)說(shuō))
*/
private @Setter@Getter String live_status;
}
編寫MyBatis的實(shí)體類映射xml文件,就寫個(gè)UserMapping.xml好了,表示為用戶相關(guā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 namespace="com.vincent.lwx.mapping.UserMapping">
<!-- 根據(jù)手機(jī)號(hào)碼查詢用戶是否存在 -->
<select id="selectUser" parameterType="String" resultType="com.vincent.lwx.bean.User">
select * from user where phone = #{phone}
</select>
</mapper>
我這里只寫了一個(gè),別的還沒(méi)寫,注冊(cè)之前先查詢一下手機(jī)號(hào)碼是否已注冊(cè)。。
注意這里的id 不能重復(fù),要具有唯一性。parameterType是傳入的參數(shù)類型,這里是String類型的phone,如果要傳入多個(gè)參數(shù)可以使用User對(duì)象,或者M(jìn)ap,resultType返回結(jié)果類型,我這里是直接返回一個(gè)User對(duì)象,之前用jdbc直接連接數(shù)據(jù)庫(kù),返回的東西還要手動(dòng)封裝,這個(gè)快多了。。。
創(chuàng)建MyBatisUtils.java類,用來(lái)從數(shù)據(jù)庫(kù)獲取SqlSession對(duì)象的,SqlSession執(zhí)行sql語(yǔ)句,和jdbc的Statement對(duì)象差不多感覺(jué)。。。也可能我的感覺(jué)是錯(cuò)的,哈哈,還沒(méi)看源碼。。。
package com.vincent.lwx.db;
import java.io.IOException;
import java.io.Reader;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.vincent.lwx.util.EatTimerTask;
/**
* @Title: MyBatisUtils.java
* @Package com.vincent.julie.config
* @Description: TODO(��һ�仰�������ļ���ʲô)
* @author Vincent
* @date 2017��2��18�� ����12:05:35
* @version V1.0
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
private static SqlSession sqlSession;
private static long timeInterval;//上一次運(yùn)行的時(shí)間
private static TimerTask task =null;
static {
String resource = "mybatis.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
System.out.println(e.getMessage());
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
/**
*
* @return
*/
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
/**
* ��ȡsqlSession����
* @return
*/
public static SqlSession getSqlSession(){
if (task != null){
task.cancel(); //將原任務(wù)從隊(duì)列中移除
}
task = new EatTimerTask();
timeInterval = System.currentTimeMillis();
//間隔�?1小時(shí)
long period = 1000 * 60 * 60;
//測(cè)試時(shí)間每分鐘一�?
//period = 1000 * 60;
Timer timer = new Timer();
timer.schedule(task, timeInterval, period);
if(sqlSessionFactory == null){
sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
}
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
這里有個(gè)計(jì)時(shí)器,我發(fā)現(xiàn)Tomcat運(yùn)行一段時(shí)間之后(聽(tīng)說(shuō)是10小時(shí))如果沒(méi)有連接數(shù)據(jù)庫(kù),會(huì)出現(xiàn)異常。。
好,現(xiàn)在來(lái)寫UserController.java類,處理客戶端的請(qǐng)求
package com.vincent.lwx.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.vincent.lwx.bean.ServiceStatus;
import com.vincent.lwx.bean.User;
import com.vincent.lwx.db.MyBatisUtils;
import com.vincent.lwx.util.ResponseUtils;
/**
* @Title: UserControl.java
* @Package com.vincent.lwx.mapping
* @Description: TODO(��һ�仰�������ļ���ʲô)
* @author Vincent
* @date 2017��3��3�� ����6:28:37
* @version V1.0
*/
@Controller
public class UserController {
private static final Logger logger = LogManager.getLogger(UserController.class);
/**
* 注冊(cè)
* @param phone
* @param password
* @param request
* @param response
*/
@RequestMapping(value = "register", method = RequestMethod.POST)
public void registerUser(@RequestParam("phone")String phone,@RequestParam("password")String password,HttpServletRequest request,HttpServletResponse response){
if(hasUserPhone(phone)){
//用戶已存在,無(wú)須再次注冊(cè)
ResponseUtils.renderJsonDataFail(response, ServiceStatus.RUNTIME_EXCEPTION, "該號(hào)碼已被注冊(cè)");
return;
}
}
/**
* 根據(jù)手機(jī)號(hào)碼查詢用戶是否存在
* @param phone
* @return
*/
public boolean hasUserPhone(String phone){
/**sql 語(yǔ)句 完整的包名類名和方法id,*/
String sql = "com.vincent.lwx.mapping.UserMapping.selectUser";
SqlSession session = MyBatisUtils.getSqlSession();
/**返回一個(gè)User對(duì)象*/
User user = session.selectOne(sql, phone);
if(user!=null){
//用戶已存在
return true;
}else{
//用戶不存在
return false;
}
}
}
10、最后一步,讓Tomcat跑起來(lái),好吧,下載Tomcat、點(diǎn)擊下載
這個(gè)版本是Tomcat9.0的
如果不會(huì)部署的話可以看這里的 部署Tomcat
11、東西寫完了不叫最后一步,最后一步應(yīng)該自己測(cè)試一下,google瀏覽器自帶Postman檢查一下接口的正確性
因?yàn)槲业臄?shù)據(jù)庫(kù)我已經(jīng)自己注冊(cè)了,所以提示是正確的,另外附上user表的sql語(yǔ)句:
CREATE DETABASE cool; //創(chuàng)建數(shù)據(jù)庫(kù)并指定字符編碼集 CREATE DATABASE cool DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; //創(chuàng)建表 create table user( user_id int(10) not null primary key auto_increment, phone varchar(11) not null, password varchar(16) not null, nickname varchar(36), head varchar(50), sex varchar(3), birthday varchar(10) default '1992-01-01', live_status varchar(255) )engine = InnoDB default charset=utf8; //限制最小id=10000 alter table user AUTO_INCREMENT=10000;設(shè)置已經(jīng)存在的表的默認(rèn)值 //限制手機(jī)號(hào)碼唯一性 alter table user add unique(phone); 字段值唯一性約束 insert into user(phone,password) values( '18696855784', '555555');
Github地址進(jìn)入
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程
這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
基于Java反射的map自動(dòng)裝配JavaBean工具類設(shè)計(jì)示例代碼
這篇文章主要給大家介紹了關(guān)于基于Java反射的map自動(dòng)裝配JavaBean工具類設(shè)計(jì)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-10-10
Springboot服務(wù)實(shí)現(xiàn)執(zhí)行SQL腳本文件
這篇文章主要介紹了Springboot服務(wù)實(shí)現(xiàn)執(zhí)行SQL腳本文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼
本篇文章主要介紹了Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
java設(shè)計(jì)模式:建造者模式之生產(chǎn)線
這篇文章主要介紹了Java設(shè)計(jì)模式之建造者模式,結(jié)合具體實(shí)例形式分析了建造者模式的概念、原理、實(shí)現(xiàn)方法與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2021-08-08
Spring中@EnableScheduling注解的工作原理詳解
這篇文章主要介紹了Spring中@EnableScheduling注解的工作原理詳解,@EnableScheduling是 Spring Framework 提供的一個(gè)注解,用于啟用Spring的定時(shí)任務(wù)(Scheduling)功能,需要的朋友可以參考下2024-01-01
SpringBoot優(yōu)雅捕捉異常的兩種方法小結(jié)
SpringBoot框架對(duì)異常的處理提供了幾種很強(qiáng)大的方法,我們可以通過(guò)@ControllerAdvice和@ExceptionHandler注解實(shí)現(xiàn)全局異常的處理,下面就來(lái)介紹一下這兩種方法的實(shí)現(xiàn),感興趣的可以了解一下2024-08-08
詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤
在Web應(yīng)用程序領(lǐng)域,有效的請(qǐng)求監(jiān)控和可追溯性對(duì)于維護(hù)系統(tǒng)完整性和診斷問(wèn)題至關(guān)重要,SpringBoot是一種用于構(gòu)建Java應(yīng)用程序的流行框架,在本文中,我們探討了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以參考下2023-11-11
SpringBoot?分模塊開(kāi)發(fā)的操作方法
這篇文章主要介紹了SpringBoot?分模塊開(kāi)發(fā)的操作方法,通過(guò)在原項(xiàng)目新增一個(gè)maven模塊,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

