试题信息管理系统(基于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学习的一小部分,继续加油吧!!!