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