• 【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

  • 相关阅读:
    P1281 书的复制 dp
    P3402 最长公共子序列(nlogn)
    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers
    P1202 黑色星期五
    P1205 方块转换
    [递推] hihocoder 1239 Fibonacci
    [二分] hihoCoder 1269 优化延迟
    [分治] POJ 3233 Matrix Power Series
    使用HTMLParser解析html
    CSAPP2e: Proxy lab 解答
  • 原文地址:https://www.cnblogs.com/tangyouwei/p/15643854.html
Copyright © 2020-2023  润新知