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 类是需要测试的, 这里就略过了..
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值