jdbc 自增id 原理_给“小白”漫画+图示讲解MyBatis原理,就问香不香

e42bbfe68981914b2c5827dba27451ae.png

MyBatis一款后起之秀的持久层框架ORM,支持自定义SQL、存储过程和高级映射,相对于Hibernate算是半自动化的框架,在国内行业内非常流行。

4d7dc26d8f6cda6ea187dcc41da8ca23.png
5e2ba61e7fb477d9374e3015cbe5a791.png

常规的JDBC操作,配置相应的数据库连接的信息,比如账户密码等,应用加载数据库驱动并手动创建数据库连接,编写业务sql并设置其入参生成Statement对象用于执行,获取结果数据集,及时释放持有资源,再对结果集进行数据处理。

0fa455e94b380950ab51b7161323f453.png

加载驱动、创建连接、返回结果、释放资源等等都是重复的体力活,为了不把自己忙碌成代码的搬运工,这些都可以封装由框架去做,而自己关注最核心的业务层,也就是sql相关的逻辑。

0a642327b982272155920924ec6f6797.png
80f20ceb8b7c6f9baef43738beea95f5.png

把业务相关的sql逻辑配置在mapper.xml文件中,包括入参和返回的结果集,这其中会涉及到数据库中的字段和Java对象的字段之间的映射,一般如果字段名和类型相同可以通过MyBatis的自动映射即可,如果差别较大,则需要手动映射,甚至自定义类型处理typeHandlers。

每个MyBatis的应用都会以一个SqlSessionFacotry的实例为核心的,SqlSessionFacotryBuilder通过build加载核心配置文件mybatis-config.xml,从而创建SqlSessionFacotry,再由SqlSessionFacotry创建SqlSession。

核心配置文件mybatis-config.xml包含mapper.xml文件,在SqlSessionFacotryBuilder加载核心配置文件时一同加载进来,形成Configuration实例,其中mapper.xml的每个select/update/insert/delete节点都会最终生成MappedStatement对象,简单理解就是对应的完整sql语句,类似JDBC的Statement角色。

实际上核心配置文件除了包含mapper.xml,还包含数据库连接、事务、类型别名、类型处理器、插件、环境配置等等。

30e4d61246eed391d12e129155dae4d8.png
472f29a2d32ccd56234705544d6ae383.png

准备工作:创建数据库和项目

创建数据库脚本

CREATE DATABASE `mybatisdemo`;USE mybatisdemo;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

创建maven项目,并在pom中添加mybatis和mysql驱动依赖包

  org.mybatis  mybatis  3.5.5  MySQL  mysql-connector-java  5.1.40

添加核心配置文件mybatis-config.xml

<?xml  version="1.0" encoding="UTF-8" ?>configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd">                                                                                      

UserMapper.xml的配置

包含了插入数据的insert和查询数据的select,其中插入式通过设置useGeneratedKeys为true,返回自增id。

<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">        insert into user(name) values(#{name})          select * from user where id = #{id}                

UserMapper.xml相对应Dao

UserMapper.java的代码如下,包含了相应插入和查询接口

package com.zhaiqianfeng.user;public interface UserMapper {    User getUserById(int id);    int insertUser(User user);}

创建SqlSession并验证

一切都准备好之后,开始创建SqlSession并执行

public static void main( String[] args ) throws IOException {  String config= "mybatis-config.xml";  InputStream inputStream= Resources.getResourceAsStream(config);  //SqlSessionFactoryBuilder加载核心(+mapper)配置文件并创建SqlSessionFactory  SqlSessionFactory sqlSessionFactory=     new SqlSessionFactoryBuilder().build(inputStream);  //创建SqlSession  try(SqlSession sqlSession=sqlSessionFactory.openSession()) {    //获取mapper    UserMapper mapper = sqlSession.getMapper(UserMapper.class);    User user = new User();    user.setName("chris");    //执行操作    mapper.insertUser(user);    sqlSession.commit(); //flush    System.out.println("获取自增id:" + user.getId());    user = mapper.getUserById(user.getId());    System.out.println("刚刚入库的user对象" + user);  }}

此时的项目结构是这样的

d55ba7179c26c5fd75d4dcd38d055050.png

运行main之后打印

获取自增id:1

刚刚入库的user对象User(id=1, name=chris)

查看数据库

bd19466b5de61b075dd56c2a35aa51eb.png

优化

由于本例中的数据库表字段和Java对象的字段名一致,所以在UserMapper.xml中的resultMap可以省略,直接用resultType,mybatis会悄悄自动映射生成resultMap,省略后如

<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">      insert into user(name) values(#{name})        select * from user where id = #{id}  

还可以再简化,比如使用别名替换权限定名(com.zhaiqianfeng.user.User)等。

PS:本篇文章主要是通过漫画和图并结合对比常规JDBC来讲解MyBatis的原理和设计目标,比较适合新手阅读,感谢阅读。

d7cb07013a677eb76978c97ae627e426.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值