愉快过六一,开心学MyBatis

在这里插入图片描述

什么是Mybatis?

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

sql mapper :sql映射
	可以把数据库表中的一行数据,映射为 一个java对象
	一行数据可以看作是一个java对象。操作这个java对象,就相当于操作表中的数据

Data Access Object(DAOs):数据访问,对数据库执行增删改查

Mybatis安装:

要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>x.x.x</version><!--版本号-->
</dependency>

MyBatis功能架构:

  1. API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  2. 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  3. 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

Mybatis优缺点:

优点:
用数据访问框架可以实现的所有功能,或许更多。
○ 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。

缺点:

  • 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  • SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  • 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。二级缓存机制不佳

mybatis入门:

实现步骤:

  1. 新建student表
  2. 加入maven的mybatis坐标,mysql驱动坐标
  3. 创建实体类,保存表中的一行数据
  4. 创建持久层的dao的接口,定义操作数据库的方法
  5. 创建一个mybatis使用配置文件
    叫做sql映射文件:写sql语句。一般一个表一个sql文件
    这个文件是xml的文件。
    1、在接口所在的目录中
    2、文件名和接口保持一致
  6. 创建mybatis的主配置文件:
    一个项目一个主配置文件。
    主配置文件提供了数据库的连接信息和sql映射文件的位置信息
  7. 创建使用mybatis类:
    通过mybatis访问数据库

1、新建student表:

用工具创建即可:
在这里插入图片描述

2、加入maven的mybatis坐标,mysql驱动坐标

在pom.xml文件中添加mybatis依赖、mysql驱动

<!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.4</version>
    </dependency>

    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.19</version>
    </dependency>

3、创建实体类,保存表中的一行数据

注意:

  1. 这个实体类的类名推荐与表名一致
  2. 类中的属性名与列名相同
//推荐和表名一样,容易记忆
public class Student {
    //定义属性,目前要求属性名和列名相同
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    public Student() {
    }
    
 	//省略get,set方法
 	
    @Override
    public String toString() {
        return new StringJoiner(", ", 
        Student.class.getSimpleName() + "[", "]")
                .add("id=" + id)
                .add("name='" + name + "'")
                .add("email='" + email + "'")
                .add("age=" + age)
                .toString();
    }
}

4、 创建持久层的dao的接口,定义操作数据库的方法

我们只简单地查询,所以dao里面只有一个select方法,返回一个list集合

//操作Student表
public interface StudentDao {
    //查询所有数据,集合--->具体的sql操作写在sql映射文件里面
    public List<Student> selectStudents();
}

5、创建一个mybatis使用配置文件

sql映射文件:写sql语句。一般一个表一个sql文件,这个文件是xml的文件。

  1. 在接口所在的目录中
  2. 文件名和接口保持一致
<?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="com.mybatisDemo.dao.StudentDao">
    <select id="selectStudents" resultType="com.mybatisDemo.domain.Student">
      select id,name,email,age from student order by id
    </select>
</mapper>

各标签的含义:

 sql映射文件:写sql语句的,mybatis会执行这些sql
1、指定约束文件
   <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 mybatis-3-mapper.dtd 约束文件的名称
2、约束文件的作用:
    限制,检查在当前文件中出现的标签,属性必须符合mybatis的要求

3、<mapper>当前文件的根标签
   namespace:命名空间,唯一的,可以是自定义的字符串
               要求:dao接口的全限定名称
4、在当前文件中,可以使用特定的标签,表示数据库的特定操作
    <select>:表示查询
    <update>:更新语句
    <insert>:插入语句
    <delete>:删除语句
5、<select id="selectBlog" resultType="Blog">
   id:执行的sql语句的唯一标识,
   			mybatis会使用这个id的值来找到要执行的sql语句
        	可以自定义,要求使用接口中的方法名称
   resultType:sql语句执行后得到ResulSet,
    				遍历这个ResulSet得到的java对象的类型
                	值的类型的全限定名称

6、创建mybatis的主配置文件:

  • 一个项目一个主配置文件。
  • mybatis主配置文件:主要定义了数据库的配置信息,sql映射文件的位置
<!--约束文件-->
<?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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" 
                value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" 
                value="jdbc:mysql://localhost:3306/bjpowernode?
                serverTimezone=UTC&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="yky"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com\mybatisDemo\dao\StudentDao.xml"/>
    </mappers>
</configuration>

mybstis.xml文件中的各标签的含义:

1、约束文件:
   <!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">

2、<configuration>:根标签
3、<environments>:环境配置——数据库的连接信息
           default:必须和莫个environment的id值一样,
           				告诉mybatis使用哪个数据库的信息
4、<environment>:一个数据库信息的配置、环境
           id:一个唯一值,自定义,表示环境的名称
5、 <transactionManager type="JDBC"/>:mybatis事务类型
          type:JDBC(使用JDBC中Connection对象的commit,rollback事务处理)
6、<dataSource> :数据源,连接数据库
          type:type="POOLED"表示使用连接池
7、<property>:表示连接数据库的具体信息
          diver(驱动),user,username,password是固定的,不能自定义
8、<mappers>:sql mapper(sql映射文件)的位置,
一个mapper指定一个文件的位置
          从类路径开始的路径信息。

7、创建使用mybatis类: 通过mybatis访问数据库

访问mybatis读取student数据

  1. 定义mybatis主配置文件的名称,从类路径根开始(target/clasess)
  2. 读取这个config表示的文件
  3. 创建SqlSessionFactoryBuilder对象
  4. 创建SqlSessionFactory对象
  5. (重要)获取SqlSession对象,从SqlSessionFactory对象获取
  6. (重要)指定要执行的sql语句的标识:sql映射文件中的namesapce+"."+标签的id值
  7. 执行sql语句,通过sqlId找到语句
  8. 释放资源

 public static void main(String[] args) throws IOException {
        //访问mybatis读取student数据
        //1、定义mybatis主配置文件的名称,从类路径根开始(target/clasess)
        String config = "mybatis.xml";
        //2、读取这个config表示的文件
        InputStream in = Resources.getResourceAsStream(config);
        //3、创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = 
        new SqlSessionFactoryBuilder();
        //4、创建SqlSessionFactory对象
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(in);
        //5、(重要)获取SqlSession对象,从SqlSessionFactory对象获取
        SqlSession sqlSession = build.openSession();
        //6、(重要)指定要执行的sql语句的标识:sql映射文件中的
        //namesapce+"."+标签的id值
        String sqlId = 
        "com.mybatisDemo.dao.StudentDao"+"."+"selectStudents";
        //7、执行sql语句,通过sqlId找到语句
        List<Student> studentList = sqlSession.selectList(sqlId);
        studentList.forEach(stu -> System.out.println(stu));
        //8、释放资源
        sqlSession.close();

结果展示:
在这里插入图片描述

不使用 XML 构建 SqlSessionFactory:

	如果你更愿意直接从 Java 代码而不是 XML 文件中创建配置,
	或者想要创建你自己的配置建造器,MyBatis 也提供了完整的配置类,
	提供了所有与 XML 文件等价的配置项。
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
	TransactionFactory transactionFactory = 
	new JdbcTransactionFactory();
	Environment environment = 
	new Environment("development", transactionFactory, dataSource);
	Configuration configuration = new Configuration(environment);
	configuration.addMapper(BlogMapper.class);
	SqlSessionFactory sqlSessionFactory = 
	new SqlSessionFactoryBuilder().build(configuration);
	注意该例中,configuration 添加了一个映射器类(mapper class)。
	映射器类是 Java 类,它们包含 SQL 映射注解从而避免依赖 XML 文件。
	不过,由于 Java 注解的一些限制以及某些 MyBatis 映射的复杂性,
	要使用大多数高级映射(比如:嵌套联合映射),仍然需要使用 XML 配置
	。有鉴于此,如果存在一个同名 XML 配置文件,MyBatis 会自动查找并加载它
	(在这个例子中,基于类路径和 BlogMapper.class 的类名,
	会加载 BlogMapper.xml)。具体细节稍后讨论。

从 SqlSessionFactory 中获取 SqlSession:

 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
 SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
	  Blog blog = (Blog) 
	  session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
	}
诚然,这种方式能够正常工作,对使用旧版本 MyBatis 的用户来说也比较熟悉。
但现在有了一种更简洁的方式——使用和指定语句的参数和返回值相匹配的接口
(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,
还不用担心可能出错的字符串字面值以及强制类型转换。
	try (SqlSession session = sqlSessionFactory.openSession()) {
		  BlogMapper mapper = session.getMapper(BlogMapper.class);
		  Blog blog = mapper.selectBlog(101);
}

作用域(Scope)和生命周期:

对象生命周期和依赖注入框架

依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,
并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。
如果对如何通过依赖注入框架使用 MyBatis 感兴趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 两个子项目。

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例, 但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
		  // 你的应用逻辑代码
		}

在所有代码中都遵循这种使用模式,可以保证所有数据库资源都能被正确地关闭。

映射器实例:

映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同。但方法作用域才是映射器实例的最合适的作用域。 也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃。 映射器实例并不需要被显式地关闭。尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。就像下面的例子一样:

	try (SqlSession session = sqlSessionFactory.openSession()) {
	BlogMapper mapper = session.getMapper(BlogMapper.class);
	// 你的应用逻辑代码
}

猜你喜欢

转载自blog.csdn.net/qq_44895397/article/details/106475319
今日推荐