Mybatis配置及使用

1、Mybatis与hibernate的区别

Mybatis技术特点:

1、  通过直接编写SQL语句,可以直接对SQL进行性能的优化;

2、  学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;

3、  由于直接编写SQL语句,所以灵活多变,代码维护性更好。

4、  不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。

Hibernate技术特点:

1、 标准的orm框架,程序员不需要编写SQL语句。

2、  具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。

3、  学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。

4、  程序员不能自主的去进行SQL性能优化。

关于mybatis执行原理,网上一搜一大堆,此篇博客只讲述使用以及配置!!!!


2、Mybatis基本配置

在介绍配置之前,先来看看工程的目录图(此后的文件很多,如果对不上了来看看目录图)

Mybatis配置及使用_第1张图片

再来看看mybatis遇到的jar包

Mybatis配置及使用_第2张图片其中junit为测试包,junit以上为mybatis必须的jar包


2.1 全局配置(SqlMapConfig.xml)

与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();
	}

2.2 Mybatis开发dao(dao包下的局部配置)

在介绍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;

Mybatis配置及使用_第3张图片

在了解了基本的model和数据表之后,直接上相应的xml配置文件和相应的dao(也就是所谓的mapper映射文件)

UserMapper.xml






	
	
	
	
	
	
	
		
			SELECT
			LAST_INSERT_ID()
		

		INSERT INTO USER
		(username,birthday,sex,address)
		VALUES(#{username},#{birthday},#{sex},#{address})
	
	

UserMapper

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等等语句,进行测试和使用


3.Mybatis的一对一、一对多、多对多

与hibernate一样,持久层的框架都离不开上述三个关系,mybatis给出了一个特别好的解决办法,就是在xml文件中加入标签,这个标签十分强大,利用xml文件具有标签中套有标签,层次性非常强的特点,将上述三种关系完美的表达出来,具体使用在例子中进行详细的讲解。

3.1 一对一

我们举个例子,学生和学生对应的学生号,是一一对应的。当然,在讲述之前,先列出model(无set/get)和数据表

StudentInfo(model)

package com.sjg.model;

public class StudentInfo {
	private Integer studentId;
	private String card;

student_info(表)


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;//此为一对一的关键

student(表)

Mybatis配置及使用_第4张图片

Mybatis配置及使用_第5张图片

重点在于两个xml配置文件

StudentDao.xml


 


	
	
		
		
		
		
		
		
		
	
	
	
	

StudentInfo.xml


 



	
		
		
	
	
	

最后,列出相应的dao文件

StudentDao

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


3.2 一对多

我们假设一个同学只能选择一门课程,那么对于课程来说,就是“一”,而学生就是“多”

Classes(model)

package com.sjg.model;

import java.util.List;

public class Classes {
	private Integer classId;
	private String className;
	
	private List studentList;//一对多的关键

classes(表)

Mybatis配置及使用_第6张图片


student的model和表参考上面给出的

重点依旧是xml文件的配置

ClassesDao.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();
	}
}

结果与数据库结果相一致

3.3 多对多

一个老师可以有多个学生,一个学生也可以有多个老师,体现多对多的关系,中间还需要一个中间表

在多对多先列出数据表

teacher(表)

Mybatis配置及使用_第7张图片
ts_relation(关系表)

Mybatis配置及使用_第8张图片

Mybatis配置及使用_第9张图片

student的依旧参考上面的

认清了表之后,我们来看一下model

Teacher(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;//多对多
可以看到,多对多就是在一对多的基础上,在“一”的那一方加入了相应的集合元素
重点还是在xml


TeacherDao.xml


 



	
		
		
		
			
			
			
			
			
			
		
	
	
	

和一对多很相似,那么接下来进行测试

测试类

	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标签中的内容即可

修改后的Teacher.xml


 



	
		
		
		
		
		
			
			
		
	
	
	

测试类

	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();
	}
}

4.总结

至此,mybatis最基本的使用和配置已经介绍完毕了,mybatis的使用和细节还有很多,在实际开发中遇到了才会知道。关于mybatis的缓存,有精力了再往下写一些,本篇侧重于最基本的使用和配置。

如需转载请注明出处。

Mybatis官方技术文档:点击打开链接

 http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

你可能感兴趣的:(web)