MyBatis快速入门

来源:互联网 发布:mac系统如何下载软件 编辑:程序博客网 时间:2024/06/12 00:59

MyBatis快速入门

一、Mybatis简介


MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。


二、MyBatis框架原理

架构图如下:


1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。


三、MyBatis 入门程序

这里通过一个简单的通过id查询记录为例快速入门


1、数据库文件



2、jar包



3、SqlMapConfig.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 和spring整合后 environments配置将废除--><environments default="development"><environment id="development"><!-- 使用jdbc事务管理--><transactionManager type="JDBC" /><!-- 数据库连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /><property name="username" value="root" /><property name="password" value="111111" /></dataSource></environment></environments><!-- 加载映射文件 --><mappers><mapper resource="sqlmap/User.xml"/></mappers></configuration>

4、User.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离注意:使用mapper代理方法开发,namespace有特殊重要的作用 --><mapper namespace="test"><!-- 在映射文件中配置很多sql语句 --><!-- 通过id查询用户表的记录 --><!-- 通过select来执行数据库的查询id:标识映射文件的sql,将sql语句封装到mappedStatement对象中,所以称之为statement的id#{}表示一个占位符#{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以是value或者其他名称resultType:指定sql输出结果所映射的java对象类型,SELECT指定resultType表示将单条记录映射成java对象。 --><select id="findUserById" parameterType="int" resultType="cn.at.mybatis.po.User">SELECT * FROM user WHERE id=#{id}</select></mapper>

5、User.java

package cn.at.mybatis.po;import java.util.Date;public class User {private int id;private String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日private String address;// 地址public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex+ ", birthday=" + birthday + ", address=" + address + "]";}}

6、MyBatisFirst.java

package cn.at.mybatis.first;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import cn.at.mybatis.po.User;public class MyBatisFirst {//根据id查询用户信息,得到了一条记录结果@Testpublic void findUserById() throws IOException{//读取配置文件String resource = "SqlMapConfig.xml";//得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);//创建会话工厂SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//通过工厂得到sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//通过SqlSession操作数据库//第一个参数:映射文件中statement的id,等于 命名空间+statement的id//第二个参数:指定和映射文件中所匹配的parameterType类型的参数//sqlSession.selectOne 是与映射文件所匹配的resultType类型的对象User user = sqlSession.selectOne("test.findUserById", 1);System.out.println("=======> "+user);//释放会话资源sqlSession.close();}}

7、测试结果

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - Opening JDBC ConnectionDEBUG [main] - Created connection 288613043.DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1133e2b3]DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE id=? DEBUG [main] - ==> Parameters: 1(Integer)DEBUG [main] - <==      Total: 1=======> User [id=1, username=王五, sex=2, birthday=null, address=null]DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1133e2b3]DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1133e2b3]DEBUG [main] - Returned connection 288613043 to pool.

By luoyepiaoxue2014
微博地址:  http://weibo.com/luoyepiaoxue2014  点击打开链接