前言:
除了mybatis 不是零配置,有些還是有xml的配置文件在里面的。
注解是Spring的一個構建的一個重要手段,減少寫配置文件,下面解釋一下一些要用到的注解:
@Configuration 作用於類上面,聲明當前類是一個配置類(相當於一個Spring的xml文件)
@ComponentScan(“xxx”) 作用於類上面,自動掃描xxx包名下所有使用@Service、@Component、@Repository和@Controller的類,並注冊為Bean
@Bean 作用與類和方法上,相當於Spring配置文件bean節點
@EnableWebMvc 作用於類,開啟一些默認配置,如一些ViewResolver或者MessageConverter
@RequestMapping 作用於類、方法,配置URL和方法之間的映射
@RequestBody 作用於參數前,允許request的參數在request體中,而不是在直接鏈接在地址后面
@ResponseBody 作用於返回值、方法上,支持將返回值放在response體中,而不是返回一個頁面。
@RequestParam 作用於參數前,將form的對應name值映射到當前參數中。
從一開始。
先搭建一個 Spring + Spring MVC 的web 項目
創建項目。
然后 點擊 Finish 完成 創建項目。
這里開始配置我們的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?> <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.oukele.ssm</groupId> <artifactId>MyDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>MyDemo 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.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!--spring 的依賴管理 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.3.RELEASE</version> </dependency> <!--spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.3.RELEASE</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!--jstl--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project>
導入靜態資源(jsp 頁面 ........)。
在WEB-INF中,直接粘貼boostrap的標准資源,並新建一個views文件夾,將index.jsp拉進去,將自己寫的Login.jsp(想要示例的登陸頁面的話在本文的最下面有個github地址可以去下載)復制進去,效果如下(順便刪了web.xml):
目錄結構如下:
在 main 目錄 下 新建 java 文件夾 (注意 java 文件夾 的顏色哦 )
在 java 文件夾 新建幾個包 比如 --> com --> oukele --> config (先這樣吧。)
開始配置 SpringWebConfig類 (類似 spring-web.xml):
新建一個SpringWebConfig 類,實現 WebMvcConfigurer接口,並配置一些必要的方法。
package com.oukele.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @Configuration//聲明當前類是一個配置類 類似於 ( spring-web.xml ) @EnableWebMvc//若無此注解 WebMvcConfigurer 接口 將無效 @ComponentScan("com.oukele")//自動掃描spring注解 比如@Service、@Component、@Repository和@Controller的類,並注冊為Bean public class SpringWebConfig implements WebMvcConfigurer { //添加一個ViewResolver 解析 view @Bean//相當於Spring配置文件bean節點 public InternalResourceViewResolver getViewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class); viewResolver.setExposeContextBeansAsAttributes(true); return viewResolver; } //注冊靜態資源,比如(css,js,.....) @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/css/"); registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/"); registry.addResourceHandler("/fonts/**").addResourceLocations("/WEB-INF/fonts/"); } //根目錄直接跳轉到登錄頁面 Login.jsp @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("Login"); } }
與xml配置文件 對比:
注意 @ComponentScan("com.oukele")這樣寫,掃描oukele 目錄所有使用spring注解的類,這里我有點粗心大意了。^_^ 有點小尷尬了。
配置WebInit類 ( 相當於 web.xml 文件 ):
新建一個WebInit類 實現WebApplicationIntializer接口實現方法,方法的內容如:
package com.oukele.config; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; public class WebInit implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringWebConfig.class);//注冊springWebConfig類 ctx.setServletContext(servletContext); ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));//將 配置類 添加到DispatcherServlet上下文中 dynamic.addMapping("/"); dynamic.setLoadOnStartup(1); } }
與 web.xml 文件 對比:
添加Controller:
新建一個LoginController類
在 oukele 這層包 下 再新建 一個 web 包出來 將 LoginController類放到里面去。
新建一個LoginController 類
package com.oukele.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class LoginController { @RequestMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("pwd") String pwd) { String forword = null; if (username.equals("oukele") && pwd.equals("oukele")) { forword = "index";//登錄成功跳轉到index.jsp } else { System.out.println("no such user"); forword = "Login";//登錄失敗跳轉到Login.jsp繼續登錄操作 } return forword; } }
到這里 我們試試能否啟動這個web項目吧。
添加到Tomcat 運行:
這里 默認顯示的就是登陸頁面。
運行結果:
Spring + Spring MVC 的另一種寫法 (零配置文件):https://www.cnblogs.com/oukele/p/10127915.html
開始整合Mybatis.
重新配置一下pom.xml文件

<?xml version="1.0" encoding="UTF-8"?> <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.oukele.ssm</groupId> <artifactId>MyDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>MyDemo 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.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!--spring 的依賴管理 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.3.RELEASE</version> <scope>test</scope> </dependency> <!--spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.3.RELEASE</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <!--MariaDB 數據庫驅動 --> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.3.0</version> </dependency> <!--c3p0 數據庫連接池--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!--jstl--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!--單元測試--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
在oukele 這層包下 新建 entity 、dao 包
在entity包新建一個Student類

package com.oukele.entity; public class Student { //學號 private String number; //姓名 private String name; //性別 private String sex; //年齡 private int age; //地址 private String address; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Student{" + "number='" + number + '\'' + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + ", address='" + address + '\'' + '}'; } }
在dao包新建一個StudentMapper接口
package com.oukele.dao; import com.oukele.entity.Student; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; public interface StudentMapper { //使用xml配置文件 Student getUserById(String number); //不使用配置文件使用注解 @Select("Select * from student where number = #{number}") Student getUserByIdForAnnotation(String number); @Select("Select * from student where name = #{student.name} and age = #{student.age}") Student checkUser(@Param("student") Student student); }
在main 目錄下 新建一個resources 的文件夾。(注意看 resources文件夾的圖標)
在resources中新建一個 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> <settings> <!-- 使用jdbc的getGeneratedKeys獲取數據庫自增主鍵值 --> <setting name="useGeneratedKeys" value="true" /> <!-- 使用列別名替換列名 默認:true --> <setting name="useColumnLabel" value="true" /> <!-- 開啟駝峰命名轉換:Table {create_time} -> Entity {createTime} --> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> </configuration>
在 resources中新建一個mapper文件夾,此文件夾中新建一個StudentMapper.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 namespace="com.oukele.dao.StudentMapper"> <select id="getUserById" resultType="com.oukele.entity.Student"> select * from student where number =#{number} </select> </mapper>
開始配置SpringDaoConfig類。
在config包新建SpringDaoConfig類
package com.oukele.config; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import javax.sql.DataSource; import java.beans.PropertyVetoException; @Configuration//聲明當前類是一個配置類 public class SpringDaoConfig { @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setJdbcUrl("jdbc:mariadb://localhost:3306/test"); dataSource.setDriverClass("org.mariadb.jdbc.Driver"); dataSource.setUser("oukele"); dataSource.setPassword("oukele"); return dataSource; } /*@Bean(name = "sqlSessionFactory") 如果不寫就默認方法的名字*/ @Bean("sqlSessionFactory") public SqlSessionFactoryBean sqlSessionFactory() throws PropertyVetoException { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); ClassPathResource resource = new ClassPathResource("mapper/StudentMapper.xml"); sqlSessionFactory.setTypeAliasesPackage("com.oukele.entity"); sqlSessionFactory.setMapperLocations(new Resource[]{resource}); sqlSessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml")); sqlSessionFactory.setDataSource(this.dataSource()); return sqlSessionFactory; } @Bean public MapperScannerConfigurer getMapperScannerConfigurer() { MapperScannerConfigurer configurer = new MapperScannerConfigurer(); configurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); configurer.setBasePackage("com.oukele.dao"); return configurer; } }
與xml文件對比:
到這里基本完成了ssm配置,我們來測試一下是否能使用。
在main包新建一個test文件夾(注意test文件夾的顏色),在test文件夾 中: --> com --> oukele --> StudentTest測試類
StudentTest類:

package com.oukele; import com.oukele.config.SpringDaoConfig; import com.oukele.dao.StudentMapper; import com.oukele.entity.Student; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration(classes = {SpringDaoConfig.class}) public class StudentTest { @Autowired private StudentMapper studentMapper; @Test public void getIdInfo(){ Student student = studentMapper.getUserById("A101"); System.out.println(student); } @Test public void getName(){ Student student = studentMapper.getUserByIdForAnnotation("B211"); System.out.println(student); } @Test public void getNameAndSex(){ Student student = new Student(); student.setName("小蘭"); student.setAge(18); Student result = studentMapper.checkUser(student); System.out.println(result); } }
測試結果:
1 Student{number='D331', name='小蘭', sex='女', age=18, address='海南某個地方'} 2 Student{number='B211', name='小明', sex='男', age=19, address='廣西某個地方'} 3 Student{number='A101', name='小華', sex='男', age=18, address='廣東某個地方'}
我們到Logincontroller去使用。
修改一下 index.jsp頁面:

1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>主頁面</title> 5 </head> 6 <body> 7 <h2>Hello World!</h2> 8 歡迎登錄,${student.name} !!!! 9 </body> 10 </html>
運行結果:
測試數據:
create table student( number varchar(10) not null, name varchar(10) not null, sex varchar(4) not null, age int , address varchar(100) )default charset = utf8; insert into student values ("A101","小華","男",18,"廣東某個地方"), ("B211","小明","男",19,"廣西某個地方"), ("C111","小花","女",17,"珠海某個地方"), ("D331","小蘭","女",18,"海南某個地方")
本次演示代碼示例下載地址:https://github.com/oukele/Spring-SpringMVC-Mybatis