MyBatis因其性能优异,且具有高度的灵活性、可优化性和易于维护等特点使其成为当前主流的Java持久层框架之一。
1. 什么是MyBatis?
MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。
MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。ORM框架的工作原理如下:
☆ Hibernate与MyBatis有什么区别?
Hibernate | MyBatis |
---|---|
Hibernate是一个全表映射的框架。 | MyBatis是一个半自动映射的框架。 |
通常开发者只需定义好持久化对象到数据库表的映射关系,就可以通过Hibernate提供的方法完成持久层操作。 | “半自动”是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系,而Hibernate只需提供POJO和映射关系即可。 |
开发者并不需要熟练的掌握SQL语句的编写,Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口来执行,所以其开发效率会高于MyBatis。 | 与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,它还支持存储过程等。对于一些复杂的和需要优化性能的项目来说,显然使用MyBatis更加合适。 |
Hibernate也存在一些缺点,例如它在多表关联时,对SQL查询的支持较差;更新数据时,需要发送所有字段;不支持存储过程;不能通过优化SQL来优化性能等。 |
2. MyBatis的工作原理
MyBatis下载地址: https://github.com/mybatis/mybatis-3/releases
3. MyBatis的初步使用
现在我们对MyBatis有了初步的认识,在对MyBatis进行详解之前,我们通过一个学生信息管理的案例来感受一下MyBatis带来的魅力——分别从学生信息查询、学生信息添加、学生信息更新、学生信息删除来讲解。
在Navicat for MySQL中创建一个student_info的数据库,在此数据库中创建一个student表,包括学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage),插入几条数据。
在Eclipse中,创建一个名为MyBatisTest的Web项目,将MyBatis的核心JAR包、lib目录中的依赖JAR包,以及MySQL数据库的驱动JAR包都添加到项目lib目录下,并发布到类路径中。因为MyBatis默认使用log4j输出日志信息,我们需要在classpath路径下配置日志文件——在src目录下创建log4j.properties,内容如下。
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.example=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在此文件中,包含了全局的日志配置、MyBatis的日志配置和控制台输出,MyBatis的日志输出用于将创建的包中所有类的日志记录级别设置为DEBUG。log4j文件中具体内容不再解释,有兴趣的可以自己百度资料了解下。
在src目录下,创建一个com.example.po包,创建持久化类Student。
package com.example.po;
//学生持久化类
public class Student {
private int Sno; //学号
private String Sname; //姓名
private String Ssex; //性别
private int Sage; //年龄
public int getSno() {
return Sno;
}
public void setSno(int sno) {
Sno = sno;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public int getSage() {
return Sage;
}
public void setSage(int sage) {
Sage = sage;
}
@Override
public String toString() {
return "Student [Sno=" + Sno + ", Sname=" + Sname + ", Ssex=" + Ssex + ", Sage=" + Sage + "]";
}
}
3.1 学生信息查询
3.1.1 根据学生学号查询学生信息
(1).在src目录下,创建一个com.example.mapper包,创建映射文件StudentMapper.xml。
此文件中,第2~3行是MyBatis的约束配置,从第5行开始,是编写的映射信息,<mapper>元素是配置文件的根元素,包含namespace属性,为<mapper>指定了唯一的命名空间,通常设置成“包名+SQL映射文件名”的形式。子元素<select>中的信息是用于执行查询操作的配置,其中id属性是<select>在映射文件中的唯一标识,parameterType属性用于指定传入参数的类型,resultType属性用于指定返回结果的属性,这里返回的Student类型。在定义的查询SQL语句中,“#{}”用于表示一个占位符,相当于“?”,“#{Sno}”表示该占位符待接收参数的名称为Sno。
<?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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.example.mapper.StudentMapper">
<!--根据学生学号查询学生信息 -->
<select id="selectStudentBySno" parameterType="int"
resultType="com.example.po.Student">
select * from student where Sno = #{Sno}
</select>
</mapper>
(2).在src目录下,创建MyBatis的核心配置文件MyBatis-config.xml。
<?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>
<!--1.配置环境 ,默认的环境id为mysql-->
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!--数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/student_info?useSSL=false" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
<mapper resource="com/example/mapper/StudentMapper.xml" />
</mappers>
</configuration>
(3).在src目录下,创建一个com.example.test包,创建测试类selectStudentBySnoTest。
package com.example.test;
import java.io.InputStream;
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 com.example.po.Student;
public class selectStudentBySnoTest {
public static void main(String[] args) throws Exception {
// 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
// 2、根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// 3、通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果
Student student = sqlSession.selectOne("com.example.mapper.StudentMapper.selectStudentBySno", 1001);
// 打印输出结果
System.out.println(student.toString());
// 5、关闭SqlSession
sqlSession.close();
}
}
运行结果:
3.1.2 根据学生名模糊查询学生信息
(1).在映射文件StudentMapper.xml中,添加以下代码。
SQL语句中的“$ { }”用来表示拼接SQL的字符串,即不加解释的原样输出,“${value}”表示要拼接的是简单类型参数。concat(’%’,#{value},’%’)用concat()函数进行字符串拼接。
<!--根据学生名模糊查询学生信息 -->
<select id="selectStudentBySname" parameterType="String"
resultType="com.example.po.Student">
<!-- select * from student where Sname like '%${value}' -->
select * from student where Sname like concat('%',#{value},'%')
</select>
(2).在com.example.test中,编写测试类。
package com.example.test;
import java.io.InputStream;
import java.util.List;
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 com.example.po.Student;
public class selectStudentBySnameTest {
public static void main(String[] args) throws Exception {
// 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
// 2、根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// 3、通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果
List<Student> students = sqlSession.selectList("com.example.mapper.StudentMapper.selectStudentBySname", "c");
// 打印输出结果
for(Student student : students){
System.out.println(student);
}
// 5、关闭SqlSession
sqlSession.close();
}
}
运行结果:
3.2 学生信息查询
(1).在映射文件StudentMapper.xml中,添加以下代码。
<!-- 添加学生信息 -->
<insert id="addStudent" parameterType="com.example.po.Student">
insert into student(Sname,Ssex,Sage)
values(#{Sname},#{Ssex},#{Sage})
</insert>
(2).在com.example.test中,编写测试类。
package com.example.test;
import java.io.InputStream;
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 com.example.po.Student;
public class addStudentTest {
public static void main(String[] args) throws Exception{
// 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2、根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// 3、通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4、SqlSession执行添加操作
// 4.1创建Customer对象,并向对象中添加数据
Student student = new Student();
student.setSname("Anna");
student.setSsex("女");
student.setSage(18);
// 4.2执行SqlSession的插入方法,返回的是SQL语句影响的行数
int rows = sqlSession.insert("com.example.mapper"
+ ".StudentMapper.addStudent", student);
// 4.3通过返回结果判断插入操作是否执行成功
if(rows > 0){
System.out.println("您成功插入了"+rows+"条数据!");
}else{
System.out.println("执行插入操作失败!!!");
}
// 4.4提交事务
sqlSession.commit();
// 5、关闭SqlSession
sqlSession.close();
}
}
运行结果:
3.3 学生信息更新
(1).在映射文件StudentMapper.xml中,添加以下代码。
<!-- 更新学生信息 -->
<update id="updateStudent" parameterType="com.example.po.Student">
update student set
Sname=#{Sname},Ssex=#{Ssex},Sage=#{Sage}
where Sno=#{Sno}
</update>
(2).在com.example.test中,编写测试类。
package com.example.test;
import java.io.InputStream;
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 com.example.po.Student;
public class updateStudentTest {
public static void main(String[] args) throws Exception{
// 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2、根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// 3、通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4、SqlSession执行添加操作
// 4.1创建Customer对象,并向对象中添加数据
Student student = new Student();
student.setSno(1004);
student.setSname("Anna");
student.setSsex("女");
student.setSage(21);
// 4.2执行SqlSession的插入方法,返回的是SQL语句影响的行数
int rows = sqlSession.insert("com.example.mapper.StudentMapper.updateStudent", student);
// 4.3通过返回结果判断插入操作是否执行成功
if(rows > 0){
System.out.println("您成功修改了"+rows+"条数据!");
}else{
System.out.println("执行修改操作失败!!!");
}
// 4.4提交事务
sqlSession.commit();
// 5、关闭SqlSession
sqlSession.close();
}
}
运行结果:
3.4 学生信息删除
(1).在映射文件StudentMapper.xml中,添加以下代码。
<!-- 删除学生信息 -->
<delete id="deleteStudent" parameterType="com.example.po.Student">
delete from student where Sno=#{Sno}
</delete>
(2).在com.example.test中,编写测试类。
package com.example.test;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class deleteStudentTest {
public static void main(String[] args) throws Exception {
// 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
// 2、根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// 3、通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果
int rows = sqlSession.delete("com.example.mapper.StudentMapper.deleteStudent", 1004);
if(rows > 0){
System.out.println("您成功删除了"+rows+"条数据!");
}else{
System.out.println("执行删除操作失败!!!");
}
// 4.4提交事务
sqlSession.commit();
// 5、关闭SqlSession
sqlSession.close();
}
}
运行结果:
MyBatis的操作步骤总结:
1.读取配置文件。
2.根据配置文件构建SqlSessionFactory。
3.通过SqlSessionFactory创建SqlSession。
4.使用SqlSession对象操作数据库
5.关闭SqlSession
这就是MyBatis的初步认识与使用,若有错漏,欢迎指正,希望大家一起学习进步!!!!
如果转载以及CV操作,请务必注明出处,谢谢!