目录
5.在resources下编写数据库配置文件jdbc.properties
6.第六步:mybatis整合spring的配置类:mybatisConfig
8.编写SpringMVC子容器SpringMvcConfig
9.编写DispatcherServlet,拦截所有请求,并整合父容器和子容器。
10.如果有前端代码,需要将前端相关资源放行,需要编写SpringMvcSupport类,放行相关资源
11.编写三个实体类,Book:书籍信息实体,Code:与前端约定的状态码,Result:封装结果集返回给前端的JSON对象,如果没有前端,后面两个类可以不用写。
1.第一步:构建一个maven工程。
2.第二步:将maven工程添加Web工程
这里我们可以用一个小的插件,
就可以轻松通过右键,选项里面的将maven工程轻松添加web工程了。
3.第三步:导包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<spring.version>5.2.10.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>//统一包的版本
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</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.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
4. 构建项目结构
5.在resources下编写数据库配置文件jdbc.properties
这是mysql版本是8.0的情况,5.0配置有一点点不一样。
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_db?serverTimezone=UTC
jdbc.username=root
jdbc.password=root
6.编写jdbc读取配置文件类jdbcConfig
/**
* 数据库配置类
*/
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
//注入简单类型,从属性文件中读取
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driverClassName}")
private String driverClassName;
/*
创建数据源,放在容器中
*/
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
/**
* 创建事务管理器
*/
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
6.第六步:mybatis整合spring的配置类:mybatisConfig
/**
* mybatis整合spring的配置类
* 1.创建会话工厂对象
* 2.生成dao包下所有接口的代理对象
*/
public class MybatisConfig {
/**
* 创建会话工厂对象
* 数据源从容器中按类型匹配的方式传入
*/
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//设置数据源
factoryBean.setDataSource(dataSource);
//定义实体类别名所在的包
factoryBean.setTypeAliasesPackage("com.itheima.domain");
//创建一个mybatis的配置类,注:不要导错包
Configuration configuration = new Configuration();
//映射下划线为驼峰命名法
configuration.setMapUnderscoreToCamelCase(true);
//显示sql语句
configuration.setLogImpl(StdOutImpl.class);
//设置到工厂中
factoryBean.setConfiguration(configuration);
return factoryBean;
}
/**
* 生成dao包下所有接口的代理对象
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
//指定dao接口所在包
configurer.setBasePackage("com.itheima.dao");
return configurer;
}
}
7.编写Spring父容器SpringConfig
@Configuration//将此类设置为配置类
@ComponentScan("com.itheima.service") //只扫描业务层
@Import({JdbcConfig.class, MybatisConfig.class}) //导入其它的配置类
@EnableTransactionManagement //开启事务
public class SpringConfig {
}
8.编写SpringMVC子容器SpringMvcConfig
@ComponentScan({"com.itheima.controller","com.itheima.config","com.itheima.exception"})
@EnableWebMvc//此注解的作用是,开启对JSON对象的支持
public class SpringMvcConfig {
}
9.编写DispatcherServlet,拦截所有请求,并整合父容器和子容器。
/**
* tomcat启动的时候加载的类,创建DispatcherServlet,拦截所有的请求
*/
public class ServletConfigInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//读取Spring的配置类,创建父容器
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SpringConfig.class};
}
//读取SpringMvc的配置类,创建子容器
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
//拦截所有的地址
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//post请求汉字乱码
@Override
protected Filter[] getServletFilters() {
return new Filter[] {new CharacterEncodingFilter("utf-8")};
}
}
10.如果有前端代码,需要将前端相关资源放行,需要编写SpringMvcSupport类,放行相关资源
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
/**
静态资源放行
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//地址是/css目录,访问/css/下面资源
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
做好以上这些配置后,就可以编写下面的:控制器,实体类,业务层,异常拦截相关类了
11.编写三个实体类,Book:书籍信息实体,Code:与前端约定的状态码,Result:封装结果集返回给前端的JSON对象,如果没有前端,后面两个类可以不用写。
Book类:导入小辣椒后,@Data就是生成相应的get,set以及构造器。这样使用注解,可以让代码编写方便,看着清爽,可读性更好。
@Data
public class Book {
private Integer id;
private String type; //书籍类型
private String name; //书名
private String description; //描述
}
Code类:具体来说是一个接口,接口里面定义的变量都为静态变量,调用起来不用创建对象,使用方便。这个状态码只是用来与前端约定的。
public interface Code {
Integer SAVE_OK = 20011;
Integer DELETE_OK = 20021;
Integer UPDATE_OK = 20031;
Integer GET_OK = 20041;
Integer SAVE_ERR = 20010;
Integer DELETE_ERR = 20020;
Integer UPDATE_ERR = 20030;
Integer GET_ERR = 20040;
//异常编码
Integer SYSTEM_ERR = 50001;
Integer SYSTEM_TIMEOUT_ERR = 50002;
Integer SYSTEM_UNKNOWN_ERR = 59999;
Integer BUSINESS_ERR = 60002;
}
Result类:封装结果集,返回给前端用的。
/**
* 封装结果对象
*/
@Data
public class Result {
private Integer code; //操作编码
private Object data; //返回数据
private String msg; //返回的信息
public Result() {
}
public Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Result(Object data, String msg) {
this.data = data;
this.msg = msg;
}
public Result(Integer code, Object data, String msg) {
this.code = code;
this.data = data;
this.msg = msg;
}
}
12.编写dao层,实现因为使用纯注解模式开发,使用只需要编写dao层接口即可。在方法上编写SQL语句:
/**
* 数据层
*/
public interface BookDao {
/**
* 查询所有的书籍
*/
@Select("select * from tbl_book")
List<Book> findAll();
/**
* 添加书籍
*/
@Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
int save(Book book);
/**
* 修改
*/
@Update("update tbl_book set type=#{type},name=#{name},description=#{description} where id=#{id}")
int update(Book book);
/**
* 删除
*/
@Delete("delete from tbl_book where id=#{id}")
int delete(Integer id);
/**
* 通过id查询1本书
*/
@Select("select * from tbl_book where id=#{id}")
Book findById(Integer id);
}
13.然后编写其service层的接口和实现类
/**
* 业务层
*/
public interface BookService {
/**
* 查询所有书籍
*/
List<Book> findAll();
/**
* 添加书籍
* @param book
* @return
*/
boolean save(Book book);
/**
* 修改书籍
*/
boolean update(Book book);
/**
* 删除书籍
* @param id
* @return
*/
boolean delete(Integer id);
/**
* 通过id查询一本书籍
* @param id
* @return
*/
Book findById(Integer id);
}
实现类:
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
/**
* 查询所有书籍
*/
@Override
public List<Book> findAll() {
return bookDao.findAll();
}
/**
* 添加书籍
* @param book
* @return
*/
@Override
public boolean save(Book book) {
//大于0则表示添加成功
return bookDao.save(book) > 0;
}
/**
* 修改书籍
* @param book
*/
@Override
public boolean update(Book book) {
return bookDao.update(book) > 0;
}
/**
* 删除书籍
* @param id
* @return
*/
@Override
public boolean delete(Integer id) {
return bookDao.delete(id) > 0;
}
@Override
public Book findById(Integer id) {
if (id < 1) {
throw new BusinessException(Code.BUSINESS_ERR, "请不要使用你的技术挑战我的耐性");
}
return bookDao.findById(id);
}
}
13.完成上面步骤后,就可以编写控制层了(与前端交互)。
@RestController
@RequestMapping("books")
public class BookController {
@Autowired
private BookService bookService;
//查询
@GetMapping
public Result find() {
System.out.println("查询书籍");
//System.out.println(1 / 0);
List<Book> books = bookService.findAll();
if (books == null) {
return new Result(Code.GET_ERR, "查询失败");
} else {
return new Result(Code.GET_OK, books, "查询成功");
}
}
//添加
@PostMapping
public Result save(@RequestBody Book book) {
boolean success = bookService.save(book);
String msg = success ? "添加成功" : "添加失败";
Integer code = success ? Code.SAVE_OK : Code.SAVE_ERR;
return new Result(code, success, msg);
}
//修改
@PutMapping
public Result update(@RequestBody Book book) {
boolean success = bookService.update(book);
String msg = success ? "修改成功" : "修改失败";
Integer code = success ? Code.UPDATE_OK : Code.UPDATE_ERR;
return new Result(code, success, msg);
}
//删除
@DeleteMapping("{id}")
public Result delete(@PathVariable Integer id) {
boolean success = bookService.delete(id);
String msg = success ? "删除成功" : "删除失败";
Integer code = success ? Code.DELETE_OK : Code.DELETE_ERR;
return new Result(code, success, msg);
}
//通过id查询1本书
@GetMapping("{id}")
public Result findById(@PathVariable Integer id) {
Book book = bookService.findById(id);
String msg = book != null ? "查询成功" : "查询失败";
Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
return new Result(code, book, msg);
}
}