論壇首頁 Java企業應用論壇

SSM框架基礎整合搭建圖文教程

瀏覽 154 次
精華帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隱藏帖 (0)
作者 正文
   發表時間:2019-06-03   最后修改:2019-06-03

文章轉載自:https://www.jiweichengzhu.com/article/987bd23b785947e98d0609c1bb492b12

如果還有問題,加群交流:686430774

案例代碼下載,請移步原文鏈接!

?在Mybatis問世之后,基于SSI框架演化出了SSM框架,struts + spring + mybatis,開發起來方便了很多,幾乎可以只在mapper中寫sql,而不用寫具體的dao調用實現了,mybatis會動態的幫我們生成具體實現,我們只需要在接口中寫mapper中對應的方法即可。

之前的筆記中,在Struts框架注解版的基礎上,也寫了相關的demo,整理出來分享給大家,主要變化就是在dao層,所以struts和spring并沒有多少變化。

框架版本:

Struts:2.3.24

Spring:4.1.5.RELEASE

Mybatis:3.3.0

applicationContext.xm

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 	http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
 	http://www.springframework.org/schema/tx 
 	http://www.springframework.org/schema/tx/spring-tx-4.1.xsd 
 	http://www.springframework.org/schema/context
 	http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <!-- 開啟注解掃描,并指定路徑 -->
    <context:component-scan base-package="com.ssm"/>

    <!--
    加載配置文件,也可以使用下面的方式,更加簡潔
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>
    -->

    <!-- 加載配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 數據源配置 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClass}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--連接池中保留的最大連接數。Default: 15 -->
        <property name="maxPoolSize" value="100"/>
        <!--連接池中保留的最小連接數。 -->
        <property name="minPoolSize" value="1"/>
        <!--初始化時獲取的連接數,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
        <property name="initialPoolSize" value="10"/>
        <!--最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 -->
        <property name="maxIdleTime" value="30"/>
        <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 -->
        <property name="acquireIncrement" value="5"/>
        <!-- JDBC的標準參數,用以控制數據源內加載的PreparedStatements數量。Default: 0 -->
        <!-- 但由于預緩存的statements 屬于單個connection而不是整個連接池。 -->
        <!-- 所以設置這個參數需要考慮到多方面的因素。 如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。 -->
        <property name="maxStatements" value="0"/>
        <!--每60秒檢查所有連接池中的空閑連接。Default: 0 -->
        <property name="idleConnectionTestPeriod" value="60"/>
        <!--定義在從數據庫獲取新連接失敗后重復嘗試的次數。Default: 30 -->
        <property name="acquireRetryAttempts" value="30"/>
        <!-- 獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。 -->
        <!-- 但是數據源仍有效 保留,并在下次調用getConnection()的時候繼續嘗試獲取連接。 -->
        <!-- 如果設為true,那么在嘗試獲取連接失敗后該數據源將申明已斷開并永久關閉。Default: false -->
        <property name="breakAfterAcquireFailure" value="true"/>
        <!-- 因性能消耗大請只在需要的時候使用它。如果設為true那么在每個connection提交的 時候都將校驗其有效性。 -->
        <!-- 建議使用idleConnectionTestPeriod或automaticTestTable,等方法來提升連接測試的性能。Default: false -->
        <property name="testConnectionOnCheckout" value="false"/>
    </bean>

    <!-- 類似于ibatis的sql模板,用來和數據庫進行交互 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 數據源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定mybatis配置文件的路徑 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 下面兩個選項這里配置了,mybatis配置文件中就可以省略 -->
        <!-- 指定mapper映射文件的路徑 -->
        <!-- <property name="mapperLocations" value="classpath:mapper/*.xml"/>-->
        <!-- 配置alias的路徑 -->
        <!-- <property name="typeAliasesPackage" value="com.ssm.entity"/>-->
    </bean>

    <!-- mapper掃描配置,這個相比ibatis來說,就是很大的改進了,可以省去很多的代碼,直接通過代理動態的調用 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- mapper掃描路徑 -->
        <property name="basePackage" value="com.ssm.dao"/>
        <!-- 對于sqlSessionFactory來說,它只要求一個名字,而不是一個引用,所以不要使用ref的方式 -->
        <!-- 而且這個還會導致一個問題,配置文件加載失敗 -->
        <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />-->
        <!-- 官方推薦使用這個來配置 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    <!-- 配置事務管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 支持@Transactional注解(聲明式注解) -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

這里同樣需要配置一個類似于ibatis的sqlMapClient,利用MapperScannerConfigurer進行掃描dao接口,以便于對接口進行動態代理,這塊兒真的是非常人性化,爽到飛起。

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>
        使全局的映射器啟用或禁用緩存。
        <setting name="cacheEnabled" value="true" />

        全局啟用或禁用延遲加載。當禁用時,所有關聯對象都會即時加載。
        <setting name="lazyLoadingEnabled" value="true" />

        當啟用時,有延遲加載屬性的對象在被調用時將會完全加載任意屬性。否則,每種屬性將會按需要加載。
        <setting name="aggressiveLazyLoading" value="true" />

        是否允許單條sql 返回多個數據集 (取決于驅動的兼容性) default:true
        <setting name="multipleResultSetsEnabled" value="true" />

        是否可以使用列的別名 (取決于驅動的兼容性) default:true
        <setting name="useColumnLabel" value="true" />

        允許JDBC 生成主鍵。需要驅動器支持。如果設為了true,這個設置將強制使用被生成的主鍵,有一些驅動器不兼容不過仍然可以執行。 default:false
        <setting name="useGeneratedKeys" value="false" />

        指定 MyBatis 如何自動映射 數據基表的列 NONE:不隱射 PARTIAL:部分 FULL:全部
        <setting name="autoMappingBehavior" value="PARTIAL" />

        這是默認的執行類型 (SIMPLE: 簡單; REUSE: 執行器可能重復使用prepared statements語句;BATCH: 執行器可以重復執行語句和批量更新)
        <setting name="defaultExecutorType" value="SIMPLE" />

        使用駝峰命名法轉換字段。
        <setting name="mapUnderscoreToCamelCase" value="true" />

        設置本地緩存范圍 session:就會有數據的共享 statement:語句范圍 (這樣就不會有數據的共享 ) defalut:session
        <setting name="localCacheScope" value="SESSION" />

        設置但JDBC類型為空時,某些驅動程序 要指定值,default:OTHER,插入空值時不需要指定類型
        <setting name="jdbcTypeForNull" value="NULL" />

    </settings>
    -->

    <!-- alias、mapper,推薦在MapperScannerConfigurer中配置,這里手動寫有點兒麻煩,每增加一個就需要手動添加 -->

    <!-- 對于alias,我一直覺著沒什么太多作用,反而還會導致一些額外的工作,習慣性寫bean的全路徑 -->
    <typeAliases>
        <typeAlias alias="Book" type="com.ssm.entity.Book"/>
        <typeAlias alias="School" type="com.ssm.entity.School"/>
        <typeAlias alias="Student" type="com.ssm.entity.Student"/>
    </typeAliases>

    <!-- 若是在sqlSessionFactory中配置了mapperLocations選項,這里就可以不用配置映射文件 -->
    <mappers>
        <mapper resource="mapper/Book.xml"/>
        <mapper resource="mapper/School.xml"/>
        <mapper resource="mapper/Student.xml"/>
    </mappers>

</configuration>

這個跟ibatis差別并不大,同樣是需要配置alias和mapper,同樣也都可以省略,在spring文件中配置sqlSessionFactory的時候,可以利用掃描路徑來替代逐一配置。

mapper接口:

package com.ssm.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.ssm.entity.Student;

public interface StudentDao {

    List<Student> list(@Param("text") String text);

    void add(Student student);

    void update(Student student);

    void delete(@Param("id") int id);

    Student getById(@Param("id") int id);

}?

mapper映射文件:

<?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.ssm.dao.StudentDao">

    <resultMap id="studentResult" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="student_name"/>
        <result property="sex" column="student_sex"/>
        <result property="age" column="student_age"/>
        <result property="birthday" column="student_birthday"/>
        <result property="hobby" column="student_hobby"/>
        <result property="schoolId" column="school_id"/>
        <result property="schoolName" column="school_name"/>
    </resultMap>

    <select id="list" resultMap="studentResult">
        select
            st.*,
            sc.school_name
        from
            students st,
            schools sc
        where st.school_id = sc.id
        <if test="text != null and text != ''">
            and st.student_name like '%' || #{text} || '%'
        </if>
    </select>

    <insert id="add" useGeneratedKeys="true" keyProperty="id" parameterType="Student">
        insert into students
		(student_name, student_sex, student_age, student_birthday, student_hobby, school_id)
		values
		(#{name}, #{sex}, #{age}, #{birth}, #{hobby}, #{schoolId})
    </insert>

    <update id="update" parameterType="Student">
        update students
        <set>
            <if test="name != null and name != ''">
                student_name = #{name},
            </if>
            <if test="sex != null">
                student_sex = #{sex},
            </if>
            <if test="age != null">
                student_age = #{age},
            </if>
            <if test="birthday != null">
                student_birthday = #{birthday},
            </if>
            <if test="hobby != null and hobby != ''">
                student_hobby = #{hobby},
            </if>
            <if test="schoolId != null">
                school_id = #{schoolId},
            </if>
        </set>
        where id = #{id}
    </update>

    <delete id="delete" parameterType="int">
        delete
        from students
        where id = #{id}
    </delete>

    <!-- parameterType中的 int = java.lang.Integer,如果大寫就要寫全包名,如果小寫就不用寫那么多 -->
    <select id="getById" parameterType="java.lang.Integer" resultMap="studentResult">
        select
            st.*,
            sc.school_name
        from
            students st,
            schools sc
        where st.school_id = sc.id
        and st.id = #{id}
    </select>

</mapper>
區別也不是很大,不過傳參的標簽出現了變化,在ibatis中是##的方式,而在mybatis中是#{}的方式,這個沒什么多說的,寫的時候注意一下就行了。

目錄結構跟ssi相比,沒有太多的變化:

SSM框架基礎整合搭建圖文教程?

論壇首頁 Java企業應用版

跳轉論壇:
Global site tag (gtag.js) - Google Analytics 全天上海快3计划网 赞皇县| 彩票| 桦甸市| 饶平县| 原阳县| 铜鼓县| 库车县| 合山市| 日土县| 乌拉特后旗| 德令哈市| 建水县| 龙里县| 渭源县| 汕尾市| 沅陵县| 榆林市| 崇信县| 天镇县| 凤城市| 扎赉特旗| 会同县| 和顺县| 界首市| 宜良县| 永胜县| 蕉岭县| 福建省| 惠水县| 克东县| 上高县| 宜宾县| 高雄市| 镇沅| 花垣县| 西吉县| 全南县| 铁岭市|