StudentSystem学生管理系统_V1(二)

时间:2021-11-16 14:30:08

resources:

StudentSystem学生管理系统_V1(二)


在【jdbc.properties】中配置 c3p0 数据库连接池:

jdbc.driver=com.mysql.jdbc.Driver
# 数据库地址
jdbc.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8
# 用户名
jdbc.username=root
# 密码
jdbc.password=root
# 最大连接数
c3p0.maxPoolSize=30
# 最小连接数
c3p0.minPoolSize=10
# 关闭连接后不自动commit
c3p0.autoCommitOnClose=false
# 获取连接超时时间
c3p0.checkoutTimeout=10000
# 当获取连接失败重试次数
c3p0.acquireRetryAttempts=2


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

<?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: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.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 扫描service包下所有使用注解的类型 -->
    <context:component-scan base-package="com.ray.service"/>

    <!-- 配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
    </bean>

    <!-- 配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 扫描entity包 使用别名 -->
        <property name="typeAliasesPackage" value="com.ray.entity"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="com.ray.dao"/>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置基于注解的声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>


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

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

    <!-- 扫描web相关的bean -->
    <context:component-scan base-package="com.ray.controller"/>

    <!-- 开启SpringMVC注解模式 -->
    <mvc:annotation-driven/>

    <!-- 静态资源默认servlet配置 -->
    <mvc:default-servlet-handler/>

    <!-- 配置jsp 显示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>


在【logback.xml】中完成日志输出的相关配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

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

  • 添加进了 SSM 项目所需要的 jar 包
  • 配置好了 spring/mybatis/spring MVC 的相关配置信息(自动扫描 com.ray 包下的带有注解的类)
  • 通过 xml 配置的方式配置好了日志和数据库


⑤ 实体类设计

实体类仅仅是对数据库中表的一一映射(表中字段名应该和实体类中的名称一一对应),同时可能还需要兼顾对业务能力的支持。

  • 在 Packge【com.ray.entity】下创建 Student 类:
package com.ray.entity;

import java.util.Date;

/**
 * @author Ray
 * @date 2018/5/27 0027
 * Student 实体类
 * 表中字段名应该和实体类中的名称一一对应
 */
public class Student {

    private int id;
    private int student_id;
    private String name;
    private int age;
    private String sex;
    private Date birthday;

    public int getId() {
        return id;
    }

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

    public int getStudent_id() {
        return student_id;
    }

    public void setStudent_id(int student_id) {
        this.student_id = student_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", student_id=" + student_id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

DAO 类的设计

DAO,即 Date Access Object,数据库访问对象,就是对数据库相关操作的封装,让其他地方看不到 JDBC 的代码。

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

/**
 * @author Ray
 * @date 2018/5/27 0027
 * DAO,即 Date Access Object,数据库访问对象
 * 对数据库相关操作的封装
 */
public interface StudentDao {

    int getTotal(); //查询数据条目
    void addStudent(Student student); //增加一条数据
    void deleteStudent(int id); //删除一条数据
    void updateStudent(Student student); //更新一条数据
    Student getStudent(int id); //根据id查询一条数据
    List<Student> list(int start,int count); //查询从start位置开始的count条数据
}


然后在【resources/mapper】下创建好对应的映射文件【StudengDao.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">

<!-- 将namespace的值设置为DAO类对应的路径 -->
<mapper namespace="com.ray.dao.StudentDao">

    <resultMap id="student" type="student">
        <id column="id" property="id"/>
        <result column="student_id" property="student_id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <result column="birthday" property="birthday" javaType="java.sql.Date"/>
    </resultMap>

    <!-- 查询数据条目 -->
    <select id="getTotal" resultType="int">
        SELECT COUNT(*) FROM student
    </select>

    <!-- 增加一条数据 -->
    <insert id="addStudent" parameterType="Student">
        INSERT INTO student VALUES (NULL , #{student_id}, #{name}, #{age}, #{sex}, #{birthday})
    </insert>

    <!-- 删除一条数据 -->
    <delete id="deleteStudent" parameterType="int">
        DELETE FROM student WHERE id = #{id}
    </delete>

    <!-- 更新一条数据 -->
    <update id="updateStudent" parameterType="Student">
        UPDATE student SET student_id = #{student_id}, name = #{name},
        age = #{age}, sex = #{sex}, birthday = #{birthday} WHERE id = #{id}
    </update>

    <!-- 根据id查询一条数据 -->
    <select id="getStudent" resultMap="student" parameterType="int">
        SELECT * FROM student WHERE id = #{id}
    </select>

    <!-- 查询从start位置开始的count条数据 -->
    <select id="list" resultMap="student">
        SELECT * FROM student ORDER BY student_id ASC LIMIT #{param1},#{param2}
    </select>
</mapper>

编写好了 Dao 类是需要测试的

StudentSystem学生管理系统_V1(二)

在【cn.ray.dao】包下创建【BaseTest】类:

/**
 * @author Ray
 * @date 2018/5/27 0027
 * 配置spring和junit整合,junit启动时加载springIOC容器 spring-test,junit
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-*.xml"})
public class BaseTest {

}

在【cn.ray.dao】包下创建【BaseDaoTest】类:

/**
 * @author Ray
 * @date 2018/5/27 0027
 */
public class StudentDaoTest extends BaseTest {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private StudentDao studentDao;

    /**
     * 查询数据条目
     */
    @Test
    public void getTotal() {
        int count;
        count = studentDao.getTotal();
        System.out.println(count);
    }

    /**
     * 增加数据
     */
    @Test
    public void addStudent() {
        for (int i = 0; i < 20; i++){
            Student student = new Student();
            student.setStudent_id(i);
            student.setName("Ray" + i);
            student.setSex("男");
            student.setAge(17 + i);
            student.setBirthday(new Date());
            studentDao.addStudent(student);
        }
    }

    /**
     * 删除一条数据
     */
    @Test
    public void deleteStudent() {
        studentDao.deleteStudent(1);
    }

    /**
     * 更新一条数据
     */
    @Test
    public void updateStudent() {
        Student student = new Student();
        student.setId(1);
        student.setStudent_id(3);
        student.setName("Ray3");
        student.setSex("男");
        student.setAge(18);
        student.setBirthday(new Date());
        studentDao.updateStudent(student);
    }

    /**
     * 根据id查询一条数据
     */
    @Test
    public void getStudent() {

        Student student = studentDao.getStudent(1);
        System.out.println(student);
    }

    @Test
    public void list() {
    }
StudentSystem学生管理系统_V1(二)