笔记
脱离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>
View Code
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 */@Overrideprotected 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%2B8user=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;@Beanpublic DataSource dataSource() { DruidDataSource source = new DruidDataSource(); source.setUsername(username); source.setPassword(password); source.setUrl(url); source.setDriverClassName(driver);return source; }/** * SqlSessionFactoryBean * @auther * @return */@Beanpublic 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 */@Beanpublic 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 @ToStringpublic 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层
@Mapperpublic interface DeptMapper extends BaseMapper<Dept> { }
10.最后是controller层
@Controllerpublic class DeptController { @Autowiredprivate 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