MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。是一个基于Java的持久层框架.无论是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装!
先放项目目录:
- 准备测试工作
- 导入Mybatis开发包
mybatis-3.1.1.jar
mysql-connector-java-5.1.7-bin.jar
- 创建一张表(MySql)
-- ----------------------------
-- Table structure for customer
-- ----------------------------
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
`cust_id` int(11) NOT NULL AUTO_INCREMENT,
`cust_name` varchar(255) DEFAULT NULL,
`cust_profession` varchar(255) DEFAULT NULL,
`cust_phone` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of customer
-- ----------------------------
INSERT INTO `customer` VALUES ('1', '鲁班', '射手', '13499887733', '12341241@qq.com');
INSERT INTO `customer` VALUES ('2', '李白', '刺客', '18977665521', 'libai@163.com');
INSERT INTO `customer` VALUES ('3', '阿轲', '刺客', '18977665997', 'aike@qq.com');
INSERT INTO `customer` VALUES ('4', '德玛西亚', '肉盾', '13700997665', 'demaxiya.126.com6');
INSERT INTO `customer` VALUES ('5', '亚索', '战士', '13586878987', 'yasuo@qq.com');
INSERT INTO `customer` VALUES ('6', '奶妈', '辅助', '13398909089', 'nama@qq.com');
INSERT INTO `customer` VALUES ('7', '剑圣', '刺客', '13398909088', 'jiansheng@163.com');
- 创建实体:entity.customer.java
public class Customer {
private Integer cust_id;
private String cust_name;
private String cust_profession;
private String cust_phone;
private String email;
}
- 创建mybatis配置文件 :mybatis-config.xml
<?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>
<!-- spring整合后 environments配置将废除 使用spring中的连接池 -->
<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="1234" />
</dataSource>
</environment>
</environments>
</configuration>
- 创建与表对象的关系映射Mapper文件mapper/customer.xml
- 编写sql语句
<?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="myTest">
<!--后续通过namespace.id使用-->
<!--根据cust_id查询客户-->
<select id="queryCustomerById" parameterType="Int" resultType="com.hbuas.sw.entity.Customer">
SELECT * FROM `customer` WHERE cust_id = #{cust_id}
</select>
- 将mapper映射文件加载到mybatis配置文件
2、执行
1.从硬盘中将mybatis配置文件读到某一对象中;创建SqlSession,执行sql语句
//1.config.xml --->reader
Reader reader =Resources.getResourceAsReader("myBatis-config.xml);
//2.reader --->SqlSession
SqlSessionFactory sessionFacotry = new SqlSessionFactoryBuild().build(reader );
SqlSession session = sessionFacotry.openSession();
2.执行SQL
//第一个参数是Customer.xml的statement的ID;也可以写命名空间.ID;
Customer customer =sqlSession.selectOne("queryCustomerById",1L);
System.out.println("customer");
//释放内存
sqlSession.close();
======================分割线=========================
Mybatis工作流程:
-
通过Reader对象读取Mybatis配置文件
-
通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
-
获取当前线程的SQLSession
-
事务默认开启
-
通过SQLSession读取映射文件中的操作编号,从而读取SQL语句
-
提交事务
-
关闭资源
3.Main方法中的名词解释:
SqlSession:连接到数据库的一个会话,sqlSession中定义了数据库操作方法。
每个线程都应该有它自己的SqlSession实例,SqlSession的实例不能共享使用,它也是线程不安全的。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
SqlSessionFactory:创建sqlSession的工厂,是一个接口;接口中定义了openSession的不同重载方法。SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
SqlSessionFactoryBuilder:SqlSessionFactoryBuilder用于创建SqlSessionFacoty
SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了;因为SqlSession是通过SqlSessionFactory创建的;所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
MyBatis架构: