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. HTML5 & CSS3初学者指南(3) – HTML5新特性

    介绍 本文介绍了 HTML5 的一些新特性.主要包含以下几个方面: Web 存储 地理位置 拖放 服务器发送事件 Web存储 HTML5 Web 存储的设计与构想是一个更好的机制来存储客户端的网络数据 ...

  2. 如何在linux下制作一个windows的可启动u盘?

    如何在linux下制作一个windows的可启动u盘? 情景是这样的,有一个windows10的iso,现在想通过U盘安装,要求即支持UEFI(启动引导器),又支持Legacy(启动引导器),因为有一 ...

  3. 扩展jquery插件的方法

    方法1.通过一个简单的.jQuery函数prototype属性的别名(jquery.fn进行扩展) jQuery.fn.newStuff = function(){ console.log(" ...

  4. 深入子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

  5. HUST 1584 摆放餐桌

    1584 - 摆放餐桌 时间限制:1秒 内存限制:128兆 609 次提交 114 次通过 题目描述 BG准备在家办一个圣诞晚宴,他用一张大桌子招待来访的客人.这张桌子是一个圆形的,半径为R.BG邀请 ...

  6. 分布式架构--Dubbo项目实战学习文档

    安装Dubbo注册中心(Zookeeper-3.4.6) 安装Dubbo管理控制台 Tomcat中部署web应用 ---- Dubbo服务消费者Web应用war包的部署 Dubbo监控中心的介绍与简易 ...

  7. 11g默认审计选项

    [注:参考了maclean的网文]11g默认审计选项AUDIT_TRAIL参数的缺省值为DB,审计数据记录在数据库中的AUD$审计字典基表上.在11g中CREATE SESSION将被作为受审计的权限 ...

  8. Swift 2.0 自定义cell和不同风格的cell

    昨天我们写了使用系统的cell怎样创建tableView,今天我们再细分一下,就是不同风格的cell,我们怎写代码.先自己创建一个cell,继承于UItableviewcell 我们看看 cell 里 ...

  9. javascript的方法

    1. decodeURIComponent() decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码. 语法: decodeURI ...

  10. node.js 学习随笔

    一,cnmp的操作: 1,cnmp info jquery查询jquery的版本: 2,cnmp install jquery@1.11.1:安装: 3,cnmp list查询所有下载的内容: 4,c ...