首页 > 其他 > 详细

MyBatis——helloworld

时间:2021-05-22 23:44:35      阅读:20      评论:0      收藏:0      [点我收藏+]

一:MyBatis简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录.

二:为什么要使用MyBatis?

MyBatis是一个半自动化的持久化层框架。
JDBC:
       – SQL夹在Java代码块里,耦合度高导致硬编码内伤
       – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA
  – 长难复杂SQL,对于Hibernate而言处理也不容易
  – 内部自动生产的SQL,不容易做特殊优化。
  – 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
技术分享图片

 

 

 技术分享图片

总结:
   不管?jdbc或者JdbcTemplate,我们都花费了?量精?完成映射且是没有技术含量的体?活,企业实战中,我们都借助于框架来减少这种映射代码,提?开发效率,Java中?的?较多是Hibernate和Mybatis,在国内轻量级MyBatis??较多。

技术分享图片

#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">
<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/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件中(mybatis-config.xml)中-->
    <mappers>
        <mapper resource="EmployeeMapper.xml"/>
    </mappers>
</configuration>
#Employee.java
package com.lzr.bean;

/**
 * @author GGBond
 * @create 2021-05-22-18:17
 */
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private String gender;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastName=‘" + lastName + ‘\‘‘ +
                ", email=‘" + email + ‘\‘‘ +
                ", gender=‘" + gender + ‘\‘‘ +
                ‘}‘;
    }
}
#pom.xml
<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.apache.logging.log4j</groupId>-->
            <!--<artifactId>log4j-core</artifactId>-->
            <!--<version>2.14.1</version>-->
        <!--</dependency>-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
#EmployeeMapper.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="com.lzr.EmployeeMapper">
    <!--namespace:名称空间
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
    -->
    <select id="selectEmp" resultType="com.lzr.bean.Employee">
       select * from tbl_employee where id = #{id}
    </select>
</mapper>
#MybatisTest.java
package com.lzr.test;

import com.lzr.bean.Employee;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

/**
 * 1.根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,有数据源一些运行环境信息
* 2.sql映射文件:配置了每一个sql,以及sql的封装规则
* 3.将sql映射文件注册在全局配置文件中
* 4.写代码
* 1):根据全局配置文件得到SqlSessionFactory,
* 2):使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3):使用sql的唯一标志来告诉Mybatis执行哪个sql,sql都是保存在sql映射文件中的; *
@author GGBond * @create 2021-05-22-18:25 */ public class MyBatisTest { @Test public void test() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.获取sqlSession实例,能直接执行已经映射的sql语句 SqlSession openSession = sqlSessionFactory.openSession(); //第一个参数:SQL的唯一标识,第二个参数:执行SQL要用的参数 try { Employee employee = openSession.selectOne("com.lzr.EmployeeMapper.selectEmp", 1); System.out.println(employee); } finally { openSession.close(); } } }

技术分享图片

 

 

 技术分享图片

 

 

 技术分享图片

 接口式编程: 

1.原生: Dao ===> DaoImpl

   MyBatis;Mapper ===> xxMapper.xml

2.SqlSession代表和数据库的一次会话;用完必须关闭;

3.SqlSession和connection一样都是非线程安全的。每次使用都应该获取新的对象。

4.mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。

   (将接口和xml文件进行绑定)

   EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);

5.两个重要的配置文件:

      mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息。。。系统运行环境信息;

      sql映射文件:保存每一个SQL语句的映射信息,将sql抽取出来;

@Test
public void test01() throws IOException{ //1.获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //2.获取sqlSession对象 SqlSession openSession = sqlSessionFactory.openSession(); try { //3.获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(mapper.getClass()); System.out.println(employee); }finally { openSession.close(); } } private SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); }
#EmployeeMapper
package com.lzr.dao;

import com.lzr.bean.Employee;

/**
 * @author GGBond
 * @create 2021-05-22-19:34
 */
public interface EmployeeMapper {
    public Employee getEmpById(Integer id);
}

技术分享图片

#EmployeeMapper.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="com.lzr.dao.EmployeeMapper">
    <!--namespace:名称空间;指定为接口的全类名
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
    -->
    <select id="getEmpById" resultType="com.lzr.bean.Employee">
       select id,last_name lastname,email,gender from tbl_employee where id = #{id}
    </select>
</mapper>

技术分享图片

 三:mybatis工作原理

技术分享图片

 

 

 

1. 读取MyBatis的配置?件:mybatis-config.xml为MyBatis的全局配置?件,?于配置数据库连接信息。
2. 加载映射?件:映射?件即SQL映射?件,该?件中配置了操作数据库的SQL语句,需要在MyBatis配置?
件mybatis-config.xml中加载。mybatis-config.xml ?件可以加载多个映射?件,每个?件对应数据库
中的?张表。
3. 构造会话??:通过MyBatis的环境配置信息构建会话??SqlSessionFactory。
4. 创建会话对象:由会话??创建SqlSession对象,该对象中包含了执?SQL语句的所有?法。
5. Executor执?器:MyBatis底层定义了?个Executor接口来操作数据库,它将根据SqlSession传递的参数
动态地?成需要执?的SQL语句,同时负责查询缓存的维护。
6. MappedStatement对象:在Executor接口的执??法中有?个MappedStatement类型的参数,该参数
是对映射信息的封装,?于存储要映射的SQL语句的id、参数等信息。
7. 输?参数映射:输?参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输?参数
映射过程类似于JDBC对preparedStatement对象设置参数的过程。
8. 输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果
映射过程类似于JDBC对结果集的解析过程。
  MyBatis的基本?作原理就是:先封装SQL,接着调?JDBC操作数据库,最后把数据库返回的表结果封装成Java
类。

启动?志验证:

?先添加?志依赖:

技术分享图片

然后在resources?录下添加?件log4j2.xml


<?xml version="1.0" encoding="UTF-8"?>
<!--?志级别以及优先级排序:OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL-->
<!--Configuration后?的status,这个?于设置log4j2??内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够?动检测修改配置?件和重新配置本?,设置间隔秒数-->

<configuration status="TRACE" monitorInterval="30">
<!--先定义所有的appender-->
<appenders>
<!--输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出?志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l- %m%n"/>
</console>
</appenders>
<!--然后定义logger,只有定义了logger并引?的appender,appender才会?效-->
<loggers>

<!--过滤掉spring和mybatis的一些无用的DEBUB信息-->
<logger name="org.springframework.transaction" level="DEBUG"/>
<logger name="org.mybatis" level="INFO"/>

<root level="all">
<!--输出到控制台-->
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>

技术分享图片

 

MyBatis——helloworld

原文:https://www.cnblogs.com/NBYG/p/14799677.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!