Mybatis(一)之概述
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(一)之概述相关推荐
- MyBatis-02 MyBatis XML方式概述及配置步骤
概述 一个简单的权限控制需求 创建数据库表 创建实体类 XML方式概述及步骤 1. 首先在src/main/resources下com.artisan.mybatis.xml.mapper目录下创建5 ...
- MyBatis基础知识概述
一.依赖配置 添加依赖即可,jar包或pom依赖: <dependency><groupId>org.mybatis</groupId><artifactId ...
- ssm(spring mvc+mybatis)+netty4开发qiq
发布时间:2018-10-30 技术:spring mvc+mybatis+nett4+layui 概述 简单快捷的IM方案,快速打造在线IM,可用于公司内网.外网通讯,客服系统等,实现了socket ...
- 软件框架技术1(MyBatis)
目录 1.软件框架技术概述: 1.1为什么会出现软件框架技术? 1.2框架概述 1.3框架的优势 2.Maven 2.1.maven是什么 2.2maven依赖管理 2.3仓库 编辑2.4maven ...
- MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
Mybatis简介 原始jdbc操作(查询数据) Connection connection = null;PreparedStatement preparedStatement = null;Res ...
- 【MyBatis】基础全网最全,看这篇就够了
一.原始JDBC开发存在的问题 package com.qf.java2107.test; import org.junit.Test; import java.math.BigDecimal ...
- 优秀的持久层框架-Mybatis(上)
文章目录 前言 一.MyBatis概述 1.1传统JDBC编程 1.2 mybatis的历史 1.3 mybatis是什么? 1.4如何使用? 1.5Mybatis架构 二. MyBatis环境搭建 ...
- 图解 | 聊聊 MyBatis 缓存
文章目录 一.MyBatis 缓存中的常用概念 二.MyBatis 一级缓存 2.1 一级缓存原理 2.2 一级缓存配置 2.3 一级缓存考题 2.4 MyBatis 一级缓存失效的场景 2.5 My ...
- 首发 阿里P8整理万字MyBatis实战笔记,精简易懂,开源免费下载
MyBatis作为国内经常使用的持久层框架,其内部代码的设计非常优秀.比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性.低耦合性的代码,便 ...
- MyBatis一级缓存失效的几种情况
MyBatis一级缓存失效的几种情况 文章目录 MyBatis一级缓存失效的几种情况 1 MyBatis一级缓存概述 2 四种失效的基本情况 3 几种特殊情况 1 MyBatis一级缓存概述 MyBa ...
最新文章
- Windows开启WMI时一些总结
- 细数移动IM开发中的那些坑
- Web开发中的用户角色权限设计总结
- 50道编程小题目之【完全平方数】
- 1t硬盘怎么分区最好_还在用128G Macbook?699元升级1T英睿达SSD
- centos7卸载docker_新手快速入门Docker,轻松掌握Docker安装与使用
- android模拟器模拟nfc功能吗,android – 开始使用NFC模拟器
- U盘文件夹被病毒隐藏了
- 2021年数学建模国赛A题优秀论文(Word)(FAST”工作抛物面的优化设计)
- Ego-planner安装
- 正点原子开发板 使用 mfgtool 上位机固化系统至emmc报错 mfgtool “Push“ error, file=“xxxxx“
- 检查一个字符串是否为回文 。 回文:正着念与反着念一样,例如:上海自来水来自海上
- ubuntu 安装微信(微信官方版本)
- python网络爬虫-复杂HTML解析
- 区间缩放,标准化,归一化
- 2022年07月数据库排行榜
- Xposed快速入门例子(二)----- 调方法的合适时机
- CHROME源码剖析 上《转》
- Imperva WAF使用笔记
- C语言学习笔记(二): 简单的C程序设计
热门文章
- The 36th ACM/ICPC Asia Regional Dalian Site 1006 Dave
- 例题4-1 UVA1339 古老的密码 Ancient Cipher
- 腾讯市值反超阿里,现实主义PK长期主义
- Chrome找到视频缓存的方法
- 【安卓开发】安卓开发工具: android studio(AS)的安装,配置与汉化保姆级详细教程
- STM32F103红外遥控密码锁
- 【计算机网络安全毕设之基于tornado+CNN的网络入侵检测可视化管理系统-哔哩哔哩】 https://b23.tv/bVI0Big
- 【Python自学】七个超强学习网站,你值得拥有!
- linux名词解释目录文件,Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在()目...
- 关于POSTMAN无法安装的解决方法