Mybatis

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis相关的知识,希望对你有一定的参考价值。

1 为什么要使用Mybatis?

1.1 使用JDBC、DBUtils、JDBC Template等工具进行开发

 

  • 功能简单;
  • SQL语句编写在Java代码里面;
  • 硬编码高耦合的方式;

技术分享

 

1.2 使用Hibernate来进行开发

  • Hibernate是全自动的ORM框架,旨在SQL。
  • 但是这样我们希望SQL语句交给我们开发人员编写,希望SQL不失去灵活性。

技术分享

 

1.3 Mybatis框架:半自动、轻量级框架

  • SQL与Java代码分离;
  • SQL是开发人员控制;

技术分享

 

2  Mybatis简介

 2.1 Mybatis简介

  • Mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
  • Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
  • Mybatis可以使用简单的XML或者注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。

 

2.2 Mybatis历史

  •  原来是Apache的一个开源项目ibais,2010年6月这个项目由Apache Software Foundation迁移到了Google Code,随着开发团队转投Google Code旗下,ibatis3.X正式命名为Mybatis。
  • ibatis一词来源于“Internet”和“abatis”的组合,是一个基于Java的持久层框架。ibatis提供的持久层框架包括SQL Maps和Data Access Objects。

 

2.3 为什么要使用Mybatis?

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

    

2.4 下载地址

  •  https://github.com/mybatis/mybatis-3/

 

3 Mybatis入门--HelloWorld 

3.1 创建数据库及表

create database mybatis;
user database mybatis;
create table employee(
    id int(11) primary key auto_increment,
    last_name varchar(255),
    gender char(1),
    email varchar(255)
);

 

3.2 创建POJO

package cn.demo1;

/**
 * 描述:POJO
 */

public class Employee {
    private Integer id;
    private String lastName;
    private String gender;
    private String email;

    public Integer getId() {
        return id;
    }

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

    public String getEmail() {
        return email;
    }

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

    public String getLastName() {
        return lastName;
    }

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

    public String getGender() {
        return gender;
    }

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

 

3.3 导入jar包及log4j.properties

技术分享

 

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change ‘info‘ to ‘debug‘ ###

log4j.rootLogger=off, stdout

 

3.4 导入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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=""/>
    </mappers>
</configuration>

 

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">
<mapper namespace="default">
    <!--
        namespace:命名空间
        id:唯一标识
        resultType:返回值类型
    -->
    <select id="findById" parameterType="int" resultType="cn.demo1.Employee">
        select * from employee where id = #{id}
    </select>
</mapper>

 

3.6 在核心配置文件中配置映射文件

<?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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="cn/demo1/EmployeeMapper.xml"/>
    </mappers>
</configuration>

 

3.7 导入MySQL的驱动

3.8 建立测试类

package cn.test;

import cn.demo1.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

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

/**
 *
 * 描述:
 */

public class MybatisTest {

    @Test
    public  void demo1() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        Employee employee = session.selectOne("default.findById", 1);
        System.out.print(employee);

        session.close();
    }
}

技术分享

怎么解决?数据库中的字段和POJO中的属性值不一样呢,通过别名,即通过将SQL的别名设置为POJO中对应的属性值。

<?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="default">
    <!--
        namespace:命名空间
        id:唯一标识
        resultType:返回值类型
    -->
    <select id="findById" parameterType="int" resultType="cn.demo1.Employee">
        select id,last_name lastName,email,gender from employee where id = #{id}
    </select>
</mapper>

技术分享

4 Mybatis入门--HelloWorld的接口编程

4.1 新建一个接口

package cn.demo1;



public interface IEmployeeDAO {
    public Employee findById(Integer id);
}

 

4.2 修改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="cn.demo1.IEmployeeDAO">
<!--
    namespace:命名空间  指定为接口的全类名
    id:唯一标识 和接口中的方法名相同
    resultType:返回值类型
-->
<select id="findById" parameterType="int" resultType="cn.demo1.Employee">
    select id,last_name lastName,email,gender from employee where id = #{id}
</select>
</mapper>

 

4.3 测试

package cn.test;

import cn.demo1.Employee;
import cn.demo1.IEmployeeDAO;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

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

/**
 *
 * 描述:
 */

public class MybatisTest {

    @Test
    public  void demo1() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();

        IEmployeeDAO dao = session.getMapper(IEmployeeDAO.class);
        Employee employee = dao.findById(1);
        System.out.print(employee);

        session.close();
    }
}

 

 5 SqlSession

  • SqlSession代表和数据库的一次会话,用完必须关闭。
  • SqlSession和Connection一样都是线程不安全的,每次使用都应该去获取新的对象。
  • Mapper接口没有实现类,但是Mybatis会为这个接口生成代理对象。

 

以上是关于Mybatis的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段