天天看点

试题信息管理系统(MyBatis+数据库)

试题信息管理系统(基于MyBatis+数据库的学习)

一、语言和环境

语言:Java

环境:IDEA编译器、Navicat Premium 12、JDK1.8

二、功能要求

开发基于控制台的试题管理系统,具体要求如下:

(1) 显示所有试题管理系统主菜单(如图所示),包括:

     1)列出所有试题

     2)按科目查询

     3)按题干模糊查询

     4)添加试题

     5)删除试题

     6)退出系统

(2) 列出所有试题信息:查询处所有试题的信息,内容包括:题干,A,B,C,D四个选项,所属科目,答案。

(3) 按科目查询:输入科目,查询出属于此科目的所有试题。

(4) 按题干模糊查询:输入题干,按题干模糊查询出相关试题。

(5) 添加试题:输入试题的各个属性信息,并将试题保存至数据库。

(6) 删除试题:删除指定编号的试题,如果输入的试题编号不存在,给出提示信息。

(7) 退出系统。

三、运行界面:

主菜单界面:
试题信息管理系统(MyBatis+数据库)
列出所有试题:
试题信息管理系统(MyBatis+数据库)
按科目查询:
试题信息管理系统(MyBatis+数据库)
按题干模糊查询:
试题信息管理系统(MyBatis+数据库)
添加试题:
试题信息管理系统(MyBatis+数据库)
删除试题:
试题信息管理系统(MyBatis+数据库)
退出系统:
试题信息管理系统(MyBatis+数据库)

四、代码实现

1.配置mybatis环境

jar包导入:

试题信息管理系统(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>
    <!-- 引入jdbc.properties -->
    <properties resource="jdbc.properties"></properties>
    <!-- 起别名 -->
    <typeAliases>
        <package name="lz.entity"/>
    </typeAliases>
    <!-- 配置环境-->
    <environments default="test">
        <environment id="test">
            <!-- 配置事务的类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 连接数据库四要素-->
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}?characterEncoding=utf8&amp;useSSL=false" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

    <!-- 配置映射文件-->
    <mappers>
        <mapper resource="lz/dao/QuestionInfoDao.xml"></mapper>
    </mappers>
</configuration>
           

数据库的创建:

DROP TABLE IF EXISTS `question_info`;
CREATE TABLE `question_info`  (
  `questionId` int(10) NOT NULL AUTO_INCREMENT COMMENT '试题编号',
  `question` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '题干',
  `optionA` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '选项A',
  `optionB` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '选项B',
  `optionC` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '选项C',
  `optionD` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '选项D',
  `subject` int(1) NOT NULL COMMENT '科目',
  `answer` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '正确答案',
  PRIMARY KEY (`questionId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

           

配置jdbc.propertries:

#mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///...(自己创建的数据库)
jdbc.username=root
jdbc.password=...(自己设置的密码)
           

控制台上显示(配置log4j.properties):

log4j.rootLogger=INFO,stdout,debug,error

#\u8F93\u51FA\u5230\u63A7\u5236\u53F0
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n

#\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230\u6587\u4EF6
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
log4j.appender.debug.File=./logs/debug.txt
log4j.appender.debug.DatePattern=','yyyy-MM-dd
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.Append=true
log4j.appender.debug.Encoding=UTF-8

#\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230\u6587\u4EF6
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
log4j.appender.error.File=./logs/error.txt
log4j.appender.error.DatePattern=','yyyy-MM-dd
log4j.appender.error.Threshold=ERROR
log4j.appender.error.Append=true
log4j.appender.error.Encoding=UTF-8

###\u663E\u793ASQL\u8BED\u53E5\u90E8\u5206
##log4j.logger.lz.dao.QuestionInfoDao=console //作用:是否能在控制台输出
           

创建实体类:

package lz.entity;

public class QuestionInfo {

    //试题编号(QuestionId)
    private int QuestionId;
    //题干(Question)
    private String Question;
    //选项A (optionA)
    private String optionA;
    //选项B (optionB)
    private String optionB;
    //选项C (optionC)
    private String optionC;
    //选项D (optionD)
    private String optionD;
    //科目(subject)
    private int subject;
    //正确答案(answer)
    private String answer;

    //无参构造
    public QuestionInfo(){
    }

    //带参构造

    public QuestionInfo(int questionId, String question, String optionA, String optionB,
                        String optionC, String optionD, int subject, String answer) {
        QuestionId = questionId;
        Question = question;
        this.optionA = optionA;
        this.optionB = optionB;
        this.optionC = optionC;
        this.optionD = optionD;
        this.subject = subject;
        this.answer = answer;
    }

    public int getQuestionId() {
        return QuestionId;
    }

    public void setQuestionId(int questionId) {
        QuestionId = questionId;
    }

    public String getQuestion() {
        return Question;
    }

    public void setQuestion(String question) {
        Question = question;
    }

    public String getOptionA() {
        return optionA;
    }

    public void setOptionA(String optionA) {
        this.optionA = optionA;
    }

    public String getOptionB() {
        return optionB;
    }

    public void setOptionB(String optionB) {
        this.optionB = optionB;
    }

    public String getOptionC() {
        return optionC;
    }

    public void setOptionC(String optionC) {
        this.optionC = optionC;
    }

    public String getOptionD() {
        return optionD;
    }

    public void setOptionD(String optionD) {
        this.optionD = optionD;
    }

    public int getSubject() {
        return subject;
    }

    public void setSubject(int subject) {
        this.subject = subject;
    }

    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    @Override
    public String toString() {
        return QuestionId +
                "." + Question  + '\n'
                + "A." + optionA + '\n' +
                "B." + optionB + '\n' +
                "C." + optionC + '\n' +
                "D.=" + optionD + '\n' +
                "subject=" + subject + '\n' +
                "answer=" + answer ;
    }
}

           

创建Dao接口:

package lz.dao;

import lz.entity.QuestionInfo;

import java.util.List;

public interface QuestionInfoDao {

    //查询所有试题
    public List<QuestionInfo> queryAllQuestion();
    //按科目查询试题
    public List<QuestionInfo> queryQuestionBySubject(int subject);
    //按题干模糊查询试题
    public List<QuestionInfo> queryQuestionByVague(String question);
    //添加试题
    public int addQuestion(QuestionInfo questionInfo);
    //删除试题
    public int deleteQuestionById(int questionId);
    //按试题编号查询试题
    public List<QuestionInfo> queryAllQuestionById(int questionId);
}

           

映射配置文件(sql语句配置文件):

<?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="lz.dao.QuestionInfoDao">
    <!-- 添加题目 -->
    <insert id="addQuestion" parameterType="QuestionInfo">
        insert into question_info (questionId,question,optionA,optionB,optionC,optionD,subject,answer)
        values (#{questionId},#{question},#{optionA},#{optionB},#{optionC},#{optionD},#{subject},#{answer})
    </insert>
    <!-- 删除题目 -->
    <delete id="deleteQuestionById" parameterType="QuestionInfo">
        delete from question_info where questionId = #{questionId}
    </delete>
    <!-- 查询所有试题 -->
    <select id="queryAllQuestion" resultType="QuestionInfo">
        select * from question_info
    </select>
    <!-- 按科目查询试题 -->
    <select id="queryQuestionBySubject" resultType="QuestionInfo">
        select * from question_info where subject = #{subject}
    </select>
    <!-- 按题干模糊查询试题 -->
    <select id="queryQuestionByVague" resultType="QuestionInfo">
        select * from question_info where question like '%' #{xxx} '%';
    </select>
    <!-- 按试题编号查询试题 -->
    <select id="queryAllQuestionById" resultType="QuestionInfo">
        select * from question_info where questionId = #{questionId}
    </select>
</mapper>
           

创建工具类:

package lz.Utils;

import lz.dao.QuestionInfoDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class BeanUtils {
    public static SqlSession getSession() {
        InputStream in;
        SqlSessionFactoryBuilder builder;
        SqlSession session = null;
        QuestionInfoDao questionInfoDao;
        //工具类
        //1.读取配置文件
        try {
            in = Resources.getResourceAsStream("mybatis-config.xml");
            //2.创建SqlSessionFactory工厂
            builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(in);
            if (session == null) {
                session = factory.openSession();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return session;
    }
}

           
Dao接口的实现类:
package lz.daoImpl;

import lz.Utils.BeanUtils;
import lz.dao.QuestionInfoDao;
import lz.entity.QuestionInfo;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class QuestionDaoImpl implements QuestionInfoDao {
    int result = 0;
    SqlSession session = BeanUtils.getSession();

    //查询所有试题
    @Override
    public List<QuestionInfo> queryAllQuestion(){
        return session.selectList("queryAllQuestion");
    }

    //按科目查询试题
    @Override
    public List<QuestionInfo> queryQuestionBySubject(int subject){
        return session.selectList("queryQuestionBySubject",subject);
    }

    //按题干模糊查询试题
    @Override
    public List<QuestionInfo> queryQuestionByVague(String question){
        return session.selectList("queryQuestionByVague",question);
    }

    //添加试题
    @Override
    public int addQuestion(QuestionInfo questionInfo){
        result = session.insert("addQuestion",questionInfo);
        session.commit();
        session.close();
        return result;
    }

    //删除试题
    @Override
    public int deleteQuestionById(int questionId){
        int delete = session.delete("deleteQuestionById",questionId);
        session.commit();
        return delete;
    }

    //按试题编号查询试题
    @Override
    public List<QuestionInfo> queryAllQuestionById(int questionId){
        return session.selectList("queryAllQuestionById",questionId);
    }
}
           

所有的配置以及部署都ok了,现在就要开始进行测试(在控制台上输出):

测试类:

package lz.console.test;

import lz.dao.QuestionInfoDao;
import lz.daoImpl.QuestionDaoImpl;
import lz.entity.QuestionInfo;

import java.util.List;
import java.util.Scanner;

/**
 * 这是来自控制台的测试
 *
 * @author 刘张
 * @version V1.0
 *
 */
public class ConsoleTest {

    public static void main(String[] args) {

            System.out.println("---------------------------欢迎使用试题管理系统---------------------------");
            while(true) {
            System.out.println("请选择操作(1.列出所有试题 2.按科目查询 3.按题干模糊查询 4.添加试题 5.删除试题 6.退出系统): ");
            //多态
            QuestionInfoDao questionInfoDao = new QuestionDaoImpl();
            Scanner sc = new Scanner(System.in);
            int num = sc.nextInt();
                    switch (num) {
                        case 1:
                            //查询所有试题
                            questionInfoDao = new QuestionDaoImpl();
                            List<QuestionInfo> queryAllQuestion = questionInfoDao.queryAllQuestion();
                                for (QuestionInfo questionInfo: queryAllQuestion){
                                    System.out.println(questionInfo);
                                }

                            break;
                        case 2:
                            //按科目查询
                            questionInfoDao = new QuestionDaoImpl();
                            System.out.println("请输入科目:(1代表java,2代表C#,3代表JSP): ");
                            int x = sc.nextInt();
                            List<QuestionInfo> queryQuestionBySubject =
                                    questionInfoDao.queryQuestionBySubject(x);
                                for (QuestionInfo questionInfo : queryQuestionBySubject){
                                    System.out.println(questionInfo);
                                }
                            break;
                        case 3:
                            //按题干模糊查询 ##还需修改
                            questionInfoDao = new QuestionDaoImpl();
                            System.out.println("请输入题干: ");
                            List<QuestionInfo> queryQuestionByVague = questionInfoDao.queryQuestionByVague(sc.next());
                                for (QuestionInfo questionInfo : queryQuestionByVague){
                                    System.out.println(questionInfo);
                                }
                            break;
                        case 4:
                            //添加试题
                            QuestionInfo questionInfo = new QuestionInfo();
                            System.out.println("请输入科目(1代表java,2代表C#,3代表JSP): ");
                            questionInfo.setSubject(sc.nextInt());
                            System.out.println("请输入新的题干: ");
                            questionInfo.setQuestion(sc.next());
                            System.out.println("请输入新的选项A: ");
                            questionInfo.setOptionA(sc.next());
                            System.out.println("请输入新的选项B: ");
                            questionInfo.setOptionB(sc.next());
                            System.out.println("请输入新的选项C: ");
                            questionInfo.setOptionC(sc.next());
                            System.out.println("请输入新的选项D: ");
                            questionInfo.setOptionD(sc.next());
                            System.out.println("请输入新的答案: ");
                            questionInfo.setAnswer(sc.next());
                            //加到数据库中
                            int result = questionInfoDao.addQuestion(questionInfo);
                            if (result > 0) {
                                System.out.println("添加成功...");
                            } else {
                                System.out.println("添加失败...");
                            }
                            break;
                        case 5:
                            //删除试题
                            questionInfoDao = new QuestionDaoImpl();
                            System.out.println("请输入要删除的题目编号:");
                            x = sc.nextInt();
                            int a = questionInfoDao.deleteQuestionById(x);
                            if (a > 0){
                                System.out.println("删除成功...");
                            } else {
                                System.out.println("删除失败...");
                            }
                            break;
                        case 6:
                            //退出系统
                            System.out.println("谢谢使用,欢迎下次来...");
                            System.exit(0);
                    }
                }
        }
}

           

到此,试题信息管理系统就已经完成了。当然了,这还只是mybatis学习的一小部分,继续加油吧!!!