看黑马视频搭建的简易ssm
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wst</groupId>
<artifactId>Springmvc_08_ssm</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.26</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.26</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
</dependencies>
<build>
</build>
</project>
创建jdbc.properties,用来存放链接数据库的驱动文件、用户名、密码、数据库名以及相对应的时区设置
jdbc.driverClassName = com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=123456
下面是SpringMVC的整合配置:
JdbcConfig.java:
public class JdbcConfig {
@Value("${jdbc.driverClassName}")
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;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager ds = new DataSourceTransactionManager();
ds.setDataSource(dataSource);
return ds;
}
}
MyBatisConfig.java:
public class MyBatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setTypeAliasesPackage("com.wst.domain");
return factoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.wst.dao");
return msc;
}
}
ServletConfig.java:
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; //拦截所有的请求
}
SpringConfig.java:
@Configuration //设置这个类为spring的配置类
@ComponentScan({"com.wst.service"}) //加载项目中的service(bean)类
@PropertySource("classpath:jdbc.properties") //加载配置文件名 里面是访问数据库的库名、用户名以及密码
@Import({JdbcConfig.class,MyBatisConfig.class}) //加载这两个配置类
@EnableTransactionManagement
public class SpringConfig {
}
SpringMvcConfig.java:
@Configuration
@ComponentScan("com.wst.controller")
@EnableWebMvc //处理Json数据转换
public class SpringMvcConfig {
}
接下来就是创建pojo类在domain里创建Book类,将书本的属性添加到类中,添加get,set方法。
public class Book {
private Integer id;
private String type;
private String name;
private String description;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", type='" + type + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
在dao层创建接口映射 将sql语句注入上去:
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 void save(Book book);
@Update("update tbl_book set type=#{type},name=#{name},description=#{description} where id=#{id}")
public void update(Book book);
@Delete(("delete from tbl_book where id = #{id}"))
public void delete(Integer id);
@Select("select * from tbl_book where id = #{id}")
public Book getById(Integer id);
@Select("select * from tbl_book ")
public List<Book> getAll();
}
创建service接口,与上方方法类似,可以更改方法名使其见名知意在类目上方添加Transactional(事务处理):
@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<Book> getAll();
}
创建好service的接口后,再创建service该接口的接口实现类,并在里面加载dao层的Bookdao方法,根据不同方法,调用相关方法,不要忘记在类上方注上Service,让spring扫描到:
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao; //使用接口需要先注入
@Override
public boolean save(Book book) {
bookDao.save(book);
return true;
}
@Override
public boolean update(Book book) {
bookDao.update(book);
return true;
}
@Override
public boolean delete(Integer id) {
bookDao.delete(id);
return true;
}
@Override
public Book getById(Integer id) {
Book book = bookDao.getById(id);
return book;
}
@Override
public List<Book> getAll() {
List<Book> list = bookDao.getAll();
return list;
}
}
再在controller层上调用service的Bookservice接口,并调用里面的方法,在类上注上RequestMapping("/books")使得网页路径在这是进入controller内:
@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) { //在json里面获取
boolean flag = bookService.update(book);
return new Result(flag? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) { //@PathVariable 或缺的路径数据
boolean flag = bookService.delete(id);
return new Result(flag? Code.DELETE_OK:Code.DELETE_ERR,flag);
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) { //@PathVariable 或缺的路径数据
int i =10/0;
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 List<Book> getAll() {
List<Book> list = bookService.getAll();
return list;
}
}
构造好简单的框架后,使用测试类测试一下是否成功,在测试类中加载Service层的接口方法,在类上方加载spring:
@RunWith(SpringJUnit4ClassRunner.class) //集成测试,使得spring加载到测试类中
@ContextConfiguration(classes = SpringConfig.class) //上下文 加载spring配置类
public class BookServiceTest {
@Autowired
private BookService bookService;
@Test
public void testGetById(){
Book byId = bookService.getById(2);
System.out.println(byId);
}
@Test
public void TestGetAll(){
List<Book> all = bookService.getAll();
for (int i = 0; i <all.size(); i++) {
System.out.println(all.get(i).getId());
System.out.println(all.get(i).getName());
System.out.println(all.get(i).getType());
System.out.println(all.get(i).getDescription());
}
}
}
测试结构展示:
查询id为2的book数据:
查询所有的book数据:
使用Postman软件来测试是否成功: