Mybatis入门

Mybatis入门(本篇文章是根据官网写的,有兴趣的可以去看看官网)

中文官网地址:https://mybatis.org/mybatis-3/zh/getting-started.html

Mybatis是一款优秀的持久层框架,是基于ORM的半自动轻量级框架,对jdbc的封装,它支持SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

半自动框架和全自动框架的区别:

  • 本质区别:是否需要手动编写sql

  • 全自动框架不能对sql进行优化,半自动框架需要手动修改sql所以利于优化。

mybatis是一个轻量级的框架,所谓的轻量级就是在程序运行期间所需要的的消耗资源不是很多。

ORM:(Object Relational Mapping 对象关系映射)

  • O:对象模型-实体对象。
  • R:关系型数据库的机构模型,数据库表。
  • M:映射-将实体对象与数据表建立映射。

M怎么完成映射的:

  • M是通过xml和注解对应实体和表
    如上面的图,定义ORM框架,首先是在数据库中出创建了一个表,然后在java类中创建实体类,实体类的字段对应数据库表中的列名。然后通过M实现映射,使java中的表可以映射到数据库的表中。后面我们学习的时候就会感受到这个框架的内容。在这里插入图片描述
    如上面的图,定义ORM框架,首先是在数据库中出创建了一个表,然后在java类中创建实体类,实体类的字段对应数据库表中的列名。然后通过M实现映射,使java中的表可以映射到数据库的表中。后面我们学习的时候就会感受到这个框架的内容。

在pom.xml文件中导入相关配置

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

version表示的是mybatis的版本,可以自己进行选择。

构建SqlSessionFactory

基于mybatis的应用都是一个以SqlSessionFactory的实例为核心。SqlSessionFactory是基于SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从配置文件或xml配置文件或一个预先配置的Configuration实例来构建出SqlSessionFactory实例。 xml中构建SqlSessionFactory构建factory非常简单,建议使用类路径下的资源进行配置。也可以使用任意的输入流(InputStream)实例。mybatis有一个resource的工具类,包含了一些实用方法,从类路径或其他位置加载资源文件更容易。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

上面是mybatis官网的代码,resource锁指向的路径是配置文件的路径,在maven中配置路径不需要这么长,只要把xml文件放入到resource文件夹里,可以直接拿取文件不需要那么详细的路径。mybatis-config.xml文件名是可以修改的,只要读取的时候读取对了就行,但是一定要让人见名思议,知道这个文件是做什么的。

xml文件配置了mybatis系统的核心配置,包括获取数据库连接实例的数据源(Datasource)以及决定事务作用于和控制方式的事务管理器(TransactionManager)。

<?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="mysql">
      <!--注释使用mysql环境  -->
      <environment id="mysql">
       <!--使用jdbc类型事务  -->
        <transactionManager type="JDBC"></transactionManager>
        <!--使用连接池,用来配置数据库连接信息,property中的name属性是固定的,不需要去改  -->
        <dataSource type="POOLED">
           <property name="driver" value="com.mysql.jdbc.Driver"/>
           <property name="url" value="jdbc:mysql:///mybatis_db"/>
           <property name="username" value="root"/>
           <property name="password" value="root"/>
        </dataSource>
      </environment>
   </environments>
   
   <!--加载映射文件  -->
   <mappers>
     <mapper resource="mapper/UsersMapper.xml"/>
   </mappers>
</configuration>

xml头部声明,用来验证xml文档正确性。environment元素体包好了事务管理和连接池的配置。mappers元素包含了一组映射器(mapper),这些映射文件包含了sql代码和映射信息。
可以不使用xml构建SqlSessionFactory,从官网中找到。

获取SqlSession

SqlSession提供了数据库执行SQL命令所需要的方法。可以通过SqlSession实例来直接执行已经映射sql语句。

SqlSession session=sqlSessionFactory.openSession();
Blog blog=(Blog)session.selectOne("org.mybatis.example.BlogMapper.selectBlog",1);

selectOne表示查找一个对象,里面的参数1是表示在映射文件中的配置路径,也表示接口中的方法。参数2表示传递的参数。

现在有了一种更加简洁的方法——使用指定语句的参数和返回值相匹配的接口,这样代码不仅清晰而且安全,并且不用担心路径字符出错。

SqlSession session = sqlSessionFactory.openSession();
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

上面getMapper是获取的反射类,是对应映射接口的实现类。第三句直接调用的方法是接口中的方法,可以直接调用查询数据。这个方法比上面的方法要简单的多。

SQL语句实现

在mybatis中映射mysql语句有两种方式,一种是通过xml定义,一种是通过注解方式定义语句。一般来说mybatis可以利用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" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

如上面的代码,可以配置无数个数据库映射语句。上面的配置信息命名空间为"org.mybatis.example.BlogMapper",在命名空间中定义了一个selectBlog的映射语句。我们可以通过" org.mybatis.example.BlogMapper.selectBlog"来调用映射语句。

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

除了上面的方法,我们还可以尝试下面的方法执行:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

第二种方法可以直接调用接口中配置的方法,不需要去获取路径,,显然第二种方法是有优势的,它不依赖于字面值,更安全,而且更好的映射到sql语句。

命名空间:

命名空间有两个作用,一是利用更长的限定名将不同的语句隔离开来,二是可以实现接口绑定。一般限定名都是写的类的包名+类名,如上面的BlogMapper类的包路径为org.mybatis.example。我们指定的名字就是"org.mybatis.example.BlogMapper"。下面的语句指定的id就是对应类中的响应的方法名。

命名空间的命名规则:

全限定名–直接用于查找和使用,例如org.mybatis.example.BlogMapper.selectBlog。 短名称-- 如果全局唯一的话可以作为单独引用,如果不唯一可能会产生“短名称不唯一”的错误,这种情况下需要使用全限定名,一般我们都是用全限定名。

上面整体是使用xml配置的sql语句,下面我们使用注解方式来实现注解方式配置sql语句。

package org.mybatis.example;public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

使用注解方式可以使代码很简洁。但是对于更复杂的语句,注解会有些力不从心,会让注解里的sql语句更加混乱。

作用域和生命周期

SqlSessionFactoryBuilder:

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

SqlSessionFactory:

一旦被创建就应该在运行期间一直存在,最好不要丢弃它。SqlSessionFcatory最好不要创建多次。SqlSessionFactory最佳作用域是应用作用域。这一点可以通过单例设计模或工厂设计模式来实现。

SqlSession:

每个线程都有自己的sqlSession实例。SqlSession是线程不安全的,所以不能被共享,所以他的最佳作用域是请求或方法作用域。SqlSession不要放在静态域和实例变量里。也局不能将SqlSession放在任何类型的托管作用域中,比如Servlet的HttpSession。在写SqlSession的时候最好把关闭SqlSesion的语句放在finally中,这样保证每次都能关闭。

映射器实例:

映射器是一些绑定映射语句的接口。映射器接口的实例是从SqlSession获得。技术层面上讲,任何映射器实例的最大作用域与请求他们的Sqlsession相同。但是方法作用域才是映射器实例的最合适的作用域。映射器实例应该在调用他们的方法中被获取,使用完毕后即可丢弃。映射器不需要显示的关闭。尽管在整个请求的作用域保留实例不会有什么问题,但是你会发现,管理太多的sqlsession会让你忙不过来。所以最好将映射器放在方法的作用域中。

从数据库中读取数据的实例:

首先构建项目这里使用的是maven构造内容,否者导包太麻烦了。

创建一个表,这里是ORM中的R

#创建一个数据库
CREATE DATABASE mybatis_db  

#切换到创建的数据库中
USE mybatis_db

#创建一个数据表,表中有三个字段
CREATE TABLE users(
  id INT,
  `name` VARCHAR(50),
  grende VARCHAR(20)
)DEFAULT CHARSET=utf8

在pom.xml文件中导入mybatis坐标。

<project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  https://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>Mybatis_One</groupId>
       <artifactId>com.sang</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <!--指定编码和版本 -->
       <properties>
             <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
             <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
             <java.version>1.11</java.version>
             <maven.compiler.source>1.11</maven.compiler.source>
             <maven.compiler.target>1.11</maven.compiler.target>
       </properties>
       <dependencies>
             <!--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>5.1.6</version>
                    <scope>runtime</scope>
             </dependency>
             <!--单元测试坐标 -->
             <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.12</version>
                    <scope>test</scope>
             </dependency>
       </dependencies>
</project>

上面的主要坐标是mybatis坐标,用来操作mybatis的数据命令。

  <!--mybatis坐标 -->
<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.4</version>
</dependency>

数据库驱动坐标:

  <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
       <scope>runtime</scope>
</dependency>

创建实体类用来映射数据库中的数据:
实例类是用来映射数据库中的数据的,封装的每一个字段都是数据库的列名。这就是ORM中的O

public class Users {
       //这个字段是和数据库中的字段对应的,也就是数据库中的字段叫什么名字,这里面也叫什么名字
       int id;
       String name;
       String grende;
       省略了get/set方法 
       省略了toString方法
}

创建Mapper.xml用来执行sql语句
建议Mapper.xml取名为数据表的名成+Mapper.xml,例如:Users表名称为UsersMapper.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="">
  <!--namespace:命名空间(与id共同确认执行语句的位置),用来指定下面语句操作的路径,一般这里边指定的是包名  
      resultType:返回类型,表示该语句执行完成后,会返回什么样的类型数据,一般这里是给类的路径,通过反射找到类
      id:表示要执行的语句名称,对应指定类路径下的方法
  -->
  <select id="findAll" resultType="util.Users">
       select * from users
  </select>
</mapper>

上面介绍了映射SQL语句使用的是xml文件,这里就是通过xml映射实现sql语句。

创建SqlMapconfig.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="mysql">
      <!--注释使用mysql环境  -->
      <environment id="mysql">
       <!--使用jdbc类型事务  -->
        <transactionManager type="JDBC"></transactionManager>
        <!--使用连接池,用来配置数据库连接信息,property中的name属性是固定的,不需要去改  -->
        <dataSource type="POOLED">
           <property name="driver" value="com.mysql.jdbc.Driver"/>
           <property name="url" value="jdbc:mysql:///mybatis_db"/>
           <property name="username" value="root"/>
           <property name="password" value="root"/>
        </dataSource>
      </environment>
   </environments>
   
   <!--加载映射文件  -->
   <mappers>
     <mapper resource="mapper/UsersMapper.xml"/>
   </mappers>
</configuration>

上面代码创建了数据库的配置信息内容,比如配置环境(environment)。配置互数据库连接内容(dataSource),以及配置映射文件(mappers)。

测试类

public class UserTest {    
       
       @Test
       public void testfindAll() throws IOException {
             //加载核心配置文件
             InputStream in =  Resources.getResourceAsStream("SqlMapconfig.xml");
             //获取sqlsessionfactory类
             SqlSessionFactory bui = new SqlSessionFactoryBuilder().build(in);
             //获取sqlsession会话对象
             SqlSession os = bui.openSession();
             //执行sql语句,参数是Mapper.xml文件中的语句
             List<Users> list = os.selectList("com.sang.findAll");
             
             for(Users u:list) {
                    System.out.println(u);
             }
             //释放资源
             os.close();
             
       }
}

如果有写的不对之处,欢迎指正出来,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值