SpringBoot系列之三_一个完整的MVC案例
这一节让我们来做一个完整的案例。
我们将使用MyBatis作为ORM框架,并以非常简单的方式来使用MyBatis,完成一个完整的MVC案例。
此案例承接上一节,请先搭建好上一节案例。
一、数据库准备
我们使用MySQL作为数据存储,使用开发工具创建一个数据库demo,并在demo数据库中创建一张表user,创建语句如下:
- CREATE TABLE `user` (
- `id` int(11) NOT NULL COMMENT '主键',
- `name` varchar(64) NOT NULL COMMENT '姓名',
- `birthday` date DEFAULT NULL COMMENT '生日',
- `address` varchar(256) DEFAULT NULL COMMENT '地址',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在这个表中写入一些测试数据,例如:
二、编写项目代码
1. 修改pom文件,添加两个依赖项:
(1) mysql驱动包
(2) mybatis支持(MyBatis公司为spring boot编写了一个mybatis-spring-boot-starter项目)
pom文件内容如下:
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
2. 修改application.properties,内容如下:
- spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=utf8
- spring.datasource.username=root
- spring.datasource.password=root
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- mybatis.typeAliasesPackage=com.hanhf.demo.domain
此处配置了数据库URL、用户名、密码、驱动类,另外,还配置了实体类所在的包。
3. 具体代码:
先来看一下项目的包结构:
这里,创建了三个包:
web:存放控制器
service:存放业务逻辑层对象
domain:存放实体类和DAO类
(1) User类(很普通的POJO类):
- public class User {
- private int id;
- private String name;
- private Date birthday;
- private String address;
- // 构造方法
- public User() {
- super();
- }
- public User(int id, String name, Date birthday, String address) {
- super();
- this.id = id;
- this.name = name;
- this.birthday = birthday;
- this.address = address;
- }
- // getter & setter
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
(2) UserMapper接口:
MyBatis需要你为DAO提供一个接口,它称之为Mapper。然后具体的SQL语句可以注解在接口上,也可以单独保存在一个xml文件中,我这里使用的是前者,即将SQL语句注解在接口上。
代码如下:
- @Mapper
- public interface UserMapper {
- @Select("select * from user")
- List<User> selectAll();
- }
增、删、改、查各有一个注解。接口前的@Mapper注解表示它是一个Mapper。
(3) UserService类
代码如下:
- @Service
- public class UserService {
- @Autowired
- private UserMapper userMapperp;
- public List<User> listAll() {
- return userMapperp.selectAll();
- }
- }
业务逻辑层的类需要加上@Service注解。
(4) UserController类
代码如下:
- @RequestMapping("user")
- @RestController
- public class UserController {
- @Autowired
- private UserService userService;
- @GetMapping("/list/all")
- public List<User> listAll() {
- return userService.listAll();
- }
- }
控制器类前可以加@Controller注解,也可以加@RestController注解,如果是前者,则控制器方法返回的是一个页面的代称,如果是后者,则控制器方法返回的是JSON数据。
@RequestMapping用于指定请求的URL,它还有几个子注解:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping,分别表示请求的GET、POST、PUT、DELETE等操作,这是为RESTFUL应用设置的新注解。
如果类上有@RequestMapper("user"),方法上又有@GetMapping("/list/all"),则要访问listAll()方法,请求的URL应为:http://localhost:8080/user/list/all。
(5) 主应用程序
最后,在主应用程序的类前加一个注解:
@MapperScan("com.hanhf.demo.domain")
这个注解表示扫描MyBatis的Mapper接口所在的包,找出所有加了@Mapper注解的接口。
代码如下:
- @SpringBootApplication
- @MapperScan("com.hanhf.demo.domain")
- public class DemoApplication {
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- }
至此,项目完成。
启动程序,并输入网址:http://localhost:8080/user/list/all,出现网页:
最新文章
- JAVA的POI操作Excel
- 深入理解ANGULARUI路由_UI-ROUTER
- Abot爬虫和visjs
- 工作随笔——tar命令批量解压
- java 内部类定义在局部时需要注意的情况
- .net错误处理机制(转)
- 被动式Telnet研究及实现(解决内外网远程维护的困难)-part A
- 【读书笔记与思考】《python数据分析与挖掘实战》-张良均
- VS 使用vs2017自带的诊断工具(Diagnostic Tools)诊断程序的内存问题
- C++ 创建快捷方式
- React之todo-list
- Vuejs(14)——在v-for中,利用index来对第一项添加class
- 利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe)
- Linux 文件系统介绍
- vue 去掉元素之间空格 preserveWhitespace
- Android Studio xcode单步调试 WebRTC Android &; iOS
- express项目创建步骤
- Python3基础 父,子类普通方法重名 子类方法覆盖父类方法
- 【caffe】用训练好的imagenet模型分类图像
- bzoj 2665: [cqoi2012]编号
热门文章
- js 的运算
- 利用CodeDom 动态执行条件表达式
- SQL查询,关联查询的区别 (LEFT JOIN 、LEFT OUTER JOIN、INNER JOIN)
- 小tips:JS数值之间的转换,JS中最大的Number是多少?,JS == 与 === 的区别
- python+selenium+PhantomJS爬取网页动态加载内容
- Android开发利器之Data Binding Compiler V2 —— 搭建Android MVVM完全体的基础
- uni-app 子组件如何调用父组件的方法
- Android 与Java 进程退出 killProcess与System.exit
- HDU 2086 A1 = ? (找规律推导公式 + 水题)(Java版)
- 用户不在 sudoers 文件中,此事将被报告