首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC + MyBatis 整合極簡 Demo:從依賴配置到 CRUD 閉環

     編輯:Java 綜合教學

專案結構概覽

src/main/java
├── controller      # DispatcherController
├── service
│   ├── IUserManage.java
│   └── impl/UserManage.java
├── dao
│   ├── iface/IUserManageDao.java
│   └── sqlMapper/UserMapper.xml
├── beans/User.java
└── config/...      # Spring 配置類

一、Maven 核心依賴

<dependencies>
    <!-- Spring MVC -->
    <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.10.RELEASE</version></dependency>
    <!-- MyBatis & Spring 整合 -->
    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency>
    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version></dependency>
    <!-- 數據庫驅動 & 連接池 -->
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
    <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.21</version></dependency>
    <!-- JSON -->
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version></dependency>
    <!-- 測試 -->
    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

二、Spring 整合 MyBatis 配置(spring-mybatis.xml)

<beans ...>
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- Druid 數據源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="20" />
        <property name="minIdle" value="5" />
        <property name="maxWait" value="60000" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="testOnBorrow" value="true" />
        <property name="testWhileIdle" value="true" />
    </bean>

    <!-- SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:dao/sqlMapper/*Mapper.xml" />
        <property name="typeAliasesPackage" value="com.example.beans" /> <!-- 簡化 resultType -->
    </bean>

    <!-- Mapper 掃描器:自動掃描 dao.iface 包下接口生成代理 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.dao.iface" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

    <!-- 事務管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>

三、jdbc.properties

jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456

四、領域模型與 Mapper

// User.java
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    // getter/setter/toString
}
<!-- UserMapper.xml -->
<mapper namespace="com.example.dao.iface.IUserManageDao">
    <select id="getUsers" resultType="User">
        SELECT id, username, password, email FROM t_user
    </select>
    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO t_user(username, password, email) VALUES(#{username}, #{password}, #{email})
    </insert>
</mapper>

五、DAO 接口(無需實現類)

public interface IUserManageDao {
    List<User> getUsers();
    int insertUser(User user);
}

六、Service 層

// IUserManage.java
public interface IUserManage {
    List<User> getUsers();
    void addUser(User user);
}

// UserManage.java
@Service
public class UserManage implements IUserManage {
    @Autowired private IUserManageDao userManageDao;

    @Override
    public List<User> getUsers() { return userManageDao.getUsers(); }

    @Override
    @Transactional
    public void addUser(User user) { userManageDao.insertUser(user); }
}

七、Controller

@Controller
@RequestMapping("/demo")
public class DispatcherController {
    @Autowired private IUserManage userManage;

    @GetMapping
    public String listUsers(ModelMap model) {
        model.addAttribute("users", userManage.getUsers());
        return "index"; // 對應 /WEB-INF/views/index.jsp
    }

    @PostMapping("/add")
    @ResponseBody
    public String addUser(@RequestBody User user) {
        userManage.addUser(user);
        return "success";
    }
}

八、web.xml 與 Spring MVC 配置

<!-- web.xml -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- springmvc.xml -->
<mvc:annotation-driven />
<context:component-scan base-package="com.example.controller" />
<import resource="classpath:spring-mybatis.xml" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

九、測試驗證

  1. 建表:CREATE TABLE t_user (id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), password VARCHAR(50), email VARCHAR(100));
  2. 啟動 Tomcat,訪問 https://localhost:8080/demo 顯示用戶列表。
  3. Postman POST https://localhost:8080/demo/add Body(JSON) {"username":"test","password":"123","email":"test@qq.com"} 返回 success。

避坑提示

  • MapperScannerConfigurer 的 basePackage 必須精確到接口所在包,否則代理生成失敗報 NoSuchBeanDefinitionException。
  • MyBatis 3.4+ 需要 typeAliasesPackage 或 resultType 寫全限定名。
  • Druid validationQuery MySQL 8.0+ 用 SELECT 1,Oracle 用 SELECT 1 FROM DUAL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved