文章目录
以查询数据库ssm中的user表的所有属性为例
环境准备
导入依赖
spring-jdbc、spring-tx、mysql-connector-java、HikariCP、mybatis、mybatis-spring、junit、spring-context、spring-aspects、aspectjrt、aspectjweaver、spring-test、lombok、logback-classic、spring-webmvc、spring-web、servlet-api(provided)、jsp-api(provided)、fastjson
数据库属性配置文件:db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=root
日志文件:logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--禁止logback默认显示的日志信息-->
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<!--定义一个带颜色的控制台输出日志PATTERN-->
<property name="CONSOLE_LOG_PATTERN"
value="时间:%date{yyyy-MM-dd HH:mm:ss} 级别: %highlight(%-5level) 进程: %boldYellow(%thread) 类: %boldGreen(%logger) 信息: %msg%n"/>
<!--定义一个不带颜色的文件日志输出格式,因为文件不能带颜色-->
<property name="ERRINFOFILE_LOG_PATTERN" value="时间:%date{yyyy-MM-dd HH:mm:ss} 级别: %-5level 进程: %thread 类: %logger 信息: %msg%n"/>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
${CONSOLE_LOG_PATTERN}
</pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="consoleLog" />
</root>
</configuration>
持久层
实体类User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private int age;
}
UserviceMapper接口
@Component
public interface UserMapper {
public List<User> getAll();
}
UserMapper.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.offcn.mapper.UserMapper">
<select id="getAll" resultType="user">
select * from user
</select>
</mapper>
服务层
IUserService接口
public interface IUserService {
public List<User> getAll();
}
UserService实现类
@Service
public class UserService implements IUserService {
@Autowired
private UserMapper mapper;
@Override
public List<User> getAll() {
return mapper.getAll();
}
}
表现层
UserController控制类
@Controller
public class UserController {
@Autowired
public IUserService service;
@RequestMapping("/test")
public String test(){
List<User> all = service.getAll();
for (User user:all) {
System.out.println(user);
}
return "index";
}
}
Spring配置类
数据库连接池信息配置类
@PropertySource("classpath:db.properties")
@Component
@Data
public class DataSourcesConfig {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driverClassName}")
private String driverNmae;
}
将db.properties的内容放到类中。
Spring配置类
//扫描mapper接口
@MapperScan("com.offcn.mapper")
//spring组件的扫描(排除被springmvc容器@Controller注解的类)
@ComponentScan(basePackages = "com.offcn",
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = EnableWebMvc.class)})
@Configuration
@EnableTransactionManagement
public class Config {
//配置数据库连接池
@Bean
public DataSource dataSource(DataSourcesConfig config){
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(config.getUrl());
hikariDataSource.setUsername(config.getUsername());
hikariDataSource.setPassword(config.getPassword());
hikariDataSource.setDriverClassName(config.getDriverNmae());
return hikariDataSource;
}
//配置sqlSessionFactory
@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver path = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(path.getResources("classpath*:com/offcn/mapper/**/*.xml"));
sqlSessionFactoryBean.setTypeAliasesPackage("com.offcn.bean");
return sqlSessionFactoryBean.getObject();
}
}
SpringMvc配置类
@Configuration
@EnableWebMvc
//spring现在有两个容器,一个是Springmvc的容器,
// 一个是spring的ioc容器,需要使用@Import将两个注解关联
@Import(Config.class)
//相当于<aop:annotation-driven/>
@ComponentScan(basePackages = "com.offcn.controller") //相当于<context:component-scan base-package="com.offcn.controller"/>
public class MyWebConfig implements WebMvcConfigurer {
//配置视图解析器:前缀、后缀
@Bean
public InternalResourceViewResolver internalResourceViewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
//<!--servlet容器能处理的映射,springMvc不拦截-->
//<mvc:default-servlet-handler/>
//需要实现WebMvcConfigurer重写其中的configureDefaultServletHandling方法
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//自定义异常处理器
@Bean
public MyHandlerExceptionResolver myHandlerExceptionResolver(){
MyHandlerExceptionResolver myHandlerExceptionResolver = new MyHandlerExceptionResolver();
return myHandlerExceptionResolver;
}
}
在SpringMvc中使用@Import(Config.class)导入Spring配置类(关联)
web.xml(服务器启动时调用)
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
//导入springmvc配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
异常处理,跳转错误界面
public class MyHandlerExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg",e.getMessage());
e.printStackTrace();
modelAndView.setViewName("error");
return modelAndView;
}
}
发生异常时,跳到/error.jsp界面