什么是MyBatis

MyBatis 是一款优秀的持久层框架

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。

持久化

持久化是将程序数据在持久状态和瞬时状态间转换的机制。

即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。

JDBC就是一种持久化机制。文件IO也是一种持久化机制。

在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。

为什么需要持久化服务呢?那是由于内存本身的缺陷引起的

内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。

内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。

持久层

完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】

大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。

不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多是必不可少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许是,但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专注于数据持久化逻辑的实现.

与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。【说白了就是用来操作数据库存在的!

为什么需要Mybatis

Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 .

传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等… , 通过框架可以减少重复代码,提高开发效率 .

MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射

所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!技术没有高低之分,只有使用这个技术的人有高低之别

MyBatis的优点

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供xml标签,支持编写动态sql。

MyBatis程序

流程:搭建环境–>导入Mybatis—>编写代码—>测试

  1. 创建数据库
CREATE DATABASE `mybatis`;USE `mybatis`;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert  into `user`(`id`,`name`,`pwd`) values (1,'喜羊羊','123456'),(2,'张三','abcdef'),(3,'李四','987654');

2.导入MyBatis相关 jar 包以及解决Maven静态资源过滤问题

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource>
</resources>

3 MyBatis核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration是核心配置文件,配置的是数据库的账号密码之类的东西-->
<configuration><!--如果有多个id不同的环境,通过改变这里的default,即id默认值来使用想要的环境--><environments default="development"><environment id="development"><!--事务属性,默认事务管理器是JDBC--><transactionManager type="JDBC"/><!--默认数据连接是连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="xxxxx"/></dataSource></environment></environments><!--每一个xml文件(代替原来的接口实现类的文件)都需要注册在这个核心配置文件中--><!--全限定类名,注意这里是斜杠,不是点--><mappers><!--  <mapper resource="org/mybatis/example/BlogMapper.xml"/>  --><mapper resource="com/dao/UserMapper.xml"/></mappers>
</configuration>

4 MyBatis工具类`

package com.utils;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 java.io.IOException;
import java.io.InputStream;//下面的代码相当于jdbc中用DriverManager获取Connection对象//sqlSessionFactory --> sqlSession
public class MyBatisUtils {//这句用来提升sqlSessionFactory作用域。sqlSessionFactory一旦创建就应该在应用的运行期间一直存在,作用域是应用作用域private static SqlSessionFactory sqlSessionFactory;static{try {//使用MyBatis第一步:获取sqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);  //绑定核心配置文件//SqlSessionFactoryBuilder一旦创建就不再需要,所以是局部变量sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。// 可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。//SqlSession是连接到SqlSessionFactory的一个请求。不是线程安全的,不能被共享,最佳作用域是请求或者方法作用域(放在方法里)public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

5.创建实体类

package com.domain;
//实体类
public class User {private int id;private String name;private String pwd;public User() {}public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd='" + pwd + '\'' +'}';}
}

6.写Mapper接口

package com.dao;
import com.domain.User;
import java.util.List;
import java.util.Map;
/*
dao接口,定义操作数据库的方法*/
public interface UserDao {//查全部信息List<User> getUserList();//根据id查信息User getUserById(int id);//插入信息int insertUser(User user);//用mapint insertUser2(Map<String, Object> map);//修改信息int updateUser(User user);//删除信息int deleteUser(int id);//模糊查询List<User> getUserLike(String value);
}

7.Mapper.xml映射文件

  • 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--一个语句既可以通过 XML定义,也可以通过注解定义。先看 XML 定义语句的方式,
事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,--><!--就是在xml文件中定义sql语句,增删改查,作用就是以前的接口实现类的作用--><!--通过命名空间绑定一个对应的Dao/Mapper接口,使用全限定名称-->
<mapper namespace="com.dao.UserDao"><!--getUserList是接口dao里的方法名--><!--resultType表示结果类型,是sql语句执行后得到的ResultSet,遍历这个ResultSet得到的java对象的类型这里就是从数据库获取出来之后,数据库的列映射到类的属性上的地方--><!--com.domain.User(全限定名称)就是表示结果集是User类型--><select id="getUserList" resultType="com.domain.User">select * from user</select><!--parameterType是方法的参数类型,别名是_int,映射的就是int。(但是好像直接写int也没问题)--><!--这种基本类型的参数,可以省略parameterType--><select id="getUserById" parameterType="_int" resultType="com.domain.User">select * from user where id = #{id}</select><!--插入--><insert id="insertUser" parameterType="com.domain.User"><!--对象中的属性可直接取出来,即方法参数是User,就可以直接用他的属性id,name,pwd,传到下面的values里-->insert into user (id, name, pwd) values (#{id},#{name},#{pwd})</insert><!--通过map取键,别名是map,映射的就是Map--><insert id="insertUser2" parameterType="map">insert into user (name,pwd,id) values (#{name},#{pwd}, #{helloid}) <!--后面的这里可以随便写,取的是map的键--></insert><!--修改--><update id="updateUser" parameterType="com.domain.User">update user set name=#{name},pwd=#{pwd} where id = #{id}</update><delete id="deleteUser" parameterType="_int" >delete from user where id = #{id}</delete><!--模糊查询--><select id="getUserLike" resultType="com.domain.User"><!--方式一:--><!--     select * from user where name like #{value}  --><!--方式二:这个方法直接写死了,避免了sql注入的问题-->select * from user where name like "%"#{value}"%"</select></mapper>

这里注意理解#与$的区别:

  • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符?
INSERT INTO user (name) VALUES (#{name});
INSERT INTO user (name) VALUES (?);
  • ${} 的作用是直接进行字符串替换
INSERT INTO user (name) VALUES ('${name}');
INSERT INTO user (name) VALUES ('喜羊羊');

8.测试类

package com.dao;import com.domain.User;
import com.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class UserDaoTest {@Testpublic void test(){//第一步,获得sqlSession对象SqlSession sqlSession = MyBatisUtils.getSqlSession();//第二部:执行sql//UserDao.class,通过反射机制,获取类的class文件对象(这里是用类名获取),从而访问类中的属性,方法,构造方法等//getMapper,即拿到类对象所绑定的mapper。拿到之后,其实也就执行完了UserMapper.xml里面的东西,即sql语句UserDao userDao = sqlSession.getMapper(UserDao.class);List<User> userList = userDao.getUserList();for (User user : userList){System.out.println(user);}//关闭sqlSessionsqlSession.close();}@Testpublic void getStudentByIdTest(){SqlSession sqlSession = MyBatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = mapper.getUserById(2);System.out.println(user);sqlSession.close();}//增删改必须要提交事务,不提交的话,表中的数据不会更新@Testpublic void insertUser(){SqlSession sqlSession = MyBatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);int result = mapper.insertUser(new User(6, "杨光", "1693998789"));if (result > 0){System.out.println("插入成功");}//提交事务sqlSession.commit();sqlSession.close();}@Test//对象传递参数直接在sql中取出对象的属性。map传递参数,直接在sql中取出key。// 说是多个参数用Map,但是现在对用map的作用不太熟悉!!!public void insertUser2(){SqlSession sqlSession = MyBatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);Map<String,Object> map = new HashMap<String,Object>();map.put("helloid",7);map.put("name","小韩");map.put("pwd","45");mapper.insertUser2(map);sqlSession.commit();sqlSession.close();}@Testpublic void updateUser(){SqlSession sqlSession = MyBatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);int reslut = mapper.updateUser(new User(4,"yangg","145"));if (reslut > 0){System.out.println("修改成功");}//提交事务sqlSession.commit();//关流sqlSession.close();}@Testpublic void deleteUser(){SqlSession sqlSession = MyBatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);int reslut = mapper.deleteUser(4);if (reslut > 0){System.out.println("删除成功");}//提交事务sqlSession.commit();//关流sqlSession.close();}//模糊查询//方式一:在java代码执行的时候再加通配符 % %//方式二:在sql拼接中使用通配符@Testpublic void getUserLike(){SqlSession sqlSession = MyBatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);//方式一://    List<User> userList = mapper.getUserLike("%李%");//方式二:List<User> userList = mapper.getUserLike("李");for (User user : userList){System.out.println(user);}sqlSession.close();}}

Mybatis-01-概念理解相关推荐

  1. MyBatis 01 快速入门

    MyBatis 01 快速入门 文章目录 MyBatis 01 快速入门 一.学习目标 二.为什么需要框架技术 三.框架技术介绍 四.主流框架介绍 五.持久化与ORM 六.MyBatis简介 七.搭建 ...

  2. LSTM 01:理解LSTM原理及训练方法

    本文代码运行环境: cudatoolkit = 10.1.243 cudnn = 7.6.5 tensorflow-gpu = 2.1.0 keras-gpu = 2.3.1 相关文章 LSTM 01 ...

  3. 深度学习中IU、IoU(Intersection over Union)的概念理解以及python程序实现

    from: 深度学习中IU.IoU(Intersection over Union)的概念理解以及python程序实现 IoU(Intersection over Union) Intersectio ...

  4. 高性能计算中并行的概念理解

    高性能计算中并行的概念理解 分类: 并行计算高性能计算HPC - General2011-11-09 22:54 932人阅读 评论(0) 收藏 举报 编译器编程parallel优化formsvect ...

  5. 目标检测基本概念理解之IoU(交并比)以及Python代码实现

    目标检测基本概念理解之IoU(交并比) 交并比理解 Python代码实现 计算IoU,矩形框的坐标形式为xyxy 计算IoU,矩形框的坐标形式为xywh 交并比理解 在检测任务中,使用交并比(Inte ...

  6. Hadoop:HDFS的概念理解和体系架构-成都加米谷大数据分享

    HDFS是什么? HDFS 全称 Hadoop Distributed File System ,简称HDFS,是一个分布式文件系统.它是谷歌的GFS提出之后出现的另外一种文件系统.它有一定高度的容错 ...

  7. muck数据的概念理解

    muck数据的概念理解 所谓muck表示"模仿","假的":也可翻译为mock-test. 很多项目案例的讲解中,经常会提及muck数据.muck对象.muck ...

  8. 事件与委托的一点概念理解

    事件与委托的一点概念理解 早就接触过delegate和event,但是始终是一知半解,今天刚好有机会就好好研究一下! Delegate 顾名思义就是委托,委托的意思就是麻烦别人帮我干些事情.比如,我要 ...

  9. 目标检测中IoU(Intersection over Union)的概念理解

    参考博客 深度学习中IU.IoU(Intersection over Union)的概念理解以及python程序实现 一.IoU(交并比)概念 Intersection over Union,是一种测 ...

  10. C/C++中宏概念理解

    C/C++中宏概念理解 C/C++中宏概念理解 宏替换是C/C++系列语言的技术特色,C/C++语言提供了强大的宏替换功能,源代码在进入编译器之前,要先经过一个称为"预处理器"的模 ...

最新文章

  1. Java开发最常犯的10个错误,打死都不要犯!
  2. 【Spring框架家族】SpringBoot基本介绍
  3. Chat Ban 二分,等差数列(1300)
  4. 《精通J2EE网络编程》中讲的JNDI 6.1 什么是JNDI
  5. Eclipse下Tomcat服务器配置和使用
  6. mysql增量_mysql实时增量备份
  7. mysql数据库访问编程,mysql 连接数据库
  8. Oracle中对象权限与系统权限revoke
  9. 对No Starch Press出版的《Python Playground》一书的书评及其作者访谈录
  10. (android实战)创建查看试卷答案功能(类似于疯狂小鸟的选关)
  11. 常用c语言函数实现,常用的C语言库函数实现
  12. awk命令的使用案列
  13. 程序functionLua基础 小结(两个Lua程序示例)
  14. 激光雷达(LiDAR)| 第一节:点云处理库与软件介绍
  15. ZYNQ裸板:串口篇
  16. 半路出家程序员的痛旁人不会懂
  17. 谷歌浏览器里部分字体变模糊的问题。
  18. 节约粮食海报|节约粮食就是对袁隆平院士最好的怀念!
  19. Log4J的入门简介学习【转】
  20. Miller_Rabin和Pollard_Rho算法

热门文章

  1. 知识创造的组织特征及过程
  2. 数据库--查询男生信息或者为大数据2班的学生信息
  3. 如何添加在线QQ咨询
  4. Python实现用命令行看虎扑直播
  5. 【ODOO】如何使用search查询匹配多个属性值的产品记录
  6. 雅点ps光效纹理叠加扩展面板
  7. 愿梦想与希望在春天一起到来——人民大学与加拿大女王大学金融硕士
  8. 【stata】统计图——学习教程全记录(02)
  9. 计算机专业双学位选英语,想选双学位尤其是英语双学位的童鞋戳进来吧~~~
  10. Ubuntu 编译 哔哩哔哩 IJKPlayer so库,并支持RTSP