框架入门
在现代Java Web开发中,框架的使用大大简化了开发过程,提高了开发效率。本章节将介绍Spring、MyBatis和Spring MVC这三个核心框架的基础知识和使用方法。
Spring框架
Spring简介
Spring是一个轻量级的开源Java框架,为Java应用程序提供了全面的基础设施支持。它的核心特性包括:
- 控制反转(IoC):将对象的创建和管理交给Spring容器
- 面向切面编程(AOP):将横切关注点(如日志、安全)与业务逻辑分离
- 事务管理:简化数据库事务的管理
- 集成其他框架:提供与其他流行框架的集成支持
Spring核心概念
控制反转(IoC)
IoC是Spring的核心思想之一,它将对象的创建和管理从代码中解耦出来,交给Spring容器来处理。
传统的对象创建方式:
java
public class UserService {
private UserDao userDao = new UserDaoImpl();
}使用Spring IoC的方式:
java
public class UserService {
private UserDao userDao;
// 通过构造函数注入
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}依赖注入(DI)
依赖注入是实现IoC的一种方式,Spring通过DI将对象所需的依赖自动注入到对象中。
依赖注入的三种方式:
- 构造函数注入
- Setter方法注入
- 字段注入
Spring配置
Spring可以通过XML配置或注解配置来管理Bean。
注解配置示例
- 启用组件扫描:
java
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}- 定义Bean:
java
@Component
public class UserDao {
// UserDao实现
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
// 业务逻辑
}
@Controller
public class UserController {
@Autowired
private UserService userService;
// 控制器逻辑
}- 启动Spring应用:
java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}MyBatis框架
MyBatis简介
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
MyBatis核心组件
- SqlSessionFactory:创建SqlSession的工厂
- SqlSession:执行SQL语句的会话
- Mapper接口:定义数据访问方法的接口
- XML映射文件:定义SQL语句和结果映射
MyBatis配置
MyBatis配置文件
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/myapp"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>Mapper XML文件
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
</resultMap>
<select id="findById" parameterType="int" resultMap="UserResultMap">
SELECT id, username, email FROM users WHERE id = #{id}
</select>
<select id="findAll" resultMap="UserResultMap">
SELECT id, username, email FROM users
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO users (username, email, password)
VALUES (#{username}, #{email}, #{password})
</insert>
<update id="update" parameterType="com.example.model.User">
UPDATE users
SET username = #{username}, email = #{email}
WHERE id = #{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>Mapper接口
java
public interface UserMapper {
User findById(int id);
List<User> findAll();
void insert(User user);
void update(User user);
void delete(int id);
}MyBatis注解方式
MyBatis也支持使用注解来定义SQL语句:
java
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(int id);
@Select("SELECT * FROM users")
List<User> findAll();
@Insert("INSERT INTO users (username, email, password) VALUES (#{username}, #{email}, #{password})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insert(User user);
@Update("UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}")
void update(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
void delete(int id);
}Spring MVC框架
Spring MVC简介
Spring MVC是Spring框架的一个模块,用于构建Web应用程序。它遵循MVC设计模式,将Web应用分为模型、视图和控制器三个部分。
Spring MVC核心组件
- DispatcherServlet:前端控制器,处理所有HTTP请求
- HandlerMapping:将请求映射到相应的处理器
- Controller:处理请求的控制器
- ModelAndView:包含模型数据和视图信息
- ViewResolver:解析视图名称并返回实际视图
Spring MVC配置
启用MVC支持
java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}控制器示例
java
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public String listUsers(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users);
return "user-list";
}
@GetMapping("/{id}")
public String getUser(@PathVariable int id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "user-detail";
}
@GetMapping("/new")
public String newUserForm(Model model) {
model.addAttribute("user", new User());
return "user-form";
}
@PostMapping
public String createUser(@ModelAttribute User user) {
userService.save(user);
return "redirect:/users";
}
}RESTful API支持
Spring MVC天然支持RESTful风格的API开发:
java
@RestController
@RequestMapping("/api/users")
public class UserRestController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.findAll();
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable int id) {
User user = userService.findById(id);
if (user != null) {
return ResponseEntity.ok(user);
} else {
return ResponseEntity.notFound().build();
}
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable int id, @RequestBody User user) {
user.setId(id);
User updatedUser = userService.update(user);
return ResponseEntity.ok(updatedUser);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable int id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
}框架整合
在实际项目中,通常需要将Spring、MyBatis和Spring MVC整合使用。
整合配置示例
java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
@MapperScan("com.example.mapper")
public class AppConfig implements WebMvcConfigurer {
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/myapp");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}实践练习
创建一个简单的博客系统:
- 使用Spring管理Bean
- 使用MyBatis操作数据库
- 使用Spring MVC处理Web请求
- 实现文章的增删改查功能
- 提供RESTful API接口
总结
框架的使用大大简化了Java Web开发的复杂性。通过本章节的学习,你应该掌握了:
- Spring框架的核心概念(IoC、DI)和基本使用
- MyBatis框架的配置和使用方法
- Spring MVC框架的请求处理机制和控制器开发
- 框架之间的整合方式
在后续章节中,我们将学习更高级的Spring Boot框架,它进一步简化了Spring应用的开发和部署。