天天看点

MyBatis概述+ 入门程序(深入浅出)

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异常,从而不再要求程序必须处理所有异常

继续阅读