zoukankan      html  css  js  c++  java
  • MyBatis学习(一)

    前言

      再过一个月,转行做java web就满一年了。当初吸引我进入公司的,其实并不是java web,而是领导给我描述的hadoop生态圈、公司的hadoop集群以及大数据业务。可是进入公司后才发现,公司的主要开发是java web,会涉及到一些hdfs、hive以及spark的使用,但并不是重点。无奈走上了这条路,也只能硬着头皮干了。在公司,都是基于封装好的ssh框架开发,不甚了解,着实心慌,所以闲暇时候,自己会去找找spring,mybatis,springmvc的资料看看,然都不成体系。做事总得有章法,所以决定写几篇博客,一来可以使自己的学习过程有序进行,二来便于以后温习使用。

    正文

    1.为什么会有Mybatis

      正常情况下,我们使用java操作数据库,最常见的方式就是:

      1)拼接jdbc连接串,如一个mysql连接串 

    url = "jdbc:mysql://" + ip + ":" + port + "/" + serviceName + "?useUnicode=true&characterEncoding=UTF8";

      2)获取jdbc连接,如    

    Class.forName(driverClass);
    conn = DriverManager.getConnection(url, user, pwd);

      3)执行操作

    this.pstmt = getConnection().prepareStatement(sql);
    return this.pstmt.executeQuery(sql);
    ...
    rs.close();
    ...
    conn.close();

    观察上面的代码,可以发现,都是模板式代码,大量的重复工作有没有!!我们都知道,偷懒是人类进步的原动力,正式这种本能,产生了mybatis。我们看一下mybatis的官方介绍:

    避免了几乎所有的jdbc代码,确实很诱人,做事情,有巨人的肩膀可以站,那就不要浪费资源。

    2.数据库准备

      既然Mybatis是跟数据库打交道,所以我们就需要把数据库准备好,我使用的是mysql数据库,建了测试数据库和测试表,如下所示:

      

      数据库:mybatis

      测试表:users(id, name, age)

      测试数据:随便写入的数据

      与这张表对应的实体类:

    package org.tonny.entity;
    
    public class User
    {
        private int id;
        
        private String name;
        
        private int age;
        
        public int getId()
        {
            return id;
        }
        
        public void setId(int id)
        {
            this.id = id;
        }
        
        public String getName()
        {
            return name;
        }
        
        public void setName(String name)
        {
            this.name = name;
        }
        
        public int getAge()
        {
            return age;
        }
        
        public void setAge(int age)
        {
            this.age = age;
        }
        
        @Override
        public String toString()
        {
            return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
        }
        
    }

    3.Mybatis程序开发过程

      这么好的类库,当然要拿过来为我们所用。使用之前,我们需要下载并引入相关的jar包。Mybatis是我所见过的最清晰、独立的jar包,只需要下载一个mybatis-3.3.1.jar就可以了,到网上都可以找到。另外,因为要连接数据库,所以还需要相关的数据库驱动包,我使用的是mysql数据库,引入了mysql-connector-java-5.1.26-bin.jar包。这两个jar包准备好了,就可以。工程目录结构如下:

      

    3.1数据库信息

      我将数据库的连接信息写在了一个单独的文件中,即db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis
    name=root
    password=1qaz2wsx

      这些信息将会在Mybatis的配置文件中用到,配置文件mybatis.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>
        <!-- 指定数据库信息文件 -->
        <properties resource="db.properties"></properties>
        
        <!-- 数据库环境配置如果和spring整合就不需要配置了,完全交给spring -->
        <!-- environments中可以配置多个数据库,但是同一时间只能使用一个。
            default标识当前默认使用的数据库,当前默认使用mysql
         -->
        <environments default="mysql">
            <environment id="mysql">
                <!-- 事务管理器,当前只使用了mybatis框架,所以使用jdbc事务管理器。
                如果与spring集成的话,可以使用spring的事务管理器 -->
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息,使用数据库连接池(POOLED)方式连接 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}" />
                    <property name="url" value="${url}" />
                    <property name="username" value="${name}" />
                    <property name="password" value="${password}" />
                </dataSource>
            </environment>
        </environments>
    
        <!-- 管理每张表的映射文件 -->
        <mappers>
            <!-- 需要将每张表的配置文件加载进来,使用resource引入 -->
            <mapper resource="org/tonny/mapper/UsersMapper.xml" />
    
        </mappers>
    </configuration>

      其中注释比较详细,不再赘述。文件中<mapper resource="org/tonny/mapper/UsersMapper.xml" />是sql语句与实体映射的文件名称,其内容如下:

    <?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:映射文件的命名空间 命名规则是映射文件所在的Package名 + 文件名
     -->
    <mapper namespace="org.tonny.mapper.UsersMapper">
        <!-- parameterType:传入参数的类型; resultType:结果的数据类型 -->   
        <select id="getUserById" parameterType="int" resultType="org.tonny.entity.User">
            SELECT *
            FROM users WHERE id=#{id}
        </select>
    </mapper>

    这个文件的命名规则:表名(首字母大写,驼峰格式) + Mapper ,如我的表为users,那么文件名就是UsersMapper.xml

    3.2调用及测试

      有了上面的文件,就可以连接数据库进行测试了。这里我引入了单元测试JUnit4,引入方法如下:

      在工程上右击,选择property,左侧选择Java Builder Path 一项,右侧选择Libraries标签,点击Add Library...按钮,选择JUnit即可。

       然后就是建立测试类了:

      

    package org.tonny.test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    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.Before;
    import org.junit.Test;
    import org.tonny.entity.User;
    
    public class MyTest
    {
        private SqlSessionFactory sqlSessionFactory = null;
        
        @Before
        public void setUp()
            throws IOException
        {
            // 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
            // InputStream inputStream = MyTest.class.getClassLoader().getResourceAsStream("mybatis.xml");
            InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
            // 构建sqlSession的工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        
        @Test
        public void getUserById()
        {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            
            // 映射sql的标识字符串
            String sql = "org.tonny.mapper.UsersMapper.getUserById";
            int param = 1;
            User user = sqlSession.selectOne(sql, param);
            sqlSession.close();
            System.out.println(user);
        }
    }

      注意,测试类的名字千万不要写成Test,不然会无法测试。setUp函数每次都会在测试方法之前执行,所以可以把一些固定的内容写在这个方法里面。在右面方法右击,一次点击按钮,如下图所示:

      如果输出了结果,则测试成功。

    后记

      这些才仅仅是学习Mybatis的开始,还有很多问题待研究,比如,如果传入多个参数,如果进行增删改操作等,后面继续努力!

  • 相关阅读:
    【洛谷P1119】灾后重建
    【洛谷P1462】通往奥格瑞玛的道路
    【洛谷P1991】无线通讯网
    poj 2892(二分+树状数组)
    hdu 1541(树状数组)
    hdu 5059(模拟)
    hdu 5056(尺取法思路题)
    poj 2100(尺取法)
    hdu 2739(尺取法)
    poj 3320(尺取法)
  • 原文地址:https://www.cnblogs.com/supertonny/p/6256613.html
Copyright © 2011-2022 走看看