MyBatis 入門
1.1 MyBatis 是什么?
MyBatis 是一個簡化和實現了 Java 數據持久化層(persistence layer)的開源框架,它抽象了大量的 JDBC 冗余代碼,并提供了一個簡單易用的 API 和數據庫交互。
MyBatis 的前身是 iBATIS,iBATIS 于 2002 年由 Clinton Begin 創建。 MyBatis 3 是 iBATIS 的全新設計,支持注解和 Mapper。
MyBatis 流行的主要原因在于它的簡單性和易使用性。在 Java 應用程序中,數據持久化層涉及到的工作有:將從數據庫查詢到的數據生成所需要的 Java 對象;將 Java 對象中的數據通過 SQL 持久化到數據庫中。
MyBatis 通過抽象底層的 JDBC 代碼,自動化 SQL 結果集產生 Java 對象、 Java 對象的數據持久化數據庫中的過程使得對 SQL 的使用變得容易。
1.2 為什么選擇 MyBatis?
當前有很多 Java 實現的持久化框架,而 MyBatis 流行起來有以下原因:
- 它消除了大量的 JDBC 冗余代碼
- 它有低的學習曲線
- 它能很好地與傳統數據庫協同工作
- 它可以接受 SQL 語句
- 它提供了與 Spring 和 Guice 框架的集成支持
- 它提供了與第三方緩存類庫的集成支持
- 它引入了更好的性能
1.3 MyBatis 安裝和配置
1.3.1 新建 mybatis-config.xml配置文件
創建 MyBatis 的主要配置文件 mybatis-config.xml,其中包括數據庫連接信息,類型別名等等,然后將其加
到 classpath 中;
<?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>
<typeAliases>
<!--
<typeAlias alias="User" type="com.kygo.mybatis.entity.User"/>
-->
<package name="com.kygo.mybatis.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kygo/mybatis/dao/UserDao.xml"/>
</mappers>
</configuration>
1.3.2 映射器 UserDao.xml
創建 SQL 映射器 XML 配置文件 UserDao.xml 并且將它放在 com.kygo.mybatis.mappers 包中
<?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="com.kygo.mybatis.dao.UserDao">
<resultMap type="User" id="UserResult">
<id column="userid" property="id" />
<result column="username" property="username" />
<result column="email" property="email" />
<result column="nickname" property="nickname" />
<result column="gender" property="gender" />
</resultMap>
<select id="findAll" resultMap="UserResult">
select * from tb_user
</select>
<select id="findByUsername" parameterType="String" resultType="User">
select * from tb_user where username=#{username}
</select>
<insert id="save" parameterType="User">
insert into tb_user value (default, #{username}, #{password}, #{email},
#{gender}, #{nickname}, #{photo})
</insert>
<delete id="deleteByUsername" parameterType="String">
delete from tb_user where username=#{username}
</delete>
<update id="update" parameterType="User">
update tb_user set email=#{email} where username=#{username}
</update>
</mapper>
1.3.3 新建 UserDao 接口
讓我們創建一個 UserDao 接口,其定義的方法名和在 Mapper XML 配置文件定義的 SQL 映射語句名稱相同;
public interface UserDao {
public List<User> findAll();
public User findByUsername(String username);
public void save(User user);
public void deleteByUsername(String username);
public void update(User user);
}
1.3.4 測試
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = sessionFactory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.findByUsername("admin");
session.close();
1.3.5 它是怎么工作的
首先,我們配置了 MyBatis 最主要的配置文件-mybatis-config.xml,里面包含了 JDBC 連接參數;配置了映射器Mapper XML 配置文件文件,里面包含了 SQL 語句的映射。
我們使用 mybatis-config.xml 內的信息創建了SqlSessionFactory 對象。每個數據庫環境應該就一個SqlSessionFactory 對象實例,所以我們使用了單例模式只創建一個 SqlSessionFactory 實例。
我們創建了一個映射器 Mapper 接口-UserDao,其定義的方法簽名和在 UserDao.xml 中定義的完全
一樣(即映射器 Mapper 接口中的方法名跟 UserDao.xml 中的 id 的值相同)。注意 UserDao.xml 中namespace 的值被設置成com.kygo.mybatis.dao.UserDao,是 UserDao 接口的完全限定名。這使我們可以使用接口來調用映射的 SQL 語句。
在 StudenService.java 中,我們在每一個方法中創建了一個新的 SqlSession,并在方法功能完成后關閉SqlSession。每一個線程應該有它自己的 SqlSession 實例。 SqlSession 對象實例不是線程安全的,并且不被共享。所以 SqlSession 的作用域最好就是其所在方法的作用域。從 Web 應用程序角度上看,SqlSession 應該存在于 request 級別作用域上。
配置日志
新建 log4j.properties 文件,添加到 classpath 中
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n