笔记
脱离xml,用java类配置ssm
整合Spring+SpringMVC+MyBatis-plus
用mybatis的童鞋可参考
https://gitee.com/chimenga/ssm_configured_by_javaconfig
1.创建项目导入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.1.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.项目目录总览
3.在config包下创建三个配置类SpringConfig,SpringMvcConfig,Webconfig
4.编写WebConfig类,继承AbstractAnnotationConfigDispatcherServletInitializer
/**
*
*
* Servlet容器启动会扫描,当前应用里面每一个jar包的
*
* ServletContainerInitializer实现类
*
* 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer
* 文件的内容就是ServletContainer Initializer实现类的全类名:
*
* 总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面
*
* 指定的实现类,启动并运行这个实现类的方法;
*
* 容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类,子接口等)传递过来;
*/
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
//获取根容器的配置类; (Spring的配置文件) 父容器;
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
//获取web容器的配置类(SpringMVC配置文件)子 容器:
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
//获取DispatcherServlet的映射信息
// : 拦截所有请求 (包括静态资源(xx.js,xx.png) ),但是不包括* .jsp;
// : 拦截所有请求;连* .jsp页面都拦截; jsp页面是tomcat的jsp引擎解析的;
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
*
* 如果我们的Filter是映射到DispatcherServlet上,还有一种方法来注册它到Servlet容器中。重
* 载AbstractAnnotationConfigDispatcherServletInitializer的getServlet-Filters()方法
*
* 在这里没有必要声明它的映射路径,getServletFilters()方法返回的所有Filter都会映射到DispatcherServlet上
*
* @return
*/
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("utf-8");
encodingFilter.setForceEncoding(true);
// 将页面普通的post请求转为指定的delete或者put请求
// FormContentFilter formContentFilter = new FormContentFilter();
return new Filter[]{ encodingFilter };
}
}
5.配置数数据库连接池
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost/db01?useSSL=false&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
user=root
password=
spring.typeAliasesPackage=com.gg.pojo
#spring.mapperLocations=classpath:mapper/*.xml
6.编写SpringConfig类
@Configuration
@ComponentScan(basePackages = "com.gg")
@PropertySource("classpath:db.properties")
@EnableTransactionManagement(proxyTargetClass = true) //声明式事务
@MapperScan(basePackages = "com.gg.mapper")
public class SpringConfig {
/**
* 数据源
*关于spring配置文件中读取${username}为系统当前用户名的问题
* 在spring的配置文件中,加载数据库的properties文件,利用${username} 获取数据库用户名时,会得到系统当前的用户名;
*
* 这是因为 spring默认会优先加载系统环境变量,此时获取到的username的值实际上指的是当前计算机的用户名。而不是properties配置文件中指定的username的值。
*
* 解决方法:
*
* 1.修改配置文件中key的值,避免与系统当前用户的username冲突;
*/
@Value("${url}")
private String url;
@Value("${user}")
private String username;
@Value("${password}")
private String password;
@Value("${driver}")
private String driver;
@Value("${spring.typeAliasesPackage}")
private String typeAliasesPackage;
// @Value("${spring.mapperLocations}")
// private String mapperLocations;
@Bean
public DataSource dataSource() {
DruidDataSource source = new DruidDataSource();
source.setUsername(username);
source.setPassword(password);
source.setUrl(url);
source.setDriverClassName(driver);
return source;
}
/**
* SqlSessionFactoryBean
* @auther
* @return
*/
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean bean=new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource());
bean.setTypeAliasesPackage(typeAliasesPackage);
// PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// bean.setMapperLocations(resolver.getResources(mapperLocations));
//全局设置
MybatisConfiguration config = new MybatisConfiguration();
//org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
/*开启二级缓存*/
// config.setCacheEnabled(true);
/*下划线转驼峰*/
config.setMapUnderscoreToCamelCase(true);
/*打印sql语句*/
config.setLogImpl(StdOutImpl.class);
bean.setConfiguration(config);
return bean.getObject();
}
// /**
// * MapperScannerConfigurer
// */
// @Bean
// public MapperScannerConfigurer mapperScannerConfigurer() {
// MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
// mapperScannerConfigurer.setBasePackage("com.lw.mapper");
// return mapperScannerConfigurer;
// }
/**
* Cannot enhance @Configuration bean definition 'xxx' since its singleton instance has been created too early.
* 报错的原因是因为MapperScannerConfigurer是BeanFactoryPostProcessor的一个实现导致的,最简单的解决方式是使用@MapperScan注解代替MapperScannerConfigurer的bean配置。
* @return
*/
// 事务管理器 对mybatis操作数据库事务控制,spring使用jdbc的事务控制类
@Bean(name = "transactionManager")
public DataSourceTransactionManager dataSourceTransactionManager() {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource());
return dataSourceTransactionManager;
}
/**
*
* @return
*/
@Bean(name = "transactionInterceptor")
public TransactionInterceptor interceptor() {
TransactionInterceptor interceptor = new TransactionInterceptor();
interceptor.setTransactionManager(dataSourceTransactionManager());
Properties transactionAttributes = new Properties();
transactionAttributes.setProperty("save*", "PROPAGATION_REQUIRED");
transactionAttributes.setProperty("del*", "PROPAGATION_REQUIRED");
transactionAttributes.setProperty("update*", "PROPAGATION_REQUIRED");
transactionAttributes.setProperty("get*", "PROPAGATION_REQUIRED,readOnly");
transactionAttributes.setProperty("find*", "PROPAGATION_REQUIRED,readOnly");
transactionAttributes.setProperty("*", "PROPAGATION_REQUIRED");
interceptor.setTransactionAttributes(transactionAttributes);
return interceptor;
}
/**
* 文件上传下载
* 设置这个必须要先导入 commons-fileupload
*/
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(10485760000L); // 最大上传
multipartResolver.setDefaultEncoding("utf-8"); // 默认编码
multipartResolver.setMaxInMemorySize(40960); // 缓存
return multipartResolver;
}
}
7.编写SpringMvcConfig类继承WebMvcConfigurer
@Configuration
@EnableWebMvc // 开启springmvc定制功能 相当于 <mvc:annotation-driven/>
@ComponentScan(basePackages = "com.gg")
public class SpringMvcConfig implements WebMvcConfigurer {
/**
* 视图解析器
* @param registry
*/
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
/**
* 静态资源
* 相当于 <mvc:default-servlet-handler/> 将SpringMVC处理不了的请求交给tomcat;静态资源
* @param configurer
*/
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 拦截器
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
}
}
环境配置好了配置tomcat测试一下
访问:http://localhost:8080/
环境配置成功
继续干
8.编写实体类(使用插件lombok)
@Data
@ToString
public class Dept{
@TableId(type = IdType.AUTO)
private Long deptno;
@TableField(value = "dname")
private String dname;
@TableField(value = "db_source")
private String dbSource;
}
9.使用mybatis-plus配置dao层
@Mapper
public interface DeptMapper extends BaseMapper<Dept> {
}
10.最后是controller层
@Controller
public class DeptController {
@Autowired
private DeptMapper deptMapper;
@GetMapping("/test")
public String hello(Model model) {
model.addAttribute("user","测试");
// return "success";
// 视图跳转
return "test";
}
@GetMapping("/toTest")
public String toTest(){
// 重定向
return "redirect:/test";
}
@GetMapping("/dept/{deptno}")
public String getDeptByID(@PathVariable("deptno") Long deptno,Model model) {
Dept dept = deptMapper.selectById(deptno);
model.addAttribute("dept",dept);
return "deptView";
}
}
11.deptView.jsp部分内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>dept</title>
</head>
<body>
<h2 align="center">
${dept.getDeptno()}<br/>
${dept.getDname()}<br/>
${dept.getDbSource()}
</h2>
</body>
</html>
12.访问接口地址:http://localhost:8080/dept/2
© 著作权归作者所有
发表评论