MyBatis快速入門

MyBatis快速入門

 大背景

最近問答重構,發現DAO層仍是在使用ibatis,以前使用過MyBatis,相比iBatis有了不少進步,趁着此次重構,把iBatis完全換成MyBatis,一勞永逸...html

 

說說MyBatisjava

  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/mysql

GitHub站點:http://mybatis.github.com/mybatis-3/index.htmlgit

Google站點:https://code.google.com/p/mybatis/github

 

iBatis退休聲明:http://ibatis.apache.org/sql

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)要和上一步的接口名一致;apache

2.namespace屬性必須爲上一步接口的全類名:org.xiuyuan.mybatis.demo.mapper.UserMappermybatis

 

第五步:編寫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>

 

說明:app

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}
相關文章
相關標籤/搜索