Skip to content

框架入门

在现代Java Web开发中,框架的使用大大简化了开发过程,提高了开发效率。本章节将介绍Spring、MyBatis和Spring MVC这三个核心框架的基础知识和使用方法。

Spring框架

Spring简介

Spring是一个轻量级的开源Java框架,为Java应用程序提供了全面的基础设施支持。它的核心特性包括:

  1. 控制反转(IoC):将对象的创建和管理交给Spring容器
  2. 面向切面编程(AOP):将横切关注点(如日志、安全)与业务逻辑分离
  3. 事务管理:简化数据库事务的管理
  4. 集成其他框架:提供与其他流行框架的集成支持

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将对象所需的依赖自动注入到对象中。

依赖注入的三种方式:

  1. 构造函数注入
  2. Setter方法注入
  3. 字段注入

Spring配置

Spring可以通过XML配置或注解配置来管理Bean。

注解配置示例

  1. 启用组件扫描
java
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
  1. 定义Bean
java
@Component
public class UserDao {
    // UserDao实现
}

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    
    // 业务逻辑
}

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    
    // 控制器逻辑
}
  1. 启动Spring应用
java
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

MyBatis框架

MyBatis简介

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。

MyBatis核心组件

  1. SqlSessionFactory:创建SqlSession的工厂
  2. SqlSession:执行SQL语句的会话
  3. Mapper接口:定义数据访问方法的接口
  4. 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核心组件

  1. DispatcherServlet:前端控制器,处理所有HTTP请求
  2. HandlerMapping:将请求映射到相应的处理器
  3. Controller:处理请求的控制器
  4. ModelAndView:包含模型数据和视图信息
  5. 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;
    }
}

实践练习

创建一个简单的博客系统:

  1. 使用Spring管理Bean
  2. 使用MyBatis操作数据库
  3. 使用Spring MVC处理Web请求
  4. 实现文章的增删改查功能
  5. 提供RESTful API接口

总结

框架的使用大大简化了Java Web开发的复杂性。通过本章节的学习,你应该掌握了:

  1. Spring框架的核心概念(IoC、DI)和基本使用
  2. MyBatis框架的配置和使用方法
  3. Spring MVC框架的请求处理机制和控制器开发
  4. 框架之间的整合方式

在后续章节中,我们将学习更高级的Spring Boot框架,它进一步简化了Spring应用的开发和部署。