zoukankan      html  css  js  c++  java
  • MyBatis快速入门

    MyBatis快速入门

     大背景

    最近问答重构,发现DAO层还是在使用ibatis,之前使用过MyBatis,相比iBatis有了很多进步,趁着这次重构,把iBatis彻底换成MyBatis,一劳永逸...

    说说MyBatis

      MyBatis是一个轻量级的ORM框架,它简化了对关系数据库的使用,开发人员可以在XML或注解中编写SQL来完成对数据库的操作,配置与使用简单,由于是手动写SQL,可控性好,便于SQL调优,而且如果完全使用XML方式,SQL语句可以集中维护,可以做到与Java代码完全隔离,也便于有DBA的团队对SQL调优。
    MyBatis的大版本号是3.x,它的前身叫iBatis,创建于2002,最后一个版本是2.3.5 GA,2012年做了重大改进,改名为MyBatis,项目也从Apache迁移到了Google Code,目前最新版本是3.2.3,发布于2013年6月13日。

    官方站点:http://www.mybatis.org/

    GitHub站点:http://mybatis.github.com/mybatis-3/index.html

    Google站点:https://code.google.com/p/mybatis/

    iBatis退休声明:http://ibatis.apache.org/

    MyBatis带来的好处

    1)MyBatis实现了接口绑定,无需自己写DAO实现类.
    2)方便的自动扫描机制,MyBatis可以自动扫描xml,接口和别名,无需手动维护.
    3)基于高效OGNL表达式,大简化SQL配置并强化SQL拼写逻辑.
    4)别名自动映射和驼峰命名自动适应机制,简化sql与java属性的映射.
    5)加入注解的功能,最直接的好处是可以参数绑定,摆脱了必须传Map
    6)iBatis已经退休了,官方不再维护升级, 官方只维护MyBatis.
     

    下面先来个快速入门实例.

    准备user表,用于示例
    CREATE TABLE USER (
      id          INT NOT NULL AUTO_INCREMENT,
      name        VARCHAR(20),
      create_time DATETIME,
      PRIMARY KEY (id)
    ) ENGINE = innodb DEFAULT CHARSET = utf8;
    
    初始化数据
     
    INSERT INTO user (name, create_time) VALUES ('刘一', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('陈二', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('张三', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('李四', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('王五', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('赵六', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('孙七', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('周八', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('吴九', current_timestamp);
    INSERT INTO user (name, create_time) VALUES ('郑十', current_timestamp);
    第一步:pom.xml加入以下依赖。
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.20</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.1.1</version>
    </dependency>
    
    第二步:编写domain类,注意包名。
    package org.xiuyuan.mybatis.demo.domain;
     
    public class User {
        private Integer id;
        private String name;
        private Date createTime;
     
    // getter, setter方法略
    }
    
    第三步:编写dao层,使用mybatis后,这一层可以只有接口,没有具体的类,注意包名。
    package org.xiuyuan.mybatis.demo.mapper;
     
    public interface UserMapper {
        List<User> findAll();
    }
    
    第四步:编写dao层的mapper文件UserMapper.xml,放在org.xiuyuan.mybatis.demo.mapper包下。
     
    <?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="org.xiuyuan.mybatis.demo.mapper.UserMapper ">
        <select id="findAll" resultType="User">
            select * from user
        </select>
    </mapper>
    
    

    注意:

    1.mapper文件名(UserMapper.xml)要和上一步的接口名一致;

    2.namespace属性必须为上一步接口的全类名:org.xiuyuan.mybatis.demo.mapper.UserMapper

    第五步:编写mybatis配置文件mybatis-config.xml,放在src/main/resources下。
     
     
    <configuration>
        <properties resource="database.properties"/>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        <typeAliases>
            <package name="org.xiuyuan.mybatis.demo.mapper.domain"/>
        </typeAliases>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${database.driverClassName}"/>
                    <property name="url" value="${database.url}"/>
                    <property name="username" value="${database.username}"/>
                    <property name="password" value="${database.password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <package name="org.xiuyuan.mybatis.demo.mapper.mapper"/>
        </mappers>
    </configuration>
    

    说明:

    1.src/main/resources/database.properties 数据库配置文件.

    2.typeAliases顾名思义,是类型的别名,这里配置为第二步domain类的包名,这样mybatis的mapper文件中就可以直接写类名,不必写类的全名。

    3.mappers配置第三步dao层接口类的包名,告诉mybatis接口类及mapper文件的位置。

    4.mapUnderscoreToCamelCase参数用于将下划线的命名格式转换为驼峰命名,如表字段名create_time,在domain类中定义为createTime,执行sql语句后,mybatis会自动把create_time转换为createTime,省去了写sql时指定别名的麻烦。

    至此,代码编写完成,现在编写测试用例:

    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);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            try {
                // 通过selectList查询
                List<User> userList = sqlSession.selectList(UserMapper.class.getName() + ".findAll");
                for (User user : userList) {
                    logger.debug(user.toString());
                }
     
                logger.debug("-----------------------------------");
     
     
                // 通过接口类查询
                UserMapper mapper = sqlSession.getMapper(UserMapper.class);
                List<User> users = mapper.findAll();
                for (User user : users) {
                    logger.debug(user.toString());
                }
            } finally {
                sqlSession.close();
            }
        }
    }
    
    
    执行测试用例,输出结果如下:
    User{id=1, name='刘一', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=2, name='陈二', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=3, name='张三', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=4, name='李四', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=5, name='王五', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=6, name='赵六', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=7, name='孙七', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=8, name='周八', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=9, name='吴九', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=10, name='郑十', createTime=Wed Mar 06 20:30:54 CST 2013}
    ------------------------------------------------------------------------
    User{id=1, name='刘一', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=2, name='陈二', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=3, name='张三', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=4, name='李四', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=5, name='王五', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=6, name='赵六', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=7, name='孙七', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=8, name='周八', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=9, name='吴九', createTime=Wed Mar 06 20:30:54 CST 2013}
    User{id=10, name='郑十', createTime=Wed Mar 06 20:30:54 CST 2013}
  • 相关阅读:
    git-for-windows 安装无图标的问题
    开源协议
    根据iframe获取window
    JS的checkbox状态切换dom无变化
    SQL条件!=null查不出数据
    jquery获取select选中项的文本
    泛型擦除
    树形菜单数据结构
    jqgrid动态填充select
    巨坑:jqgrid竟然取不到编辑模式下input的值
  • 原文地址:https://www.cnblogs.com/TestMa/p/10678026.html
Copyright © 2011-2022 走看看