网站首页 > 技术文章 正文
1.简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
当前,最新版本是MyBatis 3.5.5,其发布时间是2020年6月5日。
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.特点
3.原理
(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
项目开发中,重点关注:
两类配置文件(主配置文件sqlmap-config.xml,模块配置文件XxxSqlMap.xml)
一个对象SqlSession对象
4.使用
在maven项目下使用mybatis的基本步骤:
(1)新建maven项目,在pom.xml中设置坐标(jdbc,mybatis,lombok,junit...)
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
<scope>compile</scope>
</dependency>
(2)编写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>
<!-- 环境配置 -->
<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://127.0.0.1:3306/cms?useUnicode=true&characterEncoding=utf8&useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 导入模块配置文件 -->
<mappers>
<!-- 用户管理sql语句xml文件 -->
<mapper resource="raky/train/mapper/UserMapper.xml"/>
</mappers>
</configuration>
(3)编写实体类 User.java
package raky.train.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private String pass;
private Integer age;
}
(4)编写模块配置文件 UserMapper.xml
<?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">
<mapper namespace="raky.train.mapper.UserMapper">
<!-- 映射关系-->
<resultMap type="raky.train.entity.User" id="selectUserResult">
<id column="id" property="id"/>
<result column="name" property="name" />
<result column="pass" property="pass" />
<result column="age" property="age" />
</resultMap>
<!-- 查询列表对象 -->
<select id="getList" resultMap="selectUserResult">
select * from user
</select>
<!-- 查询单个对象 -->
<select id="getOne" parameterType="int" resultType="raky.train.entity.User">
select * from user where id = #{id}
</select>
<!-- 插入数据 -->
<insert id="insert" parameterType="raky.train.entity.User">
insert into user(name,pass,age)values(#{name},#{pass},#{age})
</insert>
<!-- 更新数据 -->
<update id="update" parameterType="raky.train.entity.User">
update user set name=#{name},pass=#{pass},age=#{age} where id=#{id}
</update>
<!-- 删除数据 -->
<delete id="delete" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
(5)编写测试代码
package raky.train;
import java.io.IOException;
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 lombok.extern.slf4j.Slf4j;
import raky.train.entity.User;
/**
* @author raky
*/
@Slf4j
public class TestMyBatis {
public static void main(String[] args) throws IOException {
//1.主配置文件位置
String resource = "mybatis-config.xml";
//2.加载主配置文件 ===》文件输入流 抛出IOException
InputStream inputStream = Resources.getResourceAsStream(resource);
//3.读取配置文件,创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象 ====》Connection对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.通过SqlSession对象针对数据库进行CRUD操作
List<User> userList = sqlSession.selectList("getList"); //selectUser ===> xml(sql)
//6.针对结果进行处理
userList.forEach(x -> log.info("====>{}",x));
}
}
至此,mybatis操作数据库的简单demo创建完成。
猜你喜欢
- 2024-11-21 MyBatis详解(二)
- 2024-11-21 想要开发中灵活的使用Mybatis?精通结果映射,你准了吗?
- 2024-11-21 小学妹问:Mybatis常见注解有哪些?
- 2024-11-21 重学Mybatis(二)-------主键自增 (含面试题)
- 2024-11-21 重学Mybatis(五)-------分页 (含面试题)
- 2024-11-21 一、手写mybatis框架
- 2024-11-21 MyBatis中的翻页
- 2024-11-21 Mybatis的基础和高级查询应用实践
- 2024-11-21 看完这一篇学会MyBatis就够了
- 2024-11-21 MyBatis 总结
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)