天天看點

試題資訊管理系統(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學習的一小部分,繼續加油吧!!!