本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。欢迎转载,转载请注明出处(https://blog.csdn.net/feng_xiaoshi/article/details/105776373),谢谢。
简介
MyBatis 是一个开源的持久性框架,它简化了 Java 应用程序中数据库访问的实现。它提供对自定义 SQL,存储过程和高级映射(不同类型的映射关系的支持)。
MyBatis 是 Apache iBatis 的开源项目。在2010年,该项目从 apache 软件基础迁移到了 Google 代码,并重命名为 MyBatis。2013年11月移至 Github。
MyBatis 消除了几乎所有 JDBC 代码和参数的手动设置以及结果集的检索。MyBatis 使用简单的 XML 或注释进行配置和原始映射,映射接口以及 Java POJO(普通普通 Java 对象)来记录数据库中的记录。
半自动化特性
初次接触 MyBatis,总是会接触 Mybatis 风格是半自动 ORM 映射工具,它和自动有什么区别的疑问。
这是由于与 Hibernate 框架进行对比,因为 Hibernate 是一个全自动的 ORM 映射工具。当使用 Hibernate 查询关联对象或关联集合对象时,可以根据对象关系模型直接获取,因此是全自动的。当 Mybatis 查询关联的对象或关联的集合对象时,它需要手动编写 sql 才能完成,同构灵活地配置 XML 或标注运行的 SQL 语句,并映射 Java 对象和 sql 语句,执行 sql,因此它被称为半自动 ORM 映射工具。
与 Hibernate 的区别
上面说了 Hibernate 的自动化不同,MyBatis 是半自动化框架。下面讨论还有其他什么区别。
- Mybatis 具有较低的学习门槛,易于学习。程序员直接编写原始的 sql,可以严格控制sql的执行性能,具有很高的灵活性。它非常适合对关系数据模型要求不高的软件开发,例如 互联网软件和企业运营软件。,因为对这种软件的需求经常变化,所以一旦需求变化,结果的输出就很快。但是,灵活性的前提是 mybatis 无法实现数据库独立性。如果需要实现支持多个数据库的软件,则需要自定义多组sql映射文件,这是很多重复的工作。
- Hibernate 对象/关系映射能力强,数据库独立性好,对关系模型有很高要求的软件(如定点定制软件)可以节省大量代码,提高效率。但是 Hibernate 的缺点是学习门槛高,掌握门槛高以及如何设计 O/R 映射。如何在性能和对象模型之间取得平衡,以及如何使用Hibernate,需要大量的经验和能力。
简而言之,只要在有限的资源环境中根据用户的需求,只要软件架构的维护和可伸缩性是一个好的架构,那么该架构就是最好的。MyBatis 和 Hibernate 并没有谁优谁劣之分。
Maven 依赖
pom.xml 中添加依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
配置信息
在配置文件中配置如下信息:
数据库配置
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
日志配置
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
SQLSessionFactory
SQLSessionFactory 是每个 MyBatis 应用程序的核心类。分为手动加载和自动加载两种方式:
自动加载
自动加载类逻辑:MybatisAutoConfig.java
String resource = "mybatis-config.xml";
InputStream inputStream Resources.getResourceAsStream(resource);
SQLSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Mybats 配置文件: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>
<!-- Load jdbc.properties -->
<properties resource="jdbc.properties"></properties>
<!-- 配置别名扫描 -->
<!-- 通过包扫描,类名不区分大小写 -->
<typeAliases>
<!-- <typeAlias type="cn.xxs.pojo.User" alias="user"/> -->
<package name="cn.xxs.pojo"/>
</typeAliases>
<!-- 环境配置 -->
<environments default="development">
<environment id="development">
<!-- JDBC 连接管理方式 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 映射接口和xml文件 -->
<mappers>
<!-- Mapper 映射 xml 文件 -->
<!-- <mapper resource="UserMapper.xml"/> -->
<!-- 配置 Mapper 接口所在的路径 -->
<package name="cn.xxs.mapper"/>
</mappers>
</configuration>
手动加载
手动加载类逻辑:MybatisManualConfig.java
public static SqlSessionFactory buildqlSessionFactory() {
DataSource dataSource
= new PooledDataSource(DRIVER, URL, USERNAME, PASSWORD);
Environment environment
= new Environment("Development", new JdbcTransactionFactory(), dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(StudentMapper.class);
// ...
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
return builder.build(configuration);
}
Student 映射接口:StudentMapper.java
package cn.xxs.mapper;
import java.util.List;
import cn.xxs.pojo.Student;
public interface StudentMapper {
/**
* 根据学生id 查询学生
* @param id
* @return
*/
public Student getStudentById(Integer studentId);
/**
* 插入学生数据
* @param user
*/
public void addStudent(Student student);
/**
* 修改学生数据
* @param user
*/
public void updateStudent(Student student);
/**
* 根据学生id 删除学生数据
* @param id
*/
public void delStudent(Integer student);
/**
* 批量查询
* @param studentName
* @return
*/
public List<Student> getStudentByName(String studentName);
}
SQLSession
SQLSession包含用于执行数据库操作,获取映射器和管理事务的方法。可以从SQLSessionFactory类实例化它。注意:该类的实例不是线程安全
的。执行数据库操作后,应关闭会话。
// SqlSession实现了AutoCloseable接口,可以使用try-with-resources
try(SqlSession session = sqlSessionFactory.openSession()) {
// do work
}
Mapper 文件
上面介绍的 UserMapper.java 文件就是 Mapper 文件,下面是与之配套的映射文件:
<?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 Name #{}: Placeholder, equivalent to jdbc?-->
<mapper namespace="cn.xxs.mapper.StudentMapper">
<!-- id: sql中语句的唯一标识符
parameterType : 输入参数的数据类型
resultType: 返回结果的数据类型
-->
<select id="getStudentById" parameterType="int" resultType="student">
select * from tblstudent where studentId = #{studentId}
</select>
<insert id="addStudent" parameterType="student">
insert into tblstudent(studentId,studentName,age,studentNo,birthDay)
values(#{studentId},#{studentName},#{age},#{studentNo},#{birthDay})
</insert>
<update id="updateStudent" parameterType="student">
update tblstudent set studentName = #{studentName},
age = #{age}
where studentId = #{studentId}
</update>
<delete id="delStudent" parameterType="int">
delete from tblstudent where studentId = #{studentId}
</delete>
<select id="getStudentByName" parameterType="String" resultType="student">
select * from tblstudent where studentName LIKE "%"#{studentName}"%"
<!-- select * from tblstudent where studentName LIKE concat(concat('%',#{studentName}),'%') -->
</select>
</mapper>
注解方式实现
public interface PersonMapper {
/**
* 根据学生id 查询学生
* @param id
* @return
*/
@Select("select * from tblstudent where studentId = #{studentId}")
public Student getStudentById(Integer studentId);
/**
* 插入学生数据
* @param user
*/
@Insert("insert into tblstudent(studentId,studentName,age,studentNo,birthDay)"+
" values(#{studentId},#{studentName},#{age},#{studentNo},#{birthDay})")
public void addStudent(Student student);
/**
* 修改学生数据
* @param user
*/
@Update("update tblstudent set studentName = #{studentName},"+
" age = #{age}"+
" where studentId = #{studentId} ")
public void updateStudent(Student student);
/**
* 根据学生id 删除学生数据
* @param id
*/
@Delete("Delete from tblstudent where studentId=#{student}")
public void delStudent(Integer student);
/**
* 批量查询
* @param studentName
* @return
*/
@Select("select * from tblstudent where studentName = #{studentName}")
public List<Student> getStudentByName(String studentName);
}
总结
在本文中,简单介绍了 MyBatis 的使用和依赖,MyBatis 提供的不同功能如:查询、更新、删除、新增。以及如何通过注解简化面向数据库的应用程序的开发。
参考资料
Quick Guide to MyBatis (MyBatis快速指南)
Mybatis implementation principle and simple additions, deletions and changes (Mybatis的实现原理以及简单的添加,删除和更改)
Mybatis Mapper implementation mechanism and principle(Mybatis Mapper的实现机制和原理)
mybatis 官网