天天看點

StudentSystem學生管理系統_V3(二)

resources:

StudentSystem學生管理系統_V3(二)

在【jdbc.properties】中配置 Druid 資料庫連接配接池:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
           

在【spring-mybatis.xml】中完成 spring 和 mybatis 的配置:

    加入了Mybatis分頁插件 PageHelper

<?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:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">


    <!-- 整合mybatis過程 -->
    <!-- 1.自動掃描 -->
    <context:component-scan base-package="com.ray"/>

    <!-- 2.配置資料庫相關參數properties屬性 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 3.資料庫連接配接池 druid -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 配置連接配接池屬性 -->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1"/>
        <property name="minIdle" value="1"/>
        <property name="maxActive" value="20"/>

        <!-- 配置擷取連接配接等待逾時的時間 -->
        <property name="maxWait" value="60000"/>

        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接配接,機關是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>

        <!-- 配置一個連接配接在池中最小生存的時間,機關是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <!-- 驗證連接配接有效與否的SQL,不同的資料配置不同 -->
        <property name="validationQuery" value="SELECT 1" />

        <!-- 如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接配接是否有效 -->
        <property name="testWhileIdle" value="true"/>

        <!-- 這裡建議配置為TRUE,防止取到的連接配接不可用 -->
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>

        <!-- 打開PSCache,并且指定每個連接配接上PSCache的大小 -->
        <!-- 如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。 -->
        <property name="poolPreparedStatements" value="false"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>

        <!-- 這裡配置送出方式,預設就是TRUE,可以不用配置 -->
        <property name="defaultAutoCommit" value="true" />

        <!-- 合并多個DruidDataSource的監控資料 -->
        <property name="useGlobalDataSourceStat" value="true"/>

        <!-- 開啟Druid的監控統計功能,StatFilter可以和其他的Filter配置使用 -->
        <property name="filters" value="stat"/>

        <!-- proxyFilters屬性配置,通過bean的方式配置 -->
        <property name="proxyFilters">
            <list>
                <ref bean="log-filter"/>
            </list>
        </property>
    </bean>

    <!-- proxyFilters配置 -->
    <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4j2Filter">
        <!-- 所有連接配接相關的日志 -->
        <property name="connectionLogEnabled" value="false"/>
        <!-- 所有Statement相關的日志 -->
        <property name="statementLogEnabled" value="false"/>
        <!-- 是否顯示結果集 -->
        <property name="resultSetLogEnabled" value="true"/>
        <!-- 是否顯示SQL語句 -->
        <property name="statementExecutableSqlLogEnable" value="true"/>
    </bean>

    <!-- 4.spring和Mybatis結合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 配置Mybatis全局配置檔案 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 注入資料庫連接配接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 掃描entity包,使用别名 -->
        <property name="typeAliasesPackage" value="com.ray.entity"/>
        <!-- 掃描sql配置檔案mapper -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>

        <!-- 配置分頁插件 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!-- 這裡的幾個配置主要示範如何使用,如果不了解,一定要去掉下面的配置 -->
                        <value>
                            helperDialect=mysql
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <!-- 5.配置掃描Dao接口包,實作動态Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 需要掃描的包 -->
        <property name="basePackage" value="com.ray.dao"/>
    </bean>
</beans>
           

在【spring-mvc.xml】中完成 Spring MVC 的相關配置:

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

    <!-- 1.自動掃描該包,使SpringMVC認為包下用了@Controller注解的類是控制器 -->
    <context:component-scan base-package="com.ray.controller"/>

    <!-- 2.處理請求時傳回json字元串的中文亂碼問題 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>
                            application/json;charset=UTF-8
                        </value>
                    </list>
                </property>
            </bean>
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>
                            application/json;charset=UTF-8
                        </value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 3.靜态資源通路(不攔截此目錄下的東西的通路) -->
    <!--<mvc:resources mapping="/js/" location="/js/**"/>-->
    <!--<mvc:resources mapping="/css/" location="/css/**"/>-->

    <!-- 3.靜态資源由WEB伺服器預設的Servlet來處理(推薦) -->
    <mvc:default-servlet-handler/>

    <!-- 4.定義跳轉的檔案的前字尾,視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
           

在【spring-service.xml】中完成 Spring 事務的相關配置:

<?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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

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

    <!-- 方法一:
    開啟注解事務  打開事務驅動
    基于注解的方式需要在業務層上添加一個@Transactional的注解。
    -->
    <!--<tx:annotation-driven transaction-manager="transactionManager"/>-->

    <!-- 方法二:
    基于AspectJ的XML聲明式事務管理
    在這種方式下Dao和Service的代碼也沒有改變
     -->
    <!--2.配置事務的通知:(事務的增強)-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 定義事物傳播特性 -->
        <tx:attributes>
            <!--
               propagation     :事務傳播行為
               isolation       :事務的隔離級别
               read-only       :隻讀
               rollback-for    :發生哪些異常復原
               no-rollback-for :發生哪些異常不復原
               timeout         :過期資訊
           -->
            <tx:method name="insert" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="select*" propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!-- 3.配置事務切面,使得上面的事務配置對service接口的所有操作有效 -->
    <aop:config>
        <!-- 配置切入點 -->
        <aop:pointcut id="pointcut" expression="execution(* com.ray.service.*.*(..))"/>
        <!-- 配置切面 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>
</beans>
           

在【mybatis-config.xml】中完成 Mybatis全局的相關配置:

<?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>
        <!-- 使用jdbc的getGeneratedKeys擷取資料庫自增主鍵值 -->
        <setting name="useGeneratedKeys" value="true" />

        <!-- 使用列别名替換列名 預設:true -->
        <setting name="useColumnLabel" value="true" />

        <!-- 開啟駝峰命名轉換:Table{create_time} -> Entity{createTime} -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>

</configuration>
           

在【log4j2.xml】中完成日志輸出的相關配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>

        <Console name="Console" target="SYSTEM_OUT">
            <!--隻接受程式中DEBUG級别的日志進行處理-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss.SSS}] %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>

        <!--處理DEBUG級别的日志,并把該日志放到logs/debug.log檔案中-->
        <!--列印出DEBUG級别日志,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的檔案夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileDebug" fileName="./logs/debug.log"
                     filePattern="logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="DEBUG"/>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--處理INFO級别的日志,并把該日志放到logs/info.log檔案中-->
        <RollingFile name="RollingFileInfo" fileName="./logs/info.log"
                     filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--隻接受INFO級别的日志,其餘的全部拒絕處理-->
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--處理WARN級别的日志,并把該日志放到logs/warn.log檔案中-->
        <RollingFile name="RollingFileWarn" fileName="./logs/warn.log"
                     filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--處理error級别的日志,并把該日志放到logs/error.log檔案中-->
        <RollingFile name="RollingFileError" fileName="./logs/error.log"
                     filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--druid的日志記錄追加器-->
        <RollingFile name="druidSqlRollingFile" fileName="./logs/druid-sql.log"
                     filePattern="logs/$${date:yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="DEBUG">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="RollingFileDebug"/>
        </root>

        <!--記錄druid-sql的記錄-->
        <logger name="druid.sql.Statement" level="debug" additivity="false">
            <appender-ref ref="druidSqlRollingFile"/>
        </logger>
        <logger name="druid.sql.Statement" level="debug" additivity="false">
            <appender-ref ref="druidSqlRollingFile"/>
        </logger>

        <!--log4j2 自帶過濾日志-->
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
        <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
        <Logger name="org.crsh.plugin" level="warn" />
        <logger name="org.crsh.ssh" level="warn"/>
        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
        <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
        <logger name="org.thymeleaf" level="warn"/>
    </loggers>
</configuration>
           

以上就完成了 SSM 架構的基本配置:

  • 添加進了 SSM 項目所需要的 jar 包
  • 配置好了 spring/mybatis/spring MVC 的相關配置資訊(自動掃描 

    com.ray

     包下的帶有注解的類)
  • 通過 xml 配置的方式配置好了日志和資料庫

實體類設計

實體類僅僅是對資料庫中表的一一映射(表中字段名應該和實體類中的名稱一一對應),同時可能還需要兼顧對業務能力的支援。

  • 在 Packge【com.ray.entity】下建立 Student 類:
package com.ray.entity;

/**
 * @author Ray
 * @date 2018/6/23 0023
 * 表中字段名應該和實體類中的名稱一一對應 
 */
public class Student {
    private int id;
    private int stu_id;
    private String stu_name;
    private int stu_age;
    private String stu_major;

    public Student() {
    }

    public Student(int stu_id, String stu_name, int stu_age, String stu_major) {
        this.stu_id = stu_id;
        this.stu_name = stu_name;
        this.stu_age = stu_age;
        this.stu_major = stu_major;
    }

    public Student(int id, int stu_id, String stu_name, int stu_age, String stu_major) {
        this.id = id;
        this.stu_id = stu_id;
        this.stu_name = stu_name;
        this.stu_age = stu_age;
        this.stu_major = stu_major;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", stu_id=" + stu_id +
                ", stu_name='" + stu_name + '\'' +
                ", stu_age=" + stu_age +
                ", stu_major='" + stu_major + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getStu_id() {
        return stu_id;
    }

    public void setStu_id(int stu_id) {
        this.stu_id = stu_id;
    }

    public String getStu_name() {
        return stu_name;
    }

    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }

    public int getStu_age() {
        return stu_age;
    }

    public void setStu_age(int stu_age) {
        this.stu_age = stu_age;
    }

    public String getStu_major() {
        return stu_major;
    }

    public void setStu_major(String stu_major) {
        this.stu_major = stu_major;
    }
}
           
  • 在 Packge【com.ray.entity】下建立 User類:
package com.ray.entity;

/**
 * @author Ray
 * @date 2018/6/23 0023
 */
public class User {

    private int id;
    private String username;
    private String password;

    public User() {
    }

    public User(String username) {
        this.username = username;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
           

DAO 類的設計

DAO,即 Date Access Object,資料庫通路對象,就是對資料庫相關操作的封裝,讓其他地方看不到 JDBC 的代碼。

在【com.ray.dao】包下建立【StudentDao】接口:

/**
 * @author Ray
 * @date 2018/6/23 0023
 * 對資料庫相關操作的封裝  
 */
public interface StudentDao {

    /**
     * 查詢所有學生資訊
     */
    List<Student> selectByStudent();

    /**
     * 根據編号查詢學生資訊
     */
    Student selectByKey(@Param("id") int id);

    /**
     *  根據學号查詢學生資訊
     */
    Student selectByStuId(@Param("stu_id") int stu_id);

    /**
     * 新增學生資訊
     */
    void insert(Student student);

    /**
     * 修改學生資訊
     */
    void update(Student student);

    /**
     * 删除學生資訊
     */
    void delete(@Param("id") int id);
}
           

在【com.ray.dao】包下建立【UserDao】接口:

/**
 * @author Ray
 * @date 2018/6/23 0023
 */
public interface UserDao {

    /**
     * 根據使用者名查詢使用者資訊
     */
    User selectByName(String username);

    /**
     * 新增使用者資訊
     */
    void insert(User user);
}
           

然後在【resources/mapper】下建立好對應的映射檔案【StudengMapper.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.ray.dao.StudentDao">

    <!-- 在resultMap節點中,id表示哪個字段代表這主鍵,result節點定義了普通的映射關系,
         這裡的property表示JavaBean中的屬性名稱,column表示資料庫中的字段名稱-->
    <resultMap id="BaseResultMap" type="com.ray.entity.Student">
        <id property="id" column="id"/>
        <result property="stu_id" column="stu_id"/>
        <result property="stu_name" column="stu_name"/>
        <result property="stu_age" column="stu_age"/>
        <result property="stu_major" column="stu_major"/>
    </resultMap>

    <!-- <sql>用來封裝SQL語句 -->
    <sql id="Base_Column_List">
        id,stu_id,stu_name,stu_age,stu_major
    </sql>

    <!-- 查詢所有學生資訊 resultMap則是對外部ResultMap的引用-->
    <select id="selectByStudent" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM
        student
    </select>

    <!-- 根據編号查詢學生資訊 -->
    <select id="selectByKey" resultMap="BaseResultMap" parameterType="com.ray.entity.Student">
        SELECT
        <include refid="Base_Column_List"/>
        FROM
        student
        WHERE
        id = #{id}
    </select>

    <!-- 根據學号查詢學生資訊 -->
    <select id="selectByStuId" resultMap="BaseResultMap" parameterType="com.ray.entity.Student">
        SELECT
        <include refid="Base_Column_List"/>
        FROM
        student
        WHERE
        stu_id = #{stu_id}
    </select>

    <!-- 新增學生資訊 parameterType為輸入參數 -->
    <!-- (僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由資料庫内部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關系資料庫管理系統的自動遞增字段) -->
    <insert id="insert" parameterType="com.ray.entity.Student" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO
        student
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="stu_id != null">
                stu_id,
            </if>
            <if test="stu_name != null">
                stu_name,
            </if>
            <if test="stu_age != null">
                stu_age,
            </if>
            <if test="stu_major != null">
                stu_major,
            </if>
        </trim>
        <trim prefix="VALUES(" suffix=")" suffixOverrides=",">
            <if test="stu_id != null">
                #{stu_id},
            </if>
            <if test="stu_name != null">
                #{stu_name},
            </if>
            <if test="stu_age != null">
                #{stu_age},
            </if>
            <if test="stu_major != null">
                #{stu_major},
            </if>
        </trim>
    </insert>

    <!-- 修改學生資訊 parameterType為輸入參數 -->
    <update id="update" parameterType="com.ray.entity.Student">
        UPDATE
        student
        <set>
            <if test="stu_id != null">
                stu_id = #{stu_id},
            </if>
            <if test="stu_name != null">
                stu_name = #{stu_name},
            </if>
            <if test="stu_age != null">
                stu_age = #{stu_age},
            </if>
            <if test="stu_major != null">
                stu_major = #{stu_major},
            </if>
        </set>
        WHERE
        id = #{id}
    </update>

    <!-- 删除學生資訊 parameterType為輸入參數 -->
    <delete id="delete" parameterType="int">
        DELETE FROM
        student
        WHERE
        id = #{id}
    </delete>
</mapper>
           

然後在【resources/mapper】下建立好對應的映射檔案【UserMapper.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.ray.dao.UserDao">

    <!-- 在resultMap節點中,id表示哪個字段代表這主鍵,result節點定義了普通的映射關系,
         這裡的property表示JavaBean中的屬性名稱,column表示資料庫中的字段名稱 -->
    <resultMap id="BaseResultMap" type="com.ray.entity.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
    </resultMap>

    <!-- <sql>用來封裝SQL語句 -->
    <sql id="Base_Column_List">
        id,username,password
    </sql>

    <!-- 根據使用者名查詢使用者資訊 -->
    <select id="selectByName" resultMap="BaseResultMap" parameterType="java.lang.String">
        SELECT
        <include refid="Base_Column_List"/>
        FROM
        user
        WHERE
        username = #{username}
    </select>

    <!-- 新增使用者資訊 -->
    <insert id="insert" parameterType="com.ray.entity.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO
        user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                password,
            </if>
        </trim>
        <trim prefix="VALUES(" suffix=")" suffixOverrides=",">
            <if test="username != null">
                #{username},
            </if>
            <if test="password != null">
                #{password},
            </if>
        </trim>
    </insert>
</mapper>
           

編寫好了 Dao 類是需要測試的, 這裡就略過了..