MyBatis 01 -持久层优秀框架MyBatis基础入门

时间:2021-10-31 01:18:59

1 mybatis引入

https://mybatis.org/mybatis-3
MyBatis中文戳这里MyBatis 01 -持久层优秀框架MyBatis基础入门

1.1 框架

框架软件的半成品,解决了软件开发过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率。

1.2 ORM框架

  • ORM(Object Relational Mapping)对象关系映射,将程序中的一个对象与表中的一行数据一一对应
  • ORM框架提供了持久化类与表的映射关系,在运行时参照映射文件的信息,把对象持久化到数据库中

1.3 使用JDBC完成ORM操作的缺点

  • 存在大量的冗余代码。

  • 手工创建 Connection、Statement 等。

  • 手工将结果集封装成实体对象。

  • 查询效率低,没有对数据访问进行过优化(Not Cache)。

2 MyBatis框架

2.1 概念

  • MyBatis本是Apache软件基金会的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到Github。
  • MyBatis是一个优秀的基于Java的持久层框架,支持自定义SQL,存储过程和高级映射。
  • MyBatis对原有JDBC操作进行了封装,几乎消除了所有JDBC代码,使开发者只需关注 SQL 本身。
  • MyBatis可以使用简单的XML或Annotation来配置执行SQL,并自动完成ORM操作,将执行结果返回。

2.2 访问与下载

官方网站:http://www.mybatis.org/mybatis-3/

下载地址:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1

3 Myabtis入门

文件配置可以直接官网cv

MyBatis 01 -持久层优秀框架MyBatis基础入门

3.1 pom.xml中引入MyBatis核心依赖

 <!-- 导入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.47</version>
</dependency>

3.2 创建MyBatis核心配置文件

在src-mian-resource路径下创建并配置mybatis-config.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">

<!--mybatis的核心配置-->
<configuration>

    <!--mybatis环境配置 default:选择环境配置 -->
    <!--environments:多环境配置  default:选中环境-->
    <environments default="development">
        <!--mybatis具体环境配置-->
        <!--环境配置  id:唯一表示-->
        <environment id="development">
        <!--mybatis的事务管理配置,默认使用的是JDBC的事务管理(未来使用Spring提供的事务管理) -->
            <transactionManager type="JDBC"/>
        <!--mybatis的数据源配置(配置数据类的连接信息),默认使用的是JDBC的数据源(未来使用Druid数据源)-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 关联接口的mapper映射配置文件   -->
    <mappers>
        <!--关联映射文件(加载配置文件)-->
        <mapper resource="EmpMapper.xml"/>
    </mappers>
</configuration>

dtd约束 <!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>

3.3 定义实体类

@Data 
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Double sal;
    private Double comm;
    private Integer deptno;
}

3.4 创建Mapper接口

public interface EmpMapper {
    List<Emp> selectAll();
}

3.5 配置映射文件

<?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">
<!--
    mybatis 映射配置文件
    namespace:命名空间(区分不同的接口,namespace要与接口的一致)
-->
<mapper namespace="priv.yinying.mapper.EmpMapper">
    <!--
      select标签:表示查询操作(insert、delete、update)
      id属性:必填,表示接口的中方法的名称(完全一致)
      resultType属性:返回的类型,必须要写全限定名
                  无论查询的结果是单个的实体类,还是List集合,都写单一类型
                  List<Emp>、Emp
      -->
    <select id="selectAll" resultType="priv.yinying.pojo.Emp">
        select * from emp
    </select>
</mapper>

3.6 关联映射文件

<!-- 关联接口的映射配置文件   -->
<mappers>
    <mapper resource="EmpMapper.xml"/>
</mappers>

3.7 编写测试类

empList.forEach(new Consumer<Emp>() {
    @Override
    public void accept(Emp emp) {
        System.out.println(emp);
    }
});

for (Emp emp : empList) {
    System.out.println(emp);
}
  1. 编写Mybatis核心配置文件(配置数据源以及mybatis的相关配置)
  2. 编写接口的Mapper映射文件
  3. 在主配置文件中关联Mapper映射文件
  4. 测试
    1. 创建SqlSession(Mybatis操作数据库的对象)对象
    2. 通过SqlSession创建接口的代理对象
    3. 通过接口代理对象调用接口中的方法
public class MybatisTest {
    @Test
    public void test01() throws IOException {
        //1、获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
        //2、通过sfb获取SqlSessionFactory对象  (加载mybatis的核心配置文件)
        SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
        //3、通过sf获取SqlSession对象。
        SqlSession sqlSession = sf.openSession();
        //4、通过SqlSession对象获取Mapper对象(EmpMapper接口的实现类是由Mybatis使用动态代理技术实现的)
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        //最终的目的(获取EmpMapper的对象,对象selectAll方法)
        List<Emp> empList = empMapper.selectAll();
        for (Emp emp : empList) {
            System.out.println(emp);
        }
    }
}

4 mybatis三种开发方式

4.1 方式1 (开发常用)

  • 编写Mapper接口
  • 编写映射文件
  • 通过SqlSession获取Mapper对象,调用对应的方法

与上述案例一致

4.2 方式2 (MyBatis提供的API)

  • 编写映射文件
  • 通过SqlSession调用对应的方法

映射文件

<?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">
<!--
    namespace:命名空间,用于标识Mapper映射文件
-->
<mapper namespace="empMapper">
    <select id="getAll" resultType="priv.yinying.pojo.Emp">
        select * from emp
    </select>
</mapper>

测试类

public class MyBatisTest02 {
    @Test
    public void test01() throws IOException {
        SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
        SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = sf.openSession();
        List<Object> list = sqlSession.selectList("empMapper.getAll");
        //最终的目的:调用xml映射文件中的getAll方法
        list.stream().forEach(System.out::println);
    }
}

4.3 方式3 (注解开发)

  • 编写Mapper接口。使用注解
  • 通过SqlSession获取Mapper对象,调用对应的方法

Mapper接口

public interface EmpMapper {
    @Select("select * from emp")
    List<Emp> findAll();
}

测试类

@Test
public void test01() throws IOException {
    SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
    SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sf.openSession();
    EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    List<Emp> empList = empMapper.findAll();
    empList.forEach(System.out::println);
}

5 mybatis开发细节

5.1 properties配置文件

对于mybatis-config.xml的核心配置中,如果存在需要频繁改动的数据内容,可以提取到properties中。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///java?useSSL=false
username=root
password=123456

修改mybatis-config.xml。数据源配置

<environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </dataSource>
</environment>

5.2 类型名

为实体类定义别名,提高书写效率。

<!--  设置类型别名    -->
<typeAliases>
    <!-- 只能给单个的类型设置别名      -->
    <!-- <typeAlias type="priv.yinying.pojo.Emp" alias="cxk"/>-->
    <!-- 给整个包下的类设置别名   默认的别名就是类型的名称   -->
    <package name="priv.yinying.pojo"/>
</typeAliases>

5.3 创建log4j配置文件

开启mybatis日志

<configuration>
 <!--引入外部的配置文件-->
 <properties resource="db.properties"></properties>

 <!--mybatis的全局配置-->
 <settings>
     <!--开启mybatis日志配置-->
     <setting name="logImpl" value="STDOUT_LOGGING"/>
 </settings>

 <!--类型别名配置-->
 <typeAliases>
     <!--对单个类进行别名配置-->
     <!--<typeAlias type="priv.yinyinyg.pojo.User" alias="abc"/>-->
     <!--对整个包下所有的类进行配置,别名默认是类名(不区分大小写)  比如别名是 dept/user-->
     <package name="priv.yinying.pojo"/>
 </typeAliases>



 <environments default="development">
     <environment id="development">
         <!--  mybatis事务管理器  当前是默认的(JDBC)   未来用spring提供的事务管理器          -->
         <transactionManager type="JDBC"/>
         <dataSource type="POOLED">
             <property name="driver" value="${driver}"/>
<!--  &amp  &字符-->
             <property name="url" value="${url}"/>
             <property name="username" value="${username}"/>
             <property name="password" value="${password}"/>
         </dataSource>
     </environment>
 </environments>
 <mappers>
     <!--    resource后面跟文件  class后面跟类      -->
     <!--关联映射文件(加载配置文件)   -->
     <mapper resource="UserMapper.xml"/>
     <mapper resource="DeptMapper.xml"/>

     <!--关联Mapper接口(加载注解)-->
     <mapper class="priv.yinying.mapper.UserMapper2"/>



<!--        <mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
 </mappers>
</configuration>

pom.xml添加log4j依赖

<!-- 引入日志依赖 -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

添加log4j.properties文件

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

日志级别说明

级别 描述
ALL LEVEL 打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
DEBUG 输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
INFO 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
WARN 输出警告信息;表明会出现潜在错误的情形。
ERROR 输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
OFF LEVEL 关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。

5.4 配置模板

  • 配置mybatis模板 File | Settings | Editor | File and Code Templates flies新建mybaatis核心配置文件 xml 勾选enable

  • 配置mapper映射模板

6 mybatis实现增删改查