試題資訊管理系統(基于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) 退出系統。
三、運作界面:
主菜單界面:
列出所有試題:
按科目查詢:
按題幹模糊查詢:
添加試題:
删除試題:
退出系統:
四、代碼實作
1.配置mybatis環境
jar包導入:
配置主配置檔案:
<?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&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學習的一小部分,繼續加油吧!!!