MyBatis
一、什么是MyBatis
1、简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
对jdbc的封装框架有哪些:Hibernate,dbutils,jdbcTemplate[spring],mybatis
原理:Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
每一个 MyBatis 的应 用程序 都以一 个 SqlSessionFactory 对象的 实例为 核心。 SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。 SqlSessionFactoryBuilder 对象可以通过 XML 配置文件,或从以往使用惯例中准备好的 Configuration 类实例中来构建 SqlSessionFactory 对象。
2、入门——从XML中构建SQLSessionFactory
1、接口式编程 原生: Dao ====> DaoImpl mybatis: Mapper ====> xxMapper.xml 2、SqlSession代表和数据库的一次会话;用完必须关闭; 3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。 4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。 (将接口和xml进行绑定) EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class); 5、两个重要的配置文件: mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息 sql映射文件:保存了每一个sql语句的映射信息: 将sql抽取出来。
步骤:
* 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
* 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
* 3、将sql映射文件注册在全局配置文件中
* 4、写代码:
* 1)、根据全局配置文件得到SqlSessionFactory;
* 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
2.1 从 XML 文件中构建 SqlSessionFactory 的实例非常简单。这里建议你使用类路径下的资 源文件来配置,但是你可以使用任意的 Reader 实例,这个实例包括由文字形式的文件路径 或 URL 形式的文件路径 file://来创建。MyBatis 包含了一些工具类,称作为资源,这些工具 类包含一些方法,这些方法使得从类路径或其它位置加载资源文件更加简单。
1 //获取SqlSessionFactory 2 public SqlSessionFactory getSqlSessionFactory() throws IOException { 3 //读取配置文件 4 String resource = "mybatis-config.xml"; 5 Reader reader = Resources.getResourceAsReader(resource); 6 return new SqlSessionFactoryBuilder().build(reader); 7 }
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> <!-- 1、mybatis可以使用properties来引入外部properties配置文件的内容; resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 --> <properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}"/> <property name="url" value="${jdbc.jdbcUrl}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <mapper resource="com/ant/mybatis/UserMapper.xml"/> </mappers> </configuration>mybatis-config.xml
2.2 获取sqlSession对象,执行增删改查方法
public void daoSession() throws IOException { //获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //获取sqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); try{ //获取接口的实现类 对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //mybatis会给自动的创建一个代理对象,代理对象去执行增删改查 方法 User user = userMapper.findUserById(2); System.out.println(userMapper.getClass()); System.out.println(user); }finally { sqlSession.close(); } }
User实例
package com.ant.mybatis; public class User { private Integer id; private String name; private Integer age; private String address; 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", address='" + address + '\'' + '}'; } }User.java
UserMapper.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:命名空间,定义为接口的全类名。如下: id:唯一标识,可写用 方法名作为唯一标识 public User findUserById(Integer id); --> <mapper namespace="com.ant.mybatis.dao.UserMapper"> <select id="findUserById" resultType="com.ant.mybatis.User"> select * from user where id = #{id} </select> </mapper>UserMapper.xml
dao层的接口类
1 package com.ant.mybatis.dao; 2 3 import com.ant.mybatis.User; 4 5 public interface UserMapper { 6 //根据id查询User 7 public User findUserById(Integer id); 8 }
2.3 结果: