一、MyBatis

1、简介

  曾命名IBatis(老版本), 交给Google维护后,改名为MyBatis(新版本)。
学习文档:
  https://mybatis.org/mybatis-3/zh/index.html

2、作用:

  封装了JDBC操作,简化数据库访问代码。
封装功能:
(1)封装了获取连接,执行SQL语句,释放连接。
(2)封装了SQL参数设置。例如:insert into emp (name,age) values(#{name}, #{age})
(3)封装了记录映射成实体对象的过程。
注:

  实体类属性名与查询结果集ResultSet中的列名(并不一定是数据库中表的列名,而是取出时的列名、或者叫别名)要保持一致。

3、如何使用

step1:导入相关jar包(mybatis包 + 数据库驱动包)。
step2:编写mybatis配置的xml文件。用于指定数据库连接参数和SQL定义文件的位置。
step3:编写相关实体类(以及接口类)。
step4:编写sql语句的xml文件。用于定义SQL语句。
step5:使用SqlSession对象执行SQL操作(SqlSession 操作 是非线程安全的)。

4、最基本的使用方式

step1:导包。

step2:编写mybatis配置的xml文件。

【config/mybatis-config.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>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC"/>
<!-- MyBatis自带连接池,只需配置数据库连接的一些数据即可
此处以MySql为例。
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments> <!-- 加载SQL定义文件,需要修改
若有多个SQL定义文件,可以使用<mapper />标签追加。
文件路径中存在.的话,使用/分割
-->
<mappers>
<mapper resource="config/EmpMapper.xml"/>
</mappers>
</configuration>

step3:编写相关实体类对象。

【entity.Employee.java】

package entity;

import java.io.Serializable;

/**
* 实体类
*/
public class Employee implements Serializable{
private Integer id;
private String name;
private Double salary;
private Integer age; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getSalary() {
return salary;
} public void setSalary(Double salary) {
this.salary = salary;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", age=" + age +
'}';
}
}

step4:编写sql语句的xml文件。

【config/EmpMapper.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">
<mapper namespace="mybatisDemo.entity.Employee">
<!--
namespace 指命名空间
id 指的是sql语句唯一表示
resultType 指的是sql的返回类型(使用全类名表示)
#{id} 表示接收参数,相当于占位符,(可使用 ${id},其将数据直接显示在sql语句中)
-->
<select id="selectEmp" resultType="entity.Employee">
select * from emp where id = #{id}
</select>
</mapper>

step5:使用SqlSession对象执行SQL操作。

【test.Demo.java】

package test;

import entity.Employee;
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 org.junit.Test; import java.io.IOException;
import java.io.InputStream; public class Demo { @Test
public void test() throws IOException {
// step1:读取配置文件
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // step2:创建一个 SqlSessionFactory 的对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // step3:获取一个 SqlSession 的实例
SqlSession session = sqlSessionFactory.openSession();
try{
// 根据唯一的sql id 定位到sql语句。
Employee employee = session.selectOne("selectEmp", 1);
System.out.println(employee);
}finally {
// step4:关闭 SqlSession 实例
session.close();
}
}
}

step6:测试截图

5、接口式编程

(1)定义一个接口,里面定义一系列方法,并将这些方法与 sql 语句的xml文件 进行映射。
(2)其中 方法名为 xml 文件中 的 唯一id标识, 并使用 resultType、resultMap 来定义返回值类型。
(3)与基本的方式相比,增加了个 接口类,映射到 sql 的 xml 文件(通过命名空间 namespace 来映射接口,id 为 接口的方法名),并通过接口类来进行sql的调用。
step1:导包

step2:编写mybatis配置的xml文件。

【config/mybatis-config.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>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC"/>
<!-- MyBatis自带连接池,只需配置数据库连接的一些数据即可
此处以MySql为例。
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments> <!-- 加载SQL定义文件,需要修改
若有多个SQL定义文件,可以使用<mapper />标签追加。
文件路径中存在.的话,使用/分割
-->
<mappers>
<mapper resource="config/EmpMapper.xml"/>
</mappers>
</configuration>

step3:编写相关实体类对象。

【entity.Employee.java】

package entity;

import java.io.Serializable;

/**
* 实体类
*/
public class Employee implements Serializable{
private Integer id;
private String name;
private Double salary;
private Integer age; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getSalary() {
return salary;
} public void setSalary(Double salary) {
this.salary = salary;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", age=" + age +
'}';
}
}

step4:定义接口类

【mapper.EmpMapper.java】

package mapper;

import entity.Employee;

/**
* 接口式编程,定义一系列方法,并根据方法映射到sql 的xml 文件中。
*/
public interface EmpMapper {
public Employee getEmp(Integer id);
}

step5:编写sql语句的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">
<mapper namespace="mapper.EmpMapper">
<!--
namespace 指命名空间,用于指明接口类的位置
id 指的是sql语句唯一表示,为接口类中的方法
resultType 指的是sql的返回类型(使用全类名表示)
#{id} 表示接收参数,相当于占位符,(可使用 ${id},其将数据直接显示在sql语句中)
-->
<select id="getEmp" resultType="entity.Employee">
select * from emp where id = #{id}
</select>
</mapper>

step6:使用SqlSession对象执行SQL操作。

【test.Demo.java】

package test;

import entity.Employee;
import mapper.EmpMapper;
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 org.junit.Test; import java.io.IOException;
import java.io.InputStream; public class Demo { @Test
public void test() throws IOException {
// step1:读取配置文件
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // step2:创建一个 SqlSessionFactory 的对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // step3:获取一个 SqlSession 的实例
SqlSession session = sqlSessionFactory.openSession();
try{
// 获取接口类的对象(内部为接口类自动创建代理对象)
EmpMapper empMapper = session.getMapper(EmpMapper.class);
// 通过方法调用sql
Employee employee = empMapper.getEmp(1);
System.out.println(employee);
}finally {
// step4:关闭 SqlSession 实例
session.close();
}
}
}

step7:测试截图

二、全局配置文件

  用于 mybatis 的配置。

1、environments

  用于设置开发环境。每个<environment>标签可以设置一个开发环境。使用 default可以切换环境。

【environment内部的标签】
transactionManager: 用于指定事务管理器。type="[JDBC|MANAGED]"
dataSource:用于指定数据源。type="[UNPOOLED|POOLED|JNDI]" 【举例:】
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url"
value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="provided">
<transactionManager type="MANAGED"/>
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url"
value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

2、properties

  用于引入外部资源文件。比如 数据库的配置信息 放在 (.properties) 文件中。可以通过 <properties> 将 该文件引入。

【属性:】
url:引入网络路径 或者 磁盘下的路径 下的文件
resource: 引入当前项目类路径下的文件 引入文件后,使用 ${} 来取出 文件的内容。

对上例接口式编程进行部分修改。
(1)增加一个 config/db.properties,用于保存数据库连接信息。
(2)使用 <properties> 标签引入 db.properties 文件, 并使用 ${} 来取出 文件的内容。

【db.properties】
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/lyh?useUnicode=true&characterEncoding=utf8
jdbc.username = root
jdbc.password = 123456 【config/mybatis-config.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>
<properties resource="config/db.properties"></properties> <environments default="environment">
<environment id="environment">
<transactionManager type="JDBC"/>
<!-- MyBatis自带连接池,只需配置数据库连接的一些数据即可
此处以MySql为例。
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url"
value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> <!-- 加载SQL定义文件,需要修改
若有多个SQL定义文件,可以使用<mapper />标签追加。
文件路径中存在.的话,使用/分割
-->
<mappers>
<mapper resource="config/EmpMapper.xml"/>
</mappers>
</configuration>

3、settings

  用于修改 mybatis 的默认设置。

【setting属性:】
name:要修改的配置的名字
value:要修改的配置的值

(1)比如开启 驼峰命名映射规则(mapUnderscoreToCamelCase)。
  默认情况下,数据库里的数据,无法自动转换驼峰命名,获取不到值。

开启驼峰命名映射规则后,可以获取到值。

<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

4、databaseIdProvider

  用于支持不同的数据库。

【在全局配置文件中,添加以下信息:】
name指的是不同的数据库,value指的是别名。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider> 【在sql的xml文件中,使用databaseId来区别数据库】
<select id="getEmp" resultType="entity.Employee" databaseId="mysql">
select * from emp where id = #{id}
</select>
<select id="getEmp" resultType="entity.Employee" databaseId="oracle">
select * from emp where id = #{id}
</select>

5、mappers

  用于配置sql映射文件的读取位置。

(1)使用 <mapper> 标签来定义 sql 的xml文件。
【属性:】
url:引入网络路径 或者 磁盘下的路径 下的文件
resource: 引入当前项目类路径下的文件
class: 用于引入接口类(使用时需要将 xml 与 接口类 放在同一个包下)。 (2)使用 <package> 标签来 批量定义映射器。
<mappers>
<package name="org.mybatis.builder"/>
</mappers> org.mybatis.builder 包下所有接口皆被定义为映射器,
若使用 sql的xml配置文件,则需将配置文件与 接口同名 且置于同一包下。
若使用 注解,则无需编写 sql语句 的 xml 配置文件。

注:

  使用class 属性时,可以在接口上使用 注解标记,并直接定义sql 语句(此时不需要sql的配置文件)。

MyBatis初体验的更多相关文章

  1. 一、Mybatis初体验

    本文章中所有操作均在idea2019中实现. 快速入门步骤: 1)添加Mybatis包 2)创建实体类User(对应数据库操作提前已准备,参考随笔tip1) 3)编写映射文件UserMapper.xm ...

  2. 五、MyBatis缓存初体验

    缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存, 我们可以避免频繁的与数据库进行交互, 进而提高响应速度. 一级缓存初体验(session,默认打开) 同一查询执行两次以上:selec ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Spring boot缓存初体验

    spring boot缓存初体验 1.项目搭建 使用MySQL作为数据库,spring boot集成mybatis来操作数据库,所以在使用springboot的cache组件时,需要先搭建一个简单的s ...

  5. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  6. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  7. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  8. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  9. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

随机推荐

  1. 用C#写小工具:将圆柱面贴图映射到半球贴图

    最近在写GBA的程序.GBA运行的是C的裸机代码,而中途使用的很多小工具则用C#写的,例如:图片转换到.h头文件,制作三角函数表,还有像这次介绍的将圆柱面贴图映射到半球贴图的小工具.这样的小功能,用C ...

  2. CAS都不了解,你还怎么看J.U.C

    前言 说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS是乐观锁思想的一种实现. 悲观锁:总是很悲观的认为,每次拿数据都会有其他线程并发执行,所以每次都会进行加锁,用 ...

  3. shell 循环读取文件及字符串转为数组

    文件/etc/hdocker_config内容如下: 30.72.63.94 30.72.63.95 30.72.63.96 30.72.63.97 /tmp/lasclocker.tar maste ...

  4. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3 状态码、错误/故障、ProblemDetails

    HTTP状态码 HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一 ...

  5. C# 设置、删除、读取Word文档背景——基于Spire.Cloud.Word

    Spire.Cloud.Word.Sdk提供了接口SetBackgroudColor().SetBackgroudImage().DeleteBackground().GetBackgroudColo ...

  6. Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录

    首先我们需要客户端和服务器端. 服务器端需要:1.创建ServerSocket对象.2.监听客户端的请求数据.3.获取输入流(对象流)即用户在客户端所发过来的信息.                  ...

  7. CF 17E Palisection 求相交回文串个数

    In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...

  8. [ Coding七十二绝技 ] 如何利用Java异常快速分析源码

    前言 异常一个神奇的东西,让广大程序员对它人又爱又恨.爱它,通过它能快速定位错误,经过层层磨难能学到很多逼坑大法.恨他,快下班的时刻,周末的早晨,它踏着七彩云毫无征兆的来了. 今天,要聊的是它的一项神 ...

  9. Python3 函数进阶2

    目录 迭代器 可迭代对象 迭代器对象 总结和补充 列表推导式 字典生成式 zip()函数 递归 迭代器 迭代器是访问容器类数据类型元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从容器 ...

  10. 【重温基础】JS中的常用高阶函数介绍

    Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以 ...