Mybatis技术特点:
1、 通过直接编写SQL语句,可以直接对SQL进行性能的优化;
2、 学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
3、 由于直接编写SQL语句,所以灵活多变,代码维护性更好。
4、 不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。
Hibernate技术特点:
1、 标准的orm框架,程序员不需要编写SQL语句。
2、 具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
3、 学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
4、 程序员不能自主的去进行SQL性能优化。
在介绍配置之前,先来看看工程的目录图(此后的文件很多,如果对不上了来看看目录图)
再来看看mybatis遇到的jar包
其中junit为测试包,junit以上为mybatis必须的jar包
与hibernate类似,mybatis的配置也存在全局配置文件
我们在测试类中使用mybatis时,通常使用以下的套路
public static void main(String[] args) throws Exception {
//获取xml文件的路径
String resource = "config/SqlMapConfig.xml";
//配置路径
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlFactory.openSession();
/*
* 你想做的操作
* */
sqlSession.close();
}
在介绍dao之前,必须先引入User的model(省略set/get方法)和数据表字段
package com.sjg.model;
import java.util.Date;
public class User {
private Integer id;
private String username;
private String sex;
private Date birthday;
private String address;
在了解了基本的model和数据表之后,直接上相应的xml配置文件和相应的dao(也就是所谓的mapper映射文件)
SELECT
LAST_INSERT_ID()
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
package com.sjg.dao;
import com.sjg.model.User;
//注意定义的是接口,此类为所谓的Mapper接口
public interface UserMapper {
//插入一个学生的信息,方法名要与UserMapper.xml中的insert标签的id相一致
void insertinsertUser();
//查询某个学生的信息,方法名要与UserMapper.xml中的select标签的id相一致
User getUserById();
}
public static void main(String[] args) throws Exception {
//获取xml文件的路径
String resource = "config/SqlMapConfig.xml";
//配置路径
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlFactory.openSession();
//获得相应的mapper映射文件
UserMapper dao = sqlSession.getMapper(UserMapper.class);
//取得id为1的用户信息
User user = dao.getUserById(1);
System.out.println(user);
/*id=1, username=jack, sex=1,
* birthday=Wed Apr 25 00:00:00 CST 2018, address=政府
*/
User user1 = new User();
user1.setUsername("eee");
dao.insertUser(user1);
//提交事务
sqlSession.commit();
sqlSession.close();
}
}
在数据库中也是成功插入了,在此就不截图了。
如果想进行更多的基本操作,只需要仿照xml中的配置,写入相应的select或者insert等等语句,进行测试和使用
与hibernate一样,持久层的框架都离不开上述三个关系,mybatis给出了一个特别好的解决办法,就是在xml文件中加入
我们举个例子,学生和学生对应的学生号,是一一对应的。当然,在讲述之前,先列出model(无set/get)和数据表
package com.sjg.model;
public class StudentInfo {
private Integer studentId;
private String card;
package com.sjg.model;
import java.util.List;
public class Student {
private Integer studentId;
private String studentName;
private Integer age;
private Integer classId;
private StudentInfo stuInfo;//此为一对一的关键
重点在于两个xml配置文件
最后,列出相应的dao文件
package com.sjg.dao;
import java.util.List;
import com.sjg.model.Student;
public interface StudentDao {
//方法名与StudentDao.xml中select标签的id一致,此后不再提示
List selectAllStudent();
}
public static void main(String[] args) throws Exception {
//获取xml文件的路径
String resource = "config/SqlMapConfig.xml";
//配置路径
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlFactory.openSession();
//获得相应的mapper映射文件
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//取得id为1的用户信息
List list = dao.selectAllStudent();
System.out.println(list);
/*
* [
studentId=10001, studentName=张三, age=20, classId=1001, stuInfo=studentId=10001, card=12345
,
studentId=10002, studentName=李四, age=21, classId=1001, stuInfo=studentId=10002, card=54321
,
studentId=10003, studentName=王五, age=22, classId=1002, stuInfo=studentId=10003, card=23233
]
* */
sqlSession.close();
}
}
可以看出,我们查出了StudentInfo中的card
我们假设一个同学只能选择一门课程,那么对于课程来说,就是“一”,而学生就是“多”
package com.sjg.model;
import java.util.List;
public class Classes {
private Integer classId;
private String className;
private List studentList;//一对多的关键
student的model和表参考上面给出的
重点依旧是xml文件的配置
resultMap="com.sjg.dao.StudentInfoDao.StudentInfoMap">
public static void main(String[] args) throws Exception {
//获取xml文件的路径
String resource = "config/SqlMapConfig.xml";
//配置路径
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlFactory.openSession();
//获得相应的mapper映射文件
ClassesDao dao = sqlSession.getMapper(ClassesDao.class);
//取得id为1的用户信息
List list = dao.selectAllClasses();
System.out.println(list);
/*
* [classId=1001, className=语文, studentList=[
studentId=10001, studentName=张三, age=20, classId=1001, stuInfo=studentId=10001, card=null
,
studentId=10002, studentName=李四, age=21, classId=1001, stuInfo=studentId=10002, card=null
], classId=1002, className=数学, studentList=[
studentId=10003, studentName=王五, age=22, classId=1002, stuInfo=studentId=10003, card=null
]]
* */
sqlSession.close();
}
}
结果与数据库结果相一致
一个老师可以有多个学生,一个学生也可以有多个老师,体现多对多的关系,中间还需要一个中间表
在多对多先列出数据表
student的依旧参考上面的
认清了表之后,我们来看一下model
package com.sjg.model;
import java.util.List;
public class Teacher {
private Integer teacherId;
private String teacherName;
private List stuList;//多对多
TSRelation(model)
package com.sjg.model;
public class TSRelation {
private Teacher teacher;
private Student student;
Student(model)
package com.sjg.model;
import java.util.List;
public class Student {
private Integer studentId;
private String studentName;
private Integer age;
private Integer classId;
private StudentInfo stuInfo;
private List teacherList;//多对多
可以看到,多对多就是在一对多的基础上,在“一”的那一方加入了相应的集合元素
和一对多很相似,那么接下来进行测试
public static void main(String[] args) throws Exception {
//获取xml文件的路径
String resource = "config/SqlMapConfig.xml";
//配置路径
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlFactory.openSession();
//获得相应的mapper映射文件
TeacherDao dao = sqlSession.getMapper(TeacherDao.class);
//取得id为1的用户信息
List list = dao.selectAllTeacher();
System.out.println(list);
/*
* [teacherId=1, teachername=张老师, stuList=[
studentId=10001, studentName=张三, age=20, classId=1001, stuInfo=studentId=10001, card=null
,
studentId=10002, studentName=李四, age=21, classId=1001, stuInfo=studentId=10002, card=null
,
studentId=10003, studentName=王五, age=22, classId=1002, stuInfo=studentId=10003, card=null
], teacherId=2, teachername=李老师, stuList=[
studentId=10001, studentName=张三, age=20, classId=1001, stuInfo=studentId=10001, card=null
,
studentId=10003, studentName=王五, age=22, classId=1002, stuInfo=studentId=10003, card=null
]]
* */
sqlSession.close();
}
}
此时输出结果以老师的角度来看各个老师又多少个学生,如果想从学生的角度来看有多少老师,只需要更改一下xml文件中的resultMap标签中的内容即可
public static void main(String[] args) throws Exception {
//获取xml文件的路径
String resource = "config/SqlMapConfig.xml";
//配置路径
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlFactory.openSession();
//获得相应的mapper映射文件
TeacherDao dao = sqlSession.getMapper(TeacherDao.class);
//取得id为1的用户信息
List list = dao.selectAllTeacher();
System.out.println(list);
/*
* [
studentId=10001, studentName=张三, age=20, classId=1001, stuInfo=null
,teacherList=[teacherId=1, teachername=张老师, stuList=null, teacherId=2, teachername=李老师, stuList=null],
studentId=10002, studentName=李四, age=21, classId=1001, stuInfo=null
,teacherList=[teacherId=1, teachername=张老师, stuList=null],
studentId=10003, studentName=王五, age=22, classId=1002, stuInfo=null
,teacherList=[teacherId=2, teachername=李老师, stuList=null, teacherId=1, teachername=张老师, stuList=null]
]
*/
sqlSession.close();
}
}
至此,mybatis最基本的使用和配置已经介绍完毕了,mybatis的使用和细节还有很多,在实际开发中遇到了才会知道。关于mybatis的缓存,有精力了再往下写一些,本篇侧重于最基本的使用和配置。
如需转载请注明出处。
Mybatis官方技术文档:点击打开链接