题目
根据图书的id在数据库中查询图书,使用三层架构去书写spring-mvc、spring、mybatis的纯注解的整合。
第一步:创建数据库并添加数据
use mybatis;
create table tb_book(
id int primary key auto_increment,
`name` varchar(50) not null,
press varchar(50),
author varchar(50)
)ENGINE=InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
insert into tb_book values (null,'java EE 企业级应用开发教程','人民邮电出版社','黑马程序员');
第二步:在pom.xml文件中所需的依赖
<dependencies>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--dao-->
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!--mybatis驱动-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.8</version>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!--测试和整合-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
第三步:java代码的实现
在chenzihao.demo01.pojo包下创建Book实体类
package chenzihao.demo01.pojo;
public class Book {
private Integer id;
private String name;
private String press;
private String author;
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", press=" + press + ", author=" + author + "]";
}
//添加实体类中属性的getter和setter方法或者使用lombok自动生成
}
在chenzihao.demo01.dao包下创建BookMapper接口
package chenzihao.demo01.dao;
import org.apache.ibatis.annotations.Select;
import chenzihao.demo01.pojo.Book;
public interface BookMapper {
@Select("select * from tb_book where id=#{id}")
public Book findBookById(Integer id);
}
在chenzihao.demo01.service包下创建BookService接口和其实现类
BookService接口提供了一个方法——根据书籍id查询书籍的信息
package chenzihao.demo01.service;
import chenzihao.demo01.pojo.Book;
public interface BookService {
public Book findBookById(Integer id);
}
下面是BookService接口的实现类,其中使用了依赖注入的方式创建了BookMapper对象,并调用了查询方法
package chenzihao.demo01.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import chenzihao.demo01.dao.BookMapper;
import chenzihao.demo01.pojo.Book;
@Service("bookService")
public class BookServiceImpl implements BookService {
@Resource(name="bookMapper")
private BookMapper bookMapper;
public Book findBookById(Integer id) {
// TODO Auto-generated method stub
return bookMapper.findBookById(id);
}
}
在chenzihao.demo01.controller包下创建BookController类
package chenzihao.demo01.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import chenzihao.demo01.pojo.Book;
import chenzihao.demo01.service.BookService;
@Controller
public class BookController {
@Resource(name="bookService")
private BookService bookService;
@RequestMapping("/book")
public ModelAndView findbook(Integer id) {
Book book = bookService.findBookById(id);
ModelAndView mav=new ModelAndView();
mav.setViewName("book.jsp");
mav.addObject("book",book);
return mav;
}
}
请在webapp下提供book.jsp页面
在book.jsp页面中可以清楚的展示在数据库中拿到的内容
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<table border="1" width="600px" cellspacing="0" align="center" >
<tr align="center">
<th>图书id</th>
<th>图书名称</th>
<th>出版社</th>
<th>作者</th>
</tr>
<tr align="center">
<td>${book.id}</td>
<td>${book.name}</td>
<td>${book.press}</td>
<td>${book.author}</td>
</tr>
</table>
</body>
</html>
第四步:使用注解代替xml文件配置
在chenzihao.demo01.config包下创建SpringConfig、SpringMvcConfig、MybatisConfig、ServletContainerInitConfig四个配置类
首先是SpringMvcConfig,它对应着Controller层,其中@Configuration代表着这个类是配置类;@ComponentScan表示扫描包;@EnableWebMvc表示开启注解驱动
package chenzihao.demo01.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan("chenzihao.demo01.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
其次是SpringConfig,它对应着Service层,@import表示引入其他类
package chenzihao.demo01.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@ComponentScan("chenzihao.demo01.service")
@Import({MybatisConfig.class})
public class SpringConfig {
}
接下来是MyBatis类,它对应在Dao层,和数据库打交道,必不可少的便是数据源的配置;
@MapperScan表示扫描mapper对象交给spring管理
package chenzihao.demo01.config;
import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.druid.pool.DruidDataSource;
@PropertySource("classpath:db.properties")
@MapperScan("chenzihao.demo01.dao")
public class MybatisConfig {
@Value("${mysql.url}")
private String url;
@Value("${mysql.username}")
private String username;
@Value("${mysql.password}")
private String password;
@Value("${mysql.driver}")
private String driver;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource=new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driver);
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setTypeAliasesPackage("chenzihao.demo01.pojo");
return sqlSessionFactory;
}
/*
* @Bean public MapperScannerConfigurer mapperScannerConfigurer() {
* MapperScannerConfigurer mapperScannerConfigurer=new
* MapperScannerConfigurer();
* mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean")
* ; mapperScannerConfigurer.setBasePackage("chenzihao.demo01.dao");
*
* return mapperScannerConfigurer; }
*/
}
不要忘记添加db.properties数据库的一些信息
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&\characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=1234
最后便是ServletContainerInitConfig类,去分别找到springConfig和SpringMvcConfig类
package chenzihao.demo01.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return new Class[] {SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return new Class[] {SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return new String[] {"/"};
}
}