MyBatis:是一个支持普通SQL查询、存储过程和高级映射的优秀持久层框架。他去掉了几乎所有的JDBC代码和参数的手工设置以及对结果的检索封装。
好处:将SQL与程序代码分离,做到可以在不修改程序代码的情况下,直接在配置文件中修改SQL。
相比HIbernate等“全自动化”ORM(对象关系映射)机制而言,MYBatis以SQL开发的工作量和数据库移植性的让步,为系统设计提供了更大的自由空间。(MYBaits是半自动,意思是,在对于POJO与SQL之间的映射关系与其他ORM框架相同,只是并不会为程序员在运行期间自动生成SQL执行。具体的SQL需要程序员编写,然后配置映射文件,将其返回。)
MyBatis入门程序:
首先,需要去下载MyBaits的架包,下载地址(http://www.mybatis.org).我用的是MyBatis-3.3.1这个版本。
由于MyBatis的底层依然是基于JDBC的,因此在应用程序中使用MyBatis执行持久化同样少不了JDBC驱动。
(以MYSQL为例)
1.创建数据表的代码
drop table if EXISTS tb_user;
create table tb_user(
ID INT(11) PRIMARY KEY auto_increment,
NAME VARCHAR(18) DEFAULT NULL,
SEX char(2) DEFAULT NULL,
AGE INT(11) DEFAULT NULL
)
2.MyBatisz中的PO(持久化对象)非常简单的,是低侵入式的设计(不要求持久化类继承任何父类,或实现任何接口,保证了代码不被污染),完全采用普通的POJO对象作为持久化对象使用。代码如下
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 30743608586321401L;
// 用户标识
private Integer id;
// 用户姓名
private String name;
// 用户性别
private String sex;
// 用户年龄
private Integer age;
// 无参数构造器
public User() {
super();
}
// 有参数构造器
public User( String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
// setter和getter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="
+ age + "]";
}
}
3.MyBatis是通过XML文件去完成持久化类和数据库表之间的映射关系的,UserMapping.XML 代码如下:
<?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">
<!-- namespace指用户自定义的命名空间。
习惯上设置成为包名+SQL映射文件名,去除xml后缀 -->
<mapper namespace="com.mt.mapper.UserMapper">
<!--
id="save"是唯一的标示符
parameterType属性指明插入时使用的参数类型
useGeneratedKeys="true"表示使用数据库的自动增长策略,这需要底层数据库的支持
#{name} 表示取参数中的对象的name属性值
-->
<insert id="save" parameterType="com.mt.domain.User" useGeneratedKeys="true">
INSERT INTO tb_user(name,sex,age) values(#{name},#{sex},#{age})
</insert>
</mapper>
4.对于Mybatis来说,现在还不知道需要连接那个数据库,以及相关的其他详细信息。所以需要配置mybatis-config.xml来完成上面的操作。代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 声明指定该XML文件的版本和存储该文件所有的字符集 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>
<!--指定MyBatis所有日志的具体实现 -->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<!--环境配置,即连接的数据库相关信息 -->
<environments default="mysql">
<environment id="mysql">
<!--指定事务管理类型 type="JDBC" 指直接简单使用了JDBC 的提交和回滚设置 -->
<transactionManager type="JDBC"/>
<!-- dataSource 指数据源配置,POOLED 是JDBC连接对象的数据源连接成的实现 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value=""/>//mysql 用户名
<property name="password" value=""/>//密码
</dataSource>
</environment>
</environments>
<!-- mappers 告诉了MyBatis去哪里找持久化类的映射文件 -->
<mappers>
<mapper resource="com/mt/mapper/UserMapper.xml"/>
</mappers>
</configuration>
5.编写测试类代码如下:(当java程序以面向对象的方式来操作持久化对象时,mybatis负责将这种操作转换为底层SQL操作)
public class MyBatisTest {
public static void main(String[] args) throws Exception {
// 读取mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 初始化mybatis,创建SqlSessionFactory类的实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建Session实例
SqlSession session = sqlSessionFactory.openSession();
// 创建User 对象
User user = new User();
// 插入数据
session.insert("com.mt.mapper.UserMapper.save", user);
// 提交事务
session.commit();
// 关闭session
session.close();
}
}
6.执行持久化操作之间,为了在控制台输出的SQL,需要加入日志框架LOG4J的包。并在CLASSPATH下增加一个log4j.properties 代码如下:(相关知识点可以参考 Log4j的网站)
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.fkit.mapper.UserMapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
总结:
1.开发持久化类PO和编写持久化操作的Mapper.xml 映射文件,在其中定义要执行的sql语句。
2.获取SqlSessionFactory
3.获取session
4.用面向对象的方式操作数据库
5.关闭事务,关闭Sqlsession
对比JDBC,Mybatis优点总结:
1.只需要在Mapper.xml 配置文件中编写SQL语句,在应用程序中就可以采用OO方式来访问数据库。
2.在JDBC访问过程中大量的checked异常被包装成MyBatis的Runtime异常,从而不再要求程序必须处理所有异常