Mybaris是什么
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。——mybatis
与Hibiernate区别
我们在没有框架实现的时候一般使用的JDBC来实现数据库的连接,当然还有很多小工具用于简化我们的数据库操作流程(Dbutis、jdbcTemplate等),当我们在进行操作数据库的时候一般有这样几步操作:
编写sql->预编译->设置参数->执行sql->封装结果
我们不直接使用jdbc的原因很简单
1、功能简单,sql语句是直接编写在java代码里面的,非常不方便,硬编码高耦合的方式
Hibernate是一个全自动的ORM(Object Relation Mapping)框架,旨在消除sql,将以上运行sql的几步作为一个黑箱,我们不需要去编写sql,而是Hibernate去实现
1、所有的sql都是框架生成的,我们没有优化空间
2、如果我们想要去定制sql的话,我们需要学习Hibernate自己的数据库操作语言 HQL
3、Hibernate是全映射,如果我们数据库里面有一百个字段,我只需要一个字段,他也会把一百个字段查出来,需要定制只能使用HQL
Mybatis把编写参数开发出来,交给开发人员,这是与Hibernate最大的区别,而且Mybatis是将sql抽取出来,由xml去编写,这样sql就与java分开解耦。
Mybatis是一个半自动的ORM框架,将sql交出去,有开发人员编写灵活性很高
MyBatis使用
Mybatis项目地址
我们下载最新的版本进行学习,使用Mybatis只需要一个jar包即可,非常的轻量级。
HelloWorld
- 首先我们创建一个数据库名字叫
mybatis
,创建一个数据表并且加入一些数据数据库创建好了以后我们开始使用mybatis操作数据库create database mybatis;
use mybatis;
create table tb1_employee
(
id int(11) PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(255),
gender CHAR(1),
email VARCHAR(255)
);
insert into tb1_employee(last_name,gender,email) values("zhulonghao",1,"1127913170@qq.com");
insert into tb1_employee(last_name,gender,email) values("zhulonghao1",1,"11279131701@qq.com");
insert into tb1_employee(last_name,gender,email) values("zhulonghao2",1,"11279131702@qq.com");
insert into tb1_employee(last_name,gender,email) values("zhulonghao3",1,"11279131703@qq.com");
insert into tb1_employee(last_name,gender,email) values("zhulonghao4",1,"11279131704@qq.com"); - 我们创建一个与这张表对象的javabean类
public class employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
} - 导入mybatis的jar包,我们需要导入最主要的两个包mybatis、mysql-connector为了打印日志方便我们可以加入log4j,jar包
也可以使用maven去导入这些jar包,快速方便,这里我选择最原始的方法,熟悉一下。
想要使用log4j,需要写一个log4j的配置文件,首先创建一个资源文件夹,并且标记为资源文件夹,再资源文件夹下编写log4j.properties
# 全局日志配置
ERROR, stdout =
# MyBatis 日志配置
TRACE #这里要写的是mapper映射文件中的命名空间,下文会给出 =
# 控制台输出
org.apache.log4j.ConsoleAppender =
org.apache.log4j.PatternLayout =
%5p [%t] - %m%n =然后还需要在mybatis的全局配置文件中加上
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>创建操作mybatis的xml文件,与log4j的xml文件在一个目录下即可,
因为每个基于MyBatis
的应用都是以一个SqlSessionFactory
的实例为核心的。SqlSessionFactory
的实例可以通过SqlSessionFactoryBuilder
获得。而SqlSessionFactoryBuilder
则可以从 XML 配置文件或一个预先配置的Configuration
实例来构建出SqlSessionFactory
实例。
<configuration>
<!--设置配置打印的日志-->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.8:3306/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--将自己的映射文件添加到主配置中-->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>编写mybatis的测试代码,根据配置文件和
SqlSessionFactoryBuilder
类创建一个SqlSessionFactory
public class main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml"; //这个配置文件为全局配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取到SqlSessionFactory
}
}有了
sqlSessionFactory
我们要想操作sql,还需要从工厂中创建一个sqlSession
,和一个映射sql的xml文件,下面我们来编写xml文件,与全局配置在一个文件夹下即可
<mapper namespace="com.zenshin.employee.employeeMapper">
<!--
namespace:名称空间
id:唯一标识
resultType:返回值类型
#{id}:从参数中传入id值
-->
<select id="selectEmp" resultType="com.zenshin.beans.employee">
select * from tb1_employee where id = #{id}
</select>
</mapper>这个映射文件就是用来操作数据库的sql语句,通过这个xml操作数据库
在main函数中将映射文件和java代码结合起来
SqlSession sqlSession = sqlSessionFactory.openSession();//获取sqlSession实例,sqlSession能直接执行已经映射的sql语句
//找到映射文件的唯一标识:mapping文件的命名空间+id
//后面是参数
Employee emp = sqlSession.selectOne("com.zenshin.Employee.employeeMapper.selectEmp", 1);
System.out.println(emp);
sqlSession.close();//把session关掉这里还有很重要的一点就是我们需要把我们自己的映射文件加到mybatis的全局配置文件中
<!--加到environments节点下面-->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>运行main方法就可以得到结果了
/**
DEBUG [main] - ==> Preparing: select * from tb1_employee where id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <== Columns: id, last_name, gender, email
TRACE [main] - <== Row: 1, zhulonghao, 1, 1127913170@qq.com
DEBUG [main] - <== Total: 1
Employee{id=1, lastName='null', email='1127913170@qq.com', gender='1'} //lastname是null是因为bean中的名字和数据库中的不对应
*/总结一下使用步骤:
- 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,有数据源一些运行环境的信息
- sql映射文件,配置了每一个sql,以及sql的封装规则
- 将sql文件注册到全局配置文件中
- 写代码:
- 根据全局配置文件得到SqlSeeionFactory;
- 使用SqlSession工厂,获取到sqlSession对象使用它来进行增删改查,一个SqlSession就代表和数据库的一次会话,用完关闭
接口式编程
接口和映射文件的动态绑定
- 首先我们定义一个接口
public interface EmployeeMapper {
//这里定义一个方法,方法要实现的sql在配置文件中
public Employee getEmpByid(Integer id);
} - 编写配置文件与接口绑定
<mapper namespace="com.zenshin.dao.EmployeeMapper">
<!--
namespace:写要绑定的接口的全类名
id:接口要绑定的函数名
resultType:返回值类型
#{id}:从参数中传入id值
-->
<select id="getEmpByid" resultType="com.zenshin.beans.Employee">
select * from tb1_employee where id = #{id}
</select>
</mapper> - 编写测试类,调用接口获取数据这样调用是实现了接口隔离,更加简单,更加灵活同时与xml的耦合更低了。
public class main {
public static void main(String[] args) throws IOException {
//1、获取SqlSessionFactory
String resource = "mybatis-config.xml"; //这个配置文件为全局配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取到SqlSessionFactory
//2、获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、获取接口实现类对象,这是创建了一个代理对象,代理对象去实现增删改查
EmployeeMapper sessionMapper = sqlSession.getMapper(EmployeeMapper.class);
//4、调用接口的方法
Employee employee = sessionMapper.getEmpByid(1);
System.out.println(employee);
sqlSession.close();
}
}
注解式编程
MyBatis还有一种方式,就是纯注解的方式实现,不需要编写xml映射文件.
- 首先我们创建一个接口类,给接口类标上
@Mapper
注解,方法上标注@Select()
public interface EmployeeMapper {
"select * from tb1_employee where id = #{id}") (
public Employee getEmpByid(Integer id);
} - 加入
@Mapper
主要是用于结合spring使用,通过扫描该注解加入到容器中,然后从容器中获取再使用,因为我们现在不依赖于spring,所以我们需要把这个接口加到mybatis的全局配置类中<!--mappers扫描包-->
<mappers>
<package name="com.zenshin.dao"/>
</mappers> - 使用的方式与原来一样,只是没有了配置文件,所有的sql语句都是基于注解去写的
public class main {
public static void main(String[] args) throws IOException {
//1、获取SqlSessionFactory
String resource = "mybatis-config.xml"; //这个配置文件为全局配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取到SqlSessionFactory
//2、获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、获取接口实现类对象,这是创建了一个代理对象,代理对象去实现增删改查
EmployeeMapper sessionMapper = sqlSession.getMapper(EmployeeMapper.class);
//4、调用接口的方法
Employee employee = sessionMapper.getEmpByid(1);
System.out.println(employee);
sqlSession.close();
}
} - 运行方法产生的效果是和映射文件的效果是一样的。
总结
1、Mybatis编程方式一共有两大种
- 直接加载映射文件,使用SqlSession提供的方法调用sql语句操作数据库
- 使用接口方式,使用接口方式有两种
- 使用接口加映射文件的方式,实现sql操作
- 使用接口加注解的方式,实现操作sql
2、SqlSession代表和数据库的一次会话,用完需要关闭。SqlSession与connection一样都是非线程安全的,每次使用都应该获取新的对象。
3、mapper没有实现类,但是mybatis会为这个接口生成一个代理对象,这个代理对象把接口和xml进行绑定。
4、两个重要的配置文件:
- mybatis的全局配置文件,包含数据库连接池,事务管理器等。。。系统运行环境信息
- sql映射文件,保存了每一个sql语句的映射信息。