【Java高级工程师蜕变之路】003 MyBatis高级进阶

前面的废话(高手可以直接无视)

MyBatis的前世今生

Mybatis原本是Apache软件基金会的一个开源项目叫做iBatis,2010年这个项目由Apache迁移到了goole code管理才改名为Mybatis,2013年又迁移到了GitHub。

ORM

ORM:Object/Relation Mapping 对象/关系映射

ORM思想:将数据库中的关系数据表映射为JAVA中的对象,把对数据表的操作转换为对对象的操作,实现面向对象编程。因此ORM的目的是使得开发人员以面向对象的思想来操作数据库

Mybatis VS Hibernate

Mybatis是一个优秀的持久层框架(Dao层框架),它是对JDBC的封装,使得开发者只需要关注Sql语句(业务)本身即可,无需开发者处理加载驱动、获取连接、创建Statement等繁琐的过程。

Hibernate框架是一个全自动的ORM持久层框架,只需要编写POJO,在xml中定义好Pojo属性和数据表字段的映射/对应关系,就可以在java中实现类似 insert(User)的操作。Sql语句都不用写。但是因为性能等问题,市场占有率越来越低。

Mybatis是目前比较流行的Dao层框架。

MyBatis开发基本步骤

①添加MyBatis的坐标

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
    <!--mybatis坐标-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</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>
    <!--⽇志坐标-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>

②创建user数据表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` VALUES ('1', '小唐', '123');
INSERT INTO `user` VALUES ('2', '小张', '456');
INSERT INTO `user` VALUES ('3', '小雨', '789');

③编写User实体类

package com.test.pojo;

public class User {
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}

④编写映射⽂件UserMapper.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="user">
    <select id="findAll" resultType="com.test.pojo.User">
        select * from user
    </select>
</mapper>

⑤编写核⼼⽂件SqlMapConfig.xml

<!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">
            <!-- 当前事务交给JDBC -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 当前只用MyBatis提供的连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///zdy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

⑥编写测试类

InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

List<User> users = sqlSession.selectList("user.findAll");

for (User user : users) {
    System.out.println(user);
}

sqlSession.close();

Mybatis基本流程

1、利用Resources工具类加载配置文件,并转换成输入输出流

2、利用解析的配置,创建SqlSessionFactory工厂

3、生产SqlSession

4、SqlSession调用方法

Mybatis配置文件分析

image

image

Mybatis常用配置

1、environments标签

image

事务管理器有两种

JDBC:直接使用JDBC的提交和回滚

MANAGED:默认行为,什么也不做

数据源的类型有三种:

UNPOOLED:每次请求打开和关闭链接

POOLED:使用连接池

JNDI:放置JNDI引用

2、mapper标签

image

MyBatis的Dao层实现

传统开发方式

1、定义DAO接口

public interface IUserDao {
    public List<User> findAll() throws  Exception;
}

2、DAOImpl实现

public class UserDaoImpl implements IUserDao{
    @Override
    public List<User> findAll() throws Exception {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<User> users = sqlSession.selectList("user.findAll");

        sqlSession.close();
        return users;
    }
}

3、测试

@Test
public void test5() throws Exception{
    IUserDao userDao = new UserDaoImpl();
    List<User> all = userDao.findAll();

    for (User user : all) {
        System.out.println(user);
    }
}

代理开发方式

Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接

口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper 接口开发需要遵循以下规范:

1) Mapper.xml文件中的namespacemapper接口的全限定名相同

2) Mapper接口方法名和Mapper.xml中定义的每个statementid相同

3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sqlparameterType的类型相同

4) Mapper接口方法的输出参数类型和mapper.xml中定义的每个sqlresultType的类型相同

配置文件深入

Properties

image

注意顺序:properties必须在最前面

typeAliases

原文地址:https://www.cnblogs.com/tangyouwei/p/15643854.html