目录
(1)创建web工程,添加依赖和插件
- <dependencies>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.10.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>5.2.10.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>5.2.10.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>3.5.6version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>1.3.0version>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>5.1.47version>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>1.1.16version>
- dependency>
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.12version>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.9.0version>
- dependency>
- dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.tomcat.mavengroupId>
- <artifactId>tomcat7-maven-pluginartifactId>
- <version>2.1version>
- <configuration>
- <port>80port>
- <path>/path>
- configuration>
- plugin>
- plugins>
- build>
创建数据库和表
- -- 创建ssm_db数据库
- CREATE DATABASE IF NOT EXISTS ssm_db CHARACTER SET utf8;
-
- -- 使用ssm_db数据库
- USE ssm_db;
-
- -- 创建tbl_book表
- CREATE TABLE tbl_book(
- id INT PRIMARY KEY AUTO_INCREMENT, -- 图书编号
- TYPE VARCHAR(100), -- 图书类型
- NAME VARCHAR(100), -- 图书名称
- description VARCHAR(100) -- 图书描述
- );
- -- 添加初始化数据
- INSERT INTO tbl_book VALUES(NULL,'计算机理论','Spring实战 第5版','Spring入门经典教材,深入理解Spring原理技术内幕');
- INSERT INTO tbl_book VALUES(NULL,'计算机理论','Spring 5核心原理与30个类手写实战','十年沉淀之作,手写Spring精华思想');
- INSERT INTO tbl_book VALUES(NULL,'计算机理论','Spring 5设计模式','深入Spring源码剖析,Spring源码蕴含的10大设计模式');
- INSERT INTO tbl_book VALUES(NULL,'市场营销','直播就该这么做:主播高效沟通实战指南','李子柒、李佳琦、薇娅成长为网红的秘密都在书中');
- INSERT INTO tbl_book VALUES(NULL,'市场营销','直播销讲实战一本通','和秋叶一起学系列网络营销书籍');
- INSERT INTO tbl_book VALUES(NULL,'市场营销','直播带货:淘宝、天猫直播从新手到高手','一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');
jdbc.properties属性文件
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/ssm_db
- jdbc.username=root
- jdbc.password=root
JdbcConfig配置类
- 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;
- //配置连接池
- @Bean
- public DataSource dataSource(){
- DruidDataSource dataSource = new DruidDataSource();
- dataSource.setDriverClassName(driver);
- dataSource.setUrl(url);
- dataSource.setUsername(username);
- dataSource.setPassword(password);
- return dataSource;
- }
- //Spring事务管理需要的平台事务管理器对象
- @Bean
- public PlatformTransactionManager transactionManager(DataSource dataSource){
- DataSourceTransactionManager ds = new DataSourceTransactionManager();
- ds.setDataSource(dataSource);
- return ds;
- }
- }
MybatisConfig配置类
- public class MyBatisConfig {
- @Bean
- public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
- SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
- factoryBean.setDataSource(dataSource);
- factoryBean.setTypeAliasesPackage("com.itheima.domain");
- return factoryBean;
- }
-
- @Bean
- public MapperScannerConfigurer mapperScannerConfigurer(){
- MapperScannerConfigurer msc = new MapperScannerConfigurer();
- msc.setBasePackage("com.itheima.dao");
- return msc;
- }
- }
SpringConfig配置类
- @Configuration
- @ComponentScan({"com.csdn.service"})
- @PropertySource("classpath:jdbc.properties")
- @Import({JdbcConfig.class,MyBatisConfig.class})
- @EnableTransactionManagement //开启Spring事务管理
- public class SpringConfig {
- }
(3)Spring整合SpringMVC
SpringMvcConfig配置类
- @Configuration
- @ComponentScan("com.csdn.controller")
- @EnableWebMvc
- public class SpringMvcConfig {
- }
ServletConfig配置类,加载SpringMvcConfig和SpringConfig配置类
- public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
- protected Class>[] getRootConfigClasses() {
- return new Class[]{SpringConfig.class};
- }
-
- protected Class>[] getServletConfigClasses() {
- return new Class[]{SpringMvcConfig.class};
- }
-
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- }
(1)数据层(BookDao)
Book实体类
- public class Book {
- private Integer id;
- private String type;
- private String name;
- private String description;
- //需要补充getter、setter、toString()方法
- }
BookDao接口
- public interface BookDao {
-
- //@Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
- @Insert("insert into tbl_book (type,name,description) values(#{type},#{name},#{description})")
- public int save(Book book); //返回值表示影响的行数
-
- @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
- public int update(Book book);
-
- @Delete("delete from tbl_book where id = #{id}")
- public int delete(Integer id);
-
- @Select("select * from tbl_book where id = #{id}")
- public Book getById(Integer id);
-
- @Select("select * from tbl_book")
- public List
getAll(); - }
(2)业务层开发(BookService/BookServiceImpl)
BookService接口
- @Transactional //表示所有方法进行事务管理
- public interface BookService {
-
- /**
- * 保存
- * @param book
- * @return
- */
- public boolean save(Book book);
-
- /**
- * 修改
- * @param book
- * @return
- */
- public boolean update(Book book);
-
- /**
- * 按id删除
- * @param id
- * @return
- */
- public boolean delete(Integer id);
-
- /**
- * 按id查询
- * @param id
- * @return
- */
- public Book getById(Integer id);
-
- /**
- * 查询全部
- * @return
- */
- public List
getAll(); - }
BookServiceImpl实现类
- @Service
- public class BookServiceImpl implements BookService {
- @Autowired
- private BookDao bookDao;
-
- public boolean save(Book book) {
- bookDao.save(book);
- return true;
- }
-
- public boolean update(Book book) {
- bookDao.update(book);
- return true;
- }
-
- public boolean delete(Integer id) {
- bookDao.delete(id);
- return true;
- }
-
- public Book getById(Integer id) {
- return bookDao.getById(id);
- }
-
- public List
getAll() { - return bookDao.getAll();
- }
- }
(3)表现层开发(BookController)
- @RestController
- @RequestMapping("/books")
- public class BookController {
-
- @Autowired
- private BookService bookService;
-
- @PostMapping
- public boolean save(@RequestBody Book book) {
- return bookService.save(book);
- }
-
- @PutMapping
- public boolean update(@RequestBody Book book) {
- return bookService.update(book);
- }
-
- @DeleteMapping("/{id}")
- public boolean delete(@PathVariable Integer id) {
- return bookService.delete(id);
- }
-
- @GetMapping("/{id}")
- public Book getById(@PathVariable Integer id) {
- return bookService.getById(id);
- }
-
- @GetMapping
- public List
getAll() { - return bookService.getAll();
- }
- }
(1)Spring整合Junit测试业务层方法
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(classes = SpringConfig.class)
- public class BookServiceTest {
-
- @Autowired
- private BookService bookService;
-
- @Test
- public void testGetById(){
- Book book = bookService.getById(1);
- System.out.println(book);
- }
-
- @Test
- public void testGetAll(){
- List
all = bookService.getAll(); - System.out.println(all);
- }
- }
(2)测试
问题:表现层增删改方法返回true或者false表示是否成功,getById()方法返回一个json对象,getAll()方法返回一个json对象数组,这里就出现了三种格式的响应结果,极其不利于前端解析。
解决:我们需要统一响应结果的格式
(1)Result类封装响应结果
- public class Result {
- //描述统一格式中的数据
- private Object data;
- //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
- private Integer code;
- //描述统一格式中的消息,可选属性
- private String msg;
-
- public Result() {
- }
- public Result(Integer code,Object data) {
- this.data = data;
- this.code = code;
- }
- public Result(Integer code, Object data, String msg) {
- this.data = data;
- this.code = code;
- this.msg = msg;
- }
- //需要补充getter、setter、toString()方法
- }
(2)Code类封装响应码
- //状态码
- public class Code {
- public static final Integer SAVE_OK = 20011;
- public static final Integer DELETE_OK = 20021;
- public static final Integer UPDATE_OK = 20031;
- public static final Integer GET_OK = 20041;
-
- public static final Integer SAVE_ERR = 20010;
- public static final Integer DELETE_ERR = 20020;
- public static final Integer UPDATE_ERR = 20030;
- public static final Integer GET_ERR = 20040;
- }
- @RestController
- @RequestMapping("/books")
- public class BookController {
-
- @Autowired
- private BookService bookService;
-
- @PostMapping
- public Result save(@RequestBody Book book) {
- boolean flag = bookService.save(book);
- return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
- }
-
- @PutMapping
- public Result update(@RequestBody Book book) {
- boolean flag = bookService.update(book);
- return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
- }
-
- @DeleteMapping("/{id}")
- public Result delete(@PathVariable Integer id) {
- boolean flag = bookService.delete(id);
- return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
- }
-
- @GetMapping("/{id}")
- public Result getById(@PathVariable Integer id) {
- Book book = bookService.getById(id);
- Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
- String msg = book != null ? "" : "数据查询失败,请重试!";
- return new Result(code,book,msg);
- }
-
- @GetMapping
- public Result getAll() {
- List
bookList = bookService.getAll(); - Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
- String msg = bookList != null ? "" : "数据查询失败,请重试!";
- return new Result(code,bookList,msg);
- }
- }