一、前言
本篇内容以理解MyBatis的基本用法和快速在项目中实践为目的,遵循Make it work,better and excellent原则。 技术栈为MyBatis3.2.7+log4j1.2.17+sqlite3+jdk1.7。
二、示例
示例代码功能:
学校人员管理系统,对象分别为学生、教师和班级,学生与班级为多对一关系,班级与教师为一对多关系。示例代码主要为操作学生对象。
1. 表结构
学生表(TStudentML)
字段
数据类型
备注
ID
Integer
主键
Name
Text
姓名
ClassID
Integer
班级ID
班级表(TClassML)
字段
数据类型
备注
ID
Integer
主键
Name
Text
姓名
教师表(TTeacherML)
字段
数据类型
备注
ID
Integer
主键
Name
Text
姓名
ClassID
Integer
班级ID
2. 项目目录结构
src
|-- com
| |-- entity
| | |-- ETeacher
| | |-- EStudent
| | |-- EClass
| |-- dao
| |-- studentMapper.xml
| |-- StudentMapper.java
| |-- DBase.java
| |-- DStudent.java
|-- mybatis-config.xml
|-- db.db
|-- log4j.properties
|-- config.properties
3. 数据库配置文件(config.properties)
driver=org.sqlite.JDBC
url=jdbc:sqlite:src/db.db
4. log4j.properties
log4j.rootLogger=TRACE, studout
log4j.appender.studout=org.apache.log4j.ConsoleAppender
log4j.appender.studout.layout=org.apache.log4j.PatternLayout
log4j.appender.studout.layout.ConversionPattern=【%5p】%t -%m%n
5. mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
""
6. 实体类
// 教师实体类
public class ETeacher{
private int id;
private String name;
// 省略各种setter和getter.......
}
// 班级实体类
public class EClass{
private int id;
private String name;
// 省略各种setter和getter.......
}
// 学生实体类
public class EStudent{
private int id;
private String name;
private EClass myClass;
private List teachers;
// 省略各种setter和getter.......
}
7. 映射接口
public interface StudentMapper{
/
通过姓名获取学生信息(不含教师、班级信息)
@param name 学生姓名
@return
/
EStudent getJustStudentInfo(String name);
/
通过姓名模糊查询学生信息(不含教师、班级信息)
@param name 学生姓名
@return
/
List getJustStudentInfos(String name);
/
通过姓名和班级名称获取学生信息(含教师、班级信息)
@param studentName 学生姓名
@param className 班级名称
@return
* /
EStudent getStudentInfo(String studentName, String className);
/
新增学生信息
@param student
@return
/
void addStudent(EStudent student);
/
删除学生信息
@param id
@return
/
void delStudent(int id);
}
8. 映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
""
select ID,Name from TStudentML where Name = #{0}
select * from TStudentML
[span style="color: rgba(0, 0, 255, 1)">if test="#{0} != null"
where name like '%'+#{0}+'%'
select
a.ID a_id, a.Name a_name,
b.ID b_id, b.Name b_name,
c.ID c_id, c.Name c_name, c.ClassID c_classId
from
TStudentML a left outer join TClassML b on(a.ClassID=b.ID)
left outer join TTeacherML c on(b.ID=c.ClassID)
a.Name like '%'+#{0}+'%'
and b.Name like '%'+#{1}+'%'
/if
insert into TStudentML(Name, ClassID) values(#{name}, #{myClass.id})
delete from TStudentML where ID = #{0}
9. 数据库操作基类
public class DBase{
private static SqlSessionFactory factory = null;
public DBase(){
if (factory != null) return;
InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(is);
}
/
获取SqlSession实例,使用后需调用实例的close()函数释放资源
@return
/
protected SqlSession openSession(){
return factory.openSession();
}
}
10. 数据库操作类
public class DStudent extends DBase{
/**
通过姓名获取学生信息(不含教师、班级信息)
@param name 学生姓名
@return
/
public EStudent getJustStudentInfo(String name)//代码效果参考:http://www.zidongmutanji.com/zsjx/465687.html
{EStudent ret = null;
SqlSession session = openSession();
try{
StudentMapper sm = session.getMapper(StudentMapper.class);
ret = sm.getJustStudentInfo(name);
}
finally{
session.close();
}
return ret;
}
/**
通过姓名模糊查询学生信息(不含教师、班级信息)
@param name 学生姓名
@return
/
public List getJustStudentInfos(String name){
List ret = null;
SqlSession session = openSession();
try{
StudentMapper sm = session.getMapper(StudentMapper.class);
ret = sm.getJustStudentInfos(name);
}
finally{
session.close();
}
return ret;
}
/**
通过姓名和班级名称获取学生信息(含教师、班级信息)
@param name 学生姓名
@param className 班级名称
@return
//代码效果参考:http://www.zidongmutanji.com/bxxx/386100.html
/public EStudent getStudentInfo(String name, String className){
EStudent ret = <span style="c