MyBatis:学习笔记(1)——基础知识

引入MyBatis

JDBC编程的问题及解决设想

  ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能。
  ☐ 使用数据库连接池管理数据库。
  ☐ 将SQL语句硬编码到Java代码中,若SQL语句修改,需要重新编译Java代码,不利于系统维护。
  ☐ 将SQL语句配置在XML文件中,即使SQL变化,我们也不需要队Java代码进行重新编译。
  ☐ 向PreparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在Java代码中不利于系统维护。
  ☐ 将SQL语句及占位符号和全部参数配置在XML中。
  ☐ 从ResultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
  ☐将查询的结果集自动映射为Java对象。

MyBatis是什么

  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java对象)映射成数据库中的记录。

特点:  

  MyBatis是一个持久层框架,是Apache下的顶级项目
  MyBatis让程序将主要精力放在SQL上,通过MyBatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写)满足需要的SQL语句
  MyBatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成Java对象

MyBatis框架执行流程

  

说明:

  • 每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心
  • SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得
  • SqlSessionFactoryBuilder 对象可以从 XML 配置文件,或从 Configuration 类的习惯准备的实例中构建 SqlSessionFactory 对象。
  • 有了SqlSessionFactory我们就可以创建会话,来执行我们的数据库操作。

从 XML 中构建 SqlSessionFactory

  从 XML 文件中构建 SqlSessionFactory 的实例非常简单。这里建议你使用类路径下的资源文件来配置,但是你可以使用任意的 Reader 实例,这个实例包括由文字形式的文件路径或 URL 形式的文件路径 file://来创建。MyBatis 包含了一些工具类,称作为资源,这些工具类包含一些方法,这些方法使得从类路径或其他位置加载资源文件更加简单

        //配置的文件名,已放在类路径下
     String resource = "SqlMapConfig.xml";
     //读入配置文件
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,传入MyBatis的配置文件的信息
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);

  XML 配置文件包含对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器

<?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="db.properties">
<!--在这里也可以配置一些属性-->
</properties> <!--和Spring整合后,environments将删除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理,事务控制由MyBatis控制-->
<transactionManager type="JDBC"/>
<!--数据库连接池,由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="mapper/OrderMapper.xml"/>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>

说明: 

  在这里,我已经将数据库的配置文件单独拿出来了,为了使以后版本迭代及修改后更加灵活。<properties resource="db.properties">

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/MyBatis?characterEncoding=utf-8
db.username=root
db.password=123456

从SqlSessionFactory中获取SqlSession

  现在,我们已经知道如何获取 SqlSessionFactory 对象了,基于同样的启示,我们就可以获得 SqlSession 的实例了。 SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法。你可以用 SqlSession 实例来直接执行已映射的 SQL 语句。

SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}

说明:

  使用合理描述参数和 SQL 语句返回值的接口(比如 BlogMapper.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。

Mapper映射SQL语句

  上面的所有代码都是不可运行的,因为映射文件还没有编写,我们在开头就说过MyBatis的SQL语句是要我们自己编写的,而保存这些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="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>

说明:

  你可以在一个单独的XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很多 方 便 之 处 。 

  在 命 名 空 间=“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句。

Blog blog = (Blog) session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);

错误说明

  mybatis默认的根目录是项目的src目录,所以如果在getResourceAsStream()方法中只传入配置文件的文件名,系统回去src目录中找配置文件,这时候肯定找不到,

  解决方法有两种:一种,getResourceAsStream()传入配置文件路径时这样写com\\xxx\\mybatistest\\mybatis-config.xml

  另一种,直接将配置文件移入src根目录中即可。

说明:

☐ #{} 表示一个占位符号

☐ ${}表示一个拼接符号,会引起SQL注入,所以不建议使用。

☐ selectOne表示取出一条记录,进行映射

☐ selectList表示查询出一个列表,进行映射。

实例

  导入Jar包

  

  编写映射文件

  文件名称为:src/mapper/UserMapper.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="org.mybatis.example.BlogMapper">
  <select id="findUserById" parameterType="int" resultType="user">
    select * from user where id = #{id}
  </select>
</mapper>

  编写POJO类

  这就是MyBatis强大的地方之一,可以将查询结果映射成POJO类,至于输入和输出映射,我们会在下一节详细介绍。

package pojo;

import java.util.Date;

public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address; @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
.....
}

  编写SqlMapperConfig完全同上  

<?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="db.properties">
<!--在这里也可以配置一些属性-->
</properties> <!--和Spring整合后,environments将删除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理,事务控制由MyBatis控制-->
<transactionManager type="JDBC"/>
<!--数据库连接池,由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="mapper/UserMapper.xml"/>
</mappers>
</configuration>

  获得Session,测试代码

  @Test
public void findUserById1()
{
String resource = "SqlMapConfig.xml";
InputStream inputStream= null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession(); User user = session.selectOne("jdbc.UserMapper.findUserById",1);
System.out.println(user);
session.close();
}

MyBatis:学习笔记(1)——基础知识的更多相关文章

  1. MyBatis学习笔记(1) —— 基础知识

    mybatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,mybatis 清除了几乎所有的jdbc代码和参数的手工设置及对结果集的检索封装.mybatis可以使用简单的xml和注解用于 ...

  2. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  3. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  4. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  5. mybatis学习笔记之基础复习(3)

    mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...

  6. mybatis学习笔记之基础框架(2)

    mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...

  7. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  8. .net学习笔记---xml基础知识

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  9. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...

随机推荐

  1. Bootstrap入门(二十七)JS插件4:标签页

    Bootstrap入门(二十七)JS插件4:标签页 标签页的切换可以带动内容的变化 首先我们引入CSS文件 <link href="bootstrap.min.css" re ...

  2. SoapUI:入门实例

    这一章中我们要掌握如下内容: 1)         构建项目: 2)         运行单个请求: 3)         构建测试用例: 4)         接口之间传递参数,组织测试步骤: 5) ...

  3. QEMU ELF_LOAER分析[基于MIPS]

    本文用于记录对QEMU对ELF文件加载函数进行分析.根据“函数使用->函数定义->函数实现->函数实现的分析”的顺序进行分析,最终提取出ELF文件加载的代码. 1. load_elf ...

  4. C++编程练习(4)----“实现简单的栈的链式存储结构“

    如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...

  5. 使用php实现网站验证码功能【博主推荐】

             验证码是网站常用的一项安全措施,也是新人站长较难掌握的一项技能,这里我向大家介绍一简单有效的验证码实现方法. 开始之前 在正式开始之前我们需要打开php的gd2图形库支持(在php. ...

  6. css3 3d小demo

    css3 3d案例总结 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家.就把最近做的比较好的给大家分享下 1.旋转拼图 首先看下效果 代码主要由HTML和CSS3组成,应该说还是比较简 ...

  7. angular1.5 Components

    如今前端界angular react vue三大框架并驾齐驱,其中有一个共同点就是组件化开发,这也符合w3c 推行Web Components的趋势.现如今不懂组件化开发的前端绝对不是好厨子.跳槽新公 ...

  8. executssql 函数的每一句代码的意思

    Public Function Executesql(ByVal sql As String, Msgstring As String) As ADODB.Recordset Dim cnn As A ...

  9. 分析下为什么spring 整合mybatis后为啥用不上session缓存

    因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验 ...

  10. SignalR中长连接与HUB连接的使用方式以及区别

    1 using Microsoft.AspNet.SignalR; 2 using System; 3 using System.Collections.Generic; 4 using System ...