【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.0,2003年2月21日發佈。

官方站點: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。

準備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類,注意包名。
public class User {
    private Integer id;
    private String name;
    private Date createTime;
  
// getter, setter方法略
}
第三步:編寫dao層,使用mybatis後,這一層可以只有接口,沒有具體的類,注意包名。
package fun.elricboa.demo.mapper;
 
public interface UserMapper {
    List<User> findAll();
}

第四步:編寫dao層的mapper文件UserMapper.xml,放在fun.elricboa.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="fun.elricboa.demo.mapper.UserMapper">
    <select id="findAll" resultType="User">
        select * from user
    </select>
</mapper>

注意:

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

2.namespace屬性必須爲上一步接口的全類名:fun.elricboa.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="fun.elricboa.demo.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="fun.elricboa.demo.mapper"/>
    </mappers>
</configuration>

說明:

1.database.properties是數據庫配置文件,也在src/main/resources下,引入這個文件後,後面就可引用數據庫配置項。

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();
        }
    }
}

以上是最簡單的查詢,下面給出條件查詢、增、刪、改的示例

對UserMapper接口增加6個方法:

    List<User> findAll();
 
    User findById(Integer id);
    List<User> findByIdList(List<Integer> userIdList);
    int insert(User user);
    int insertList(List<User> list);
    int update(User user);
    int deleteById(Integer id);
}
現在實現這6個方法,對於mybatis來說,就是在xml中寫sql語句,修改UserMapper.xml:
<select id="findById" parameterType="int" resultType="User">
        select * from user where id = #{id}
    </select>
 
 
    <select id="findByIdList" parameterType="list" resultType="User">
        select * from user where id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
 
 
    <insert id="insert" keyProperty="id" parameterType="User">
        insert into user(
          name, create_time
        ) values (
          #{name},
          <choose>
              <when test="createTime != null">
                  #{createTime}
              </when>
              <otherwise>
                  current_timestamp
              </otherwise>
          </choose>
        )
    </insert>
 
 
    <insert id="insertList" parameterType="list">
        insert into user(
          name, create_time
        ) values
        <foreach collection="list" item="item" open="(" close=")" separator="),(">
            #{item.name},
            <choose>
                <when test="item.createTime != null">
                    #{item.createTime}
                </when>
                <otherwise>
                    current_timestamp
                </otherwise>
            </choose>
        </foreach>
    </insert>
 
 
    <update id="update" parameterType="User">
        update user
        <set>
            <if test = "name != null">name = #{name},</if>
            <if test = "createTime != null">create_time = #{createTime},</if>
        </set>
        where
        id = #{id}
    </update>
 
 
    <delete id="deleteById" parameterType="int">
        delete from user where id = #{id}
    </delete>

注意:mybatis對於事務的auto_commit是false,對於上面的insert、update、delete實現,在測試代碼中需要手動提交事務,如:

@Test
public void testInsert() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 
 
        User user = new User();
        user.setName("測試");
        mapper.insert(user);
 
        // 提交事務
        sqlSession.commit();
    } finally {
        sqlSession.close();
    }
}

如果需要自動提交事務,可以在調用openSession方法時傳入參數,即sqlSessionFactory.openSession(true)










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章