StudentSystem學生管理系統_V3(二)

resources:



在【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 類是需要測試的, 這裏就略過了..
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章