Mybatis的介绍

mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。

Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。

Mybatis会将输入参数、输出结果进行映射。


Mybatis与Hibernate的区别及各自应用场景

Mybatis技术特点:
1、  通过直接编写SQL语句,可以直接对SQL进行性能的优化;
2、  学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
3、  由于直接编写SQL语句,所以灵活多变,代码维护性更好。
4、  不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。
5、  需要编写结果映射。
Hibernate技术特点:
1、  标准的orm框架,程序员不需要编写SQL语句。
2、  具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
3、  学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
4、  程序员不能自主的去进行SQL性能优化。
Mybatis应用场景:
需求多变的互联网项目,例如电商项目。Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。

分析JDBC的问题

1、 在创建连接时,存在硬编码
解决:配置文件(全局配置文件)
2、 在执行statement时存在硬编码
解决:配置文件(映射文件)
3、 频繁的开启和关闭数据库连接,会造成数据库性能下降。
解决:数据库连接池(全局配置文件)


Mybatis的框架原理


入门案例一

数据库


1.创建普通的Java项目,导入Mybatis的jar包、mysql驱动包以及Junit包
目录结构如下

2.关键的是Mybatis的全局配置文件(MybatisConfig.xml)以及映射文件(User.xml),文件命名无硬性要求

<!-- MybatisConfig.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><!-- 加载java的配置文件或者声明属性信息 --><properties resource="db.properties"><property name="db.username" value="root" /><property name="db.password" value="root" /></properties><!-- 配置mybatis的环境信息,与spring整合时,该信息由spring来管理 --><environments default="development"><environment id="development"><!-- 配置JDBC事务控制,由mybatis进行管理 --><transactionManager type="JDBC"></transactionManager><!-- 配置数据源,采用mybatis连接池 --><dataSource type="POOLED"><property name="driver" value="${db.driver}" /><property name="url" value="${db.url}" /><property name="username" value="${db.username}" /><property name="password" value="${db.password}" /></dataSource></environment></environments><!-- 加载映射文件 --><mappers><mapper resource="User.xml" /></mappers>
</configuration>
<!-- User.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">
<!-- namespace:命名空间,对statement的信息进行分类管理 -->
<!-- 注意:在mapper代理时,它具有特殊及重要的作用 -->
<mapper namespace="User"><!-- 根据用户ID查询用户信息 --><!-- select:表示一个MappedStatement对象 --><!-- id:statement的唯一标示 --><!-- #{}:表示一个占位符? --><!-- #{id}:里面的id表示输入参数的参数名称,如果该参数是简单类型,那么#{}里面的参数名称可以任意 --><!-- parameterType:输入参数的java类型 --><!-- resultType:输出结果的所映射的java类型(单条结果所对应的java类型) --><select id="findUserById" parameterType="int" resultType="com.zyj.mybatis.domain.User">select * from user where id = #{id}</select><!-- 根据用户名称模糊查询用户列表 --><!-- ${}:表示一个sql的连接符 --><!-- ${value}:里面的value表示输入参数的参数名称,如果该参数是简单类型,那么${}里面的参数名称必须是value --><!-- ${}这种写法存在sql注入的风险,所以要慎用!!但是在一些场景下,必须使用${},比如排序时,动态传入排序的列名,${}会原样输出,不加解释 --><select id="findUsersByName" parameterType="java.lang.String" resultType="com.zyj.mybatis.domain.User">select * from user where username like '%${value}%'</select><!-- 添加用户 --><!-- selectKey:查询主键,在标签内需要输入查询主键的sql --><!-- order:指定查询主键的sql和insert语句的执行顺序,相当于insert语句来说 --><!-- LAST_INSERT_ID:该函数是mysql的函数,获取自增主键的ID,它必须配合insert语句一起使用 --><insert id="addUser" parameterType="com.zyj.mybatis.domain.User"><selectKey keyProperty="id" resultType="int" order="AFTER">select last_insert_id()</selectKey>insert into user(username) values(#{username})</insert><!-- 自增主键之UUID --><insert id="addUser2" parameterType="com.zyj.mybatis.domain.User2"><!-- ID使用UUID时,order需要设置为BEFORE,否则无法在插入数据前获取UUID,结果ID为空,导致插入失败 --><selectKey keyProperty="id" resultType="string" order="BEFORE">select uuid()</selectKey>insert into user2(id, username) values(#{id}, #{username})</insert>
</mapper>
public class APITest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws IOException {// 读取配置文件String resource = "MybatisConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void findUserByIdTest() throws IOException {// 开启sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过sqlSession执行executor获取结果// 第一个参数:表示statement的唯一标示User user = sqlSession.selectOne("User.findUserById", 1);System.out.println(user);// 关闭资源sqlSession.close();}@Testpublic void findUserByNameTest() throws IOException {// 开启sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过sqlSession执行executor获取结果// 第一个参数:表示statement的唯一标示List<Object> selectList = sqlSession.selectList("User.findUserByName", "小明");System.out.println(selectList);// 关闭资源sqlSession.close();}@Testpublic void addUserTest() throws IOException {// 开启sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过sqlSession执行executor获取结果// 第一个参数:表示statement的唯一标示User2 user2 = new User2();user2.setUsername("张育嘉");sqlSession.insert("User.addUser2", user2);System.out.println(user2.getId());// 提交事务sqlSession.commit();// 关闭资源sqlSession.close();}
}

小结

    #{}和${}1.#{}表示占位符?,#{}接收简单类型的参数时,里面的名称可以任意2.${}表示拼接符,${}接收简单类型的参数时,里面的名称必须是value3.${}里面的值会原样输出,不加解析(如果该参数值是字符串,就不会添加引号)4.${}存在sql注入的风险,但是有些场景下必须使用,比如排序后面会动态传入排序的列名parameterType和resultType1.parameterType指定输入参数的java类型,parameterType只有一个,也就是说入参只有一个。2.resultType指定输出结果的java类型(是单条记录的java类型)selectOne和selectList1.selectOne查询单个对象2.selectList查询集合对象

Mybatis(一)之概述相关推荐

  1. MyBatis-02 MyBatis XML方式概述及配置步骤

    概述 一个简单的权限控制需求 创建数据库表 创建实体类 XML方式概述及步骤 1. 首先在src/main/resources下com.artisan.mybatis.xml.mapper目录下创建5 ...

  2. MyBatis基础知识概述

    一.依赖配置 添加依赖即可,jar包或pom依赖: <dependency><groupId>org.mybatis</groupId><artifactId ...

  3. ssm(spring mvc+mybatis)+netty4开发qiq

    发布时间:2018-10-30 技术:spring mvc+mybatis+nett4+layui 概述 简单快捷的IM方案,快速打造在线IM,可用于公司内网.外网通讯,客服系统等,实现了socket ...

  4. 软件框架技术1(MyBatis)

    目录 1.软件框架技术概述: 1.1为什么会出现软件框架技术? 1.2框架概述 1.3框架的优势 2.Maven 2.1.maven是什么 2.2maven依赖管理 2.3仓库 ​编辑2.4maven ...

  5. MyBatis从入门到精通(一)—MyBatis基础知识和快速入门

    Mybatis简介 原始jdbc操作(查询数据) Connection connection = null;PreparedStatement preparedStatement = null;Res ...

  6. 【MyBatis】基础全网最全,看这篇就够了

    一.原始JDBC开发存在的问题 package com.qf.java2107.test; ​ import org.junit.Test; ​ import java.math.BigDecimal ...

  7. 优秀的持久层框架-Mybatis(上)

    文章目录 前言 一.MyBatis概述 1.1传统JDBC编程 1.2 mybatis的历史 1.3 mybatis是什么? 1.4如何使用? 1.5Mybatis架构 二. MyBatis环境搭建 ...

  8. 图解 | 聊聊 MyBatis 缓存

    文章目录 一.MyBatis 缓存中的常用概念 二.MyBatis 一级缓存 2.1 一级缓存原理 2.2 一级缓存配置 2.3 一级缓存考题 2.4 MyBatis 一级缓存失效的场景 2.5 My ...

  9. 首发 阿里P8整理万字MyBatis实战笔记,精简易懂,开源免费下载

    MyBatis作为国内经常使用的持久层框架,其内部代码的设计非常优秀.比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性.低耦合性的代码,便 ...

  10. MyBatis一级缓存失效的几种情况

    MyBatis一级缓存失效的几种情况 文章目录 MyBatis一级缓存失效的几种情况 1 MyBatis一级缓存概述 2 四种失效的基本情况 3 几种特殊情况 1 MyBatis一级缓存概述 MyBa ...

最新文章

  1. Windows开启WMI时一些总结
  2. 细数移动IM开发中的那些坑
  3. Web开发中的用户角色权限设计总结
  4. 50道编程小题目之【完全平方数】
  5. 1t硬盘怎么分区最好_还在用128G Macbook?699元升级1T英睿达SSD
  6. centos7卸载docker_新手快速入门Docker,轻松掌握Docker安装与使用
  7. android模拟器模拟nfc功能吗,android – 开始使用NFC模拟器
  8. U盘文件夹被病毒隐藏了
  9. 2021年数学建模国赛A题优秀论文(Word)(FAST”工作抛物面的优化设计)
  10. Ego-planner安装
  11. 正点原子开发板 使用 mfgtool 上位机固化系统至emmc报错 mfgtool “Push“ error, file=“xxxxx“
  12. 检查一个字符串是否为回文 。 回文:正着念与反着念一样,例如:上海自来水来自海上
  13. ubuntu 安装微信(微信官方版本)
  14. python网络爬虫-复杂HTML解析
  15. 区间缩放,标准化,归一化
  16. 2022年07月数据库排行榜
  17. Xposed快速入门例子(二)----- 调方法的合适时机
  18. CHROME源码剖析 上《转》
  19. Imperva WAF使用笔记
  20. C语言学习笔记(二): 简单的C程序设计

热门文章

  1. The 36th ACM/ICPC Asia Regional Dalian Site 1006 Dave
  2. 例题4-1 UVA1339 古老的密码 Ancient Cipher
  3. 腾讯市值反超阿里,现实主义PK长期主义
  4. Chrome找到视频缓存的方法
  5. 【安卓开发】安卓开发工具: android studio(AS)的安装,配置与汉化保姆级详细教程
  6. STM32F103红外遥控密码锁
  7. 【计算机网络安全毕设之基于tornado+CNN的网络入侵检测可视化管理系统-哔哩哔哩】 https://b23.tv/bVI0Big
  8. 【Python自学】七个超强学习网站,你值得拥有!
  9. linux名词解释目录文件,Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在()目...
  10. 关于POSTMAN无法安装的解决方法