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

时间:2024-01-07 14:05:08

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:学习笔记(1)——基础知识

说明:

  • 每 一 个 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包

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

  编写映射文件

  文件名称为: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();
}