MyBatis-注解方式整合SSM


附上搭建好的 demo:https://gitee.com/jhxxb/MySpringBoot/tree/master/mvc-ssm

Spring、Spring MVC、MyBatis 整合

一、依賴

<?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</groupId>
    <artifactId>ssm</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--spring mvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <!--事務管理等-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!--簡化pojo類-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>

        <!--mybatis整合spring-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>
        <!--jdbc驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

        <!--druid連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.14</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.26</version>
        </dependency>
    </dependencies>

    <properties>
        <!--編碼格式-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--tomcat 插件方式運行需指定為 war 包-->
    <packaging>war</packaging>

    <build>
        <plugins>
            <!-- 指定jdk -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <ignorePackaging>true</ignorePackaging>
                    <port>80</port>
                    <path>/ssm</path>
                    <server>tomcat7</server>
                    <charset>UTF-8</charset>
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

二、配置

數據庫信息 db.properties

db.url=jdbc:mysql://192.168.8.136:3306/mybatis?allowMultiQueries=true
db.username=root
db.password=root

mybatis屬性配置,也可不配置 mybatis-config.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>
    <settings>
        <!-- 本地(一級)緩存作用域,默認 SESSION,會緩存一個會話(SqlSession)中執行的所有查詢。 設置為 STATEMENT,會話僅作用在語句執行上,對 SqlSession 的調用將不會共享數據,可認為是禁用一級緩存 -->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 控制台打印SQL -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 是否可以使用列的別名 (取決於驅動的兼容性) default:true -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 指定 MyBatis 如何自動映射 數據基表的列 NONE:不隱射 PARTIAL:部分  FULL:全部  -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <!-- 這是默認的執行類型  (SIMPLE: 簡單; REUSE: 執行器可能重復使用prepared statements語句;BATCH: 執行器可以重復執行語句和批量更新)  -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 使用駝峰命名法轉換字段。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 設置但JDBC類型為空時,某些驅動程序 要指定值,default:OTHER,插入空值時不需要指定類型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
        <!-- 是否允許單條sql 返回多個數據集  (取決於驅動的兼容性) default:true -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 允許JDBC 生成主鍵。需要驅動器支持。如果設為了true,這個設置將強制使用被生成的主鍵,有一些驅動器不兼容不過仍然可以執行。  default:false  -->
        <setting name="useGeneratedKeys" value="false"/>
    </settings>
</configuration>

注解配置類,tomcat 啟動時會加載此類,然后才有后續的操作

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // spring 配置
        return new Class<?>[]{RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // spring mvc 配置
        return new Class<?>[]{ServletConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        // DispatcherServlet 攔截路徑,/* 攔截所有,/ 會排除 *.jsp 文件
        return new String[]{"/"};
    }
}

spring 配置

// 開啟事務管理
@EnableTransactionManagement
// 加載 properties 文件
@PropertySource("classpath:db.properties")
// 掃描包路徑,spring 掃描除 controller 層以外的,spring 不可從子容器(spring mvc)中獲取 bean
@ComponentScan(basePackages = {"ssm.service", "ssm.pojo", "ssm.dao"})
public class RootConfig {

    /**
     * SqlSession 工廠
     * @param dataSource 數據源,會在 IOC 中獲取
     */
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) throws IOException {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        // 設置 MyBatis 配置文件路徑
        factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        // 設置 SQL 映射文件路徑
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        // 設置 JavaBean 類型別名,在 SQL 映射文件中就不用寫全類名
        factoryBean.setTypeAliasesPackage("ssm.pojo");
        return factoryBean;
    }

    /**
     * Druid 數據源
     */
    @Bean
    public DataSource getDataSource(@Value("${db.username}") String name, @Value("${db.password}") String password, @Value("${db.url}") String url) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(name);
        dataSource.setPassword(password);
        return dataSource;
    }

    /**
     * 掃描所有 mapper 接口的實現,讓這些 mapper 能夠自動注入
     */
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("ssm.dao");
        return mapperScannerConfigurer;
    }

    /**
     * 事務管理
     */
    @Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 配置一個可以進行批量執行的 sqlSession
     */
    @Bean
    public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactoryBean sqlSessionFactoryBean) throws Exception {
        /**
         * Simple Executor -- SIMPLE 普通的執行器,默認
         * Reuse Executor -執行器會重用預處理語句(prepared statements)
         * Batch Executor --批量執行器
         */
        SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sqlSessionFactoryBean.getObject(), ExecutorType.BATCH);
        return sessionTemplate;
    }
}

spring mvc 配置,需實現 WebMvcConfigurer 接口

// 開啟 spring mvc
@EnableWebMvc
// 掃描包,只掃描 controller 層,其他 bean 可從父容器(spring)中獲取
@ComponentScan(basePackages = {"ssm.controller"})
public class ServletConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // 開啟默認 Servlet
        configurer.enable();
    }
}

三、測試

1.dao層

@Repository
public interface UserMapper {
    public User getUserById(User user);
    public boolean addUserById(User user);
}

對應的 SQL 映射文件

<?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">
<!-- namespace 對應接口文件的全路徑 -->
<mapper namespace="ssm.dao.UserMapper">
    <select id="getUserById" parameterType="user" resultType="user">
      select * from user where user.id = ${id}
    </select>
    <insert id="addUserById" parameterType="user">
      insert into user(name,age) values(#{name},#{age})
    </insert>
</mapper>

2.實體層

@Getter
@Setter
@ToString
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

3.service 層

@Service
public class UserManagerService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    // 使用事務
    @Transactional
    public User getUserById(){
        User user = new User();
        user.setId(1);
        userMapper.getUserById(user);
        user = sqlSessionTemplate.selectOne("ssm.dao.UserMapper.getUserById",user);
        
        userMapper.addUserById(user);
        // 異常回退
        int i = 3/0;
        
        return user;
    }
}

4.controller 層

@Controller
public class HelloWorld {

    @Autowired
    private UserManagerService userManagerService;

    @ResponseBody
    @RequestMapping(value = "/hw",method = RequestMethod.GET)
    public String hw() {
        return userManagerService.getUserById().toString();
    }
}

插件方式啟動 tomcat

項目結構

 


mybatis 整合文檔

spring mvc 文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM