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 類是需要測試的, 這裡就略過了..