初识MyBatis
建立mybatis工程
先不管什么原理不原理,上来就是干呀。
前期准备
建立一个空白的maven工程,添加依赖:
org.mybatis
mybatis
3.5.1
mysql
mysql-connector-java
8.0.16
junit
junit
LATEST
org.projectlombok
lombok
1.18.8
最重要的就是mybatis与mysql依赖,其他的都可以不加入,但具体代码需你自己调整。
再建一张表,简单点就好
CREATE TABLE `fruits` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`fruits_name` VARCHAR ( 40 ) DEFAULT NULL,
`color` VARCHAR ( 20 ) DEFAULT NULL,
`weight` DOUBLE DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY ( `id` )
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4;
建表的时候想吃水果了,所以就建了这么个东西。再随便插入条数据:如
INSERT INTO `test`.`fruits`(`fruits_name`, `color`, `weight`, `created_at`) VALUES ('banana', 'green', 1234.2, '2019-06-18 16:16:35')
前期准备就算完成了。
写配置 本例中只关注mybatis,所以不会有与其他框架整合的配置。
配置与mysql的连接
先建个
mysql.properties
文件(这不是必须的,你可以直接写到mybatis的配置里去)写(根据自己的情况修改):
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=root
下面就是真正的配置,建个
mybatis-config.xml
文件,写入:
【初识MyBatis】
建立表与实体的关系 建实体类
@Data
public class Fruits implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String fruitsName;
private String color;
private Double weight;
private Date createdAt;
private Date updatedAt;
}
lombok大法好呀~
建mapper接口
public interface FruitsMapper {Fruits selectById(Integer id);
}
建实体类的xml文件
在
resource
文件夹下建mapperxml/FruitsMapper.xml
文件:select * from fruits where id=#{id} ;
至此所有的配置文件已经写完了。但是,因为这里只是用了mybatis单一框架,又把映射文件(
FruitsMapper.xml
)放在了自定义文件夹里,所以我们需要给mybatis指定这个文件位置。打开
mybatis-config.xml
文件,在configuration
标签内添加:
那么,无聊的配置工作就可以告一段落了。
构建查询 使用mybatis查询总的来说,就两步:
- 告诉mybatis我们写的配置
- 使用
SqlSession
对象进行查询
如下代码:
private SqlSessionFactory sqlSessionFactory;
@Before
public void config() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void selectOne() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
FruitsMapper mapper = sqlSession.getMapper(FruitsMapper.class);
Fruits fruits = mapper.selectById(1);
System.out.println(fruits);
}
}
如果一切顺利的话,你就可以看到打印出查询的结果了。
那么,我们费了这么大劲写的这个特简单东西到底有什么意思呢?
这个例子虽然简单,但它把mybatis核心组件都用上了。
MyBatis核心组件 从我们的代码来看:
首先是
SqlSessionFactoryBuilder
读取了配置文件,给我们返回了SqlSessionFactory
对象,我们用SqlSessionFactory
对象获取SqlSession
对象,再由SqlSession
对象去获取我们写的mapper
接口,此时就可以使用mapper
接口查询方法了。所以整理出MyBatis核心组件:
-
SqlSessionFactoryBuilder
:读配置文件生成SqlSessionFactory
对象 -
SqlSessionFactory
: 生成SqlSession
对象 -
SqlSession
:执行所写的mapper
接口查询方法
不少书认为sqlSession.getMapper
这样的方法是使用了SQL Mapper
组件,目前尚未看出这个组件在源码里有体现,暂议。不过这个方法确实是以前方法的改进。更老一点的查询方法:
@Test
public void selectOneOld() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
Fruits fruits = sqlSession.selectOne("com.llh.mybatis.mapper.FruitsMapper.selectById", 1);
System.out.println(fruits);
}
}
流程解读
文章图片
流程.png
不支持时序图语法。
基本上一个查询的完整流程就是这样子。
后记 看到打印的结果你可能会奇怪为啥有些字段没值呢(如果你的代码与我保持一致的话)?
首先确认数据库里的值是否存在,如果存在,还是打印不出来的话,那就要来看看这个了。
自动映射 在
mybatis-config.xml
文件里,properties
标签之后(顺序很重要)添加:
然后再次执行查询,你就会惊喜地发现嘛都查不出来了。
这就是mybatis自动映射的功能(关闭方法)。
之前的配置中并没有配置结果字段与Java字段的映射,mybatis会自动把查询结果映射到指定Java类中具有相同名称和setter方法字段上。
字段映射 关闭了自动映射功能,自然就想到使用手动映射。
在
FruitsMapper.xml
文件内mapper
标签内添加:
再给
select
标签添加属性resultMap="BaseMapper"
就可以引用这套映射配置(也就是说你可以整多套配置来满足需要)。如此,之前没有值的字段也就有了值。
备注 MyBatis 自动映射有三种模式:NONE、PARTIAL、FULL。
第一个已经知道了。源码 此文使用项目源码在这里,查看标签v0.1里的代码即可。
第二个是默认项。
第三个会对嵌套对象进行映射。
总结下:第三个基本不会用,如无特殊需求就用默认。事实上配合代码生成工具,用第一个还是第二个配置并没有什么区别。
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 股票型公募基金投资要领
- 碎片化阅读,四步教你建立自己的知识体系
- (六)Component初识组件
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- 明朝建立后,朱元璋大杀功臣,汤和有何过人之处,能够寿终正寝()