??
目錄
SSM整合?
創建項目
導入依賴
配置文件
SpringConfig
MyBatisConfig
JdbcConfig
ServletConfig
SpringMvcConfig
功能模塊
測試
業務層接口測試
控制層測試
? ? SSM是Java Web開發中常用的三個主流框架組合的縮寫,分別對應Spring、Spring MVC、MyBatis。這三個框架協同工作,能夠完成企業級應用開發中的業務邏輯、Web層交互及數據持久化任務。
- Spring:作為SSM的基礎框架,主要負責依賴注入(DI)和面向切面編程(AOP)。它簡化了Java程序對數據庫的訪問,提高了數據庫的訪問效率和穩定性。
- Spring MVC:實際上是Spring框架的擴展,屬于Spring框架的一部分。它主要負責Web層的交互,使得開發Web應用變得更加簡單和高效。
- MyBatis:是一個支持普通SQL查詢、存儲過程和高級映射的持久層框架。它消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索,使得開發者可以更加專注于業務邏輯的實現。
SSM整合?
創建項目
? ? 首先新建一個項目,詳情請見:SpringMVC概述以及入門案例-CSDN博客,新建項目后再main下方新建test目錄用作測試:
? ????
導入依賴
?ssm整合需要導入一些依賴包,具體如下:
- spring-webmvc
- spring-jdbc
- spring-contest
- mybatis
- mybatis-spring
- mysql-connector-java
- druid
- junit
- javax.servlet-api
- jackson-databind
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.18</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
配置文件
? ? 接下來在java包下面新建軟件包config,用于存放各種配置來,分別是:SpringConfig、MyBatisConfig、JdbcConfig、ServletConfig、SpringMvcConfig。以及resources目錄下的db.properities。
SpringConfig
? ? 該配置類的作用是:作為Spring配置文件,掃描指定的包,并且導入加載其他需要的配置文件:
@Configuration
@ComponentScan({"com.cc.service"})
@PropertySource(("db.properties")) //加載外部屬性文件
@Import({JdbcConfig.class, MyBatisConfig.class}) //導入其他配置類
public class SpringConfig {
}
MyBatisConfig
MyBatis的XML方式:
@Configuration public class MyBatisXmlConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 關鍵配置:顯式指定XML映射文件位置factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 關鍵配置:要求接口與XML文件關聯(默認行為)msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;} }
?
注解配置方式:
@Configuration public class MyBatisAnnotationConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 關鍵配置:啟用注解掃描模式msc.setAnnotationClass(Mapper.class);msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;} }
import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {//配置了一個MyBatis的SqlSessionFactory,指定了使用的數據源和類型別名包路徑。@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.cc.domain");return factoryBean;}//通過Spring配置了一個MapperScannerConfigurer,指定了需要掃描的Mapper接口所在的包路徑。//這樣,MyBatis就可以根據這些配置自動地找到并注冊Mapper接口@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");return msc;} }
使用注解方式的關鍵代碼是setAnnotationClass(Mapper.class),但是只要在Mapper接口的方法上使用了@Select等注解,即時未配置也會隱式支持注解。
JdbcConfig
配置數據源,并且交給spring容器管理。
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class JdbcConfig {//注入值@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}
ServletConfig
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer{@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
SpringMvcConfig
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.cc.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
功能模塊
首先依據準備的表結構創建對應的POJO類:
public class User {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}
接下來就是關于數據庫操作的Dao:
public interface UserDao {@Insert("insert into user(name,age) values(#{name},#{age})")public void save(User user);@Update("update user set name=#{name} where id = #{id}")public void update(User user);@Delete("delete from user where id =#{id}")public void delete(Integer id);@Select("select * from user where id =#{id}")public User getById(Integer id);@Select("select * from user")public List<User> getAll();
}
以及Dao對應的Service接口和實現類
public interface UserService {/*** 保存* @param user* @return*/public boolean save(User user);/*** 修改* @param user* @return*/public boolean update(User user);/**\* 根據id刪除* @param id* @return*/public boolean delete(Integer id);/*** 根據id查詢* @param id* @return*/public User getById(Integer id);/*** 查詢所有* @return*/public List<User> getAll();
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic boolean save(User user) {userDao.save(user);return true;}@Overridepublic boolean update(User user) {userDao.update(user);return true;}@Overridepublic boolean delete(Integer id) {userDao.delete(id);return true;}@Overridepublic User getById(Integer id) {return userDao.getById(id);}@Overridepublic List<User> getAll() {return userDao.getAll();}
}
剩下就是REST風格的Controller控制類:
@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}@PutMappingpublic boolean update(@RequestBody User user) {return userService.update(user);}@DeleteMapping("/{id}")public boolean delete(@PathVariable Integer id) {return userService.delete(id);}@GetMapping("/{id}")public User getById(@PathVariable Integer id) {return userService.getById(id);}@GetMappingpublic List<User> getAll() {return userService.getAll();}
}
測試
? ?在開發中通常要進行兩種測試,分別是業務接口測試,第二個是表現層的接口測試。
業務層接口測試
在test目錄下新建測試包:
?
@RunWith(SpringJUnit4ClassRunner.class) //使用Spring的測試運行器來運行測試。
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetById(){User user = userService.getById(2);System.out.println(user);}@Testpublic void testGetAll(){List<User> user = userService.getAll();System.out.println(user);}}
?
能夠查詢到數據,說明業務層沒問題,接下來測試控制層,啟動Tomcat:
控制層測試
在postman進行測試:
查詢所有:
??
?
?新增:
?