1.什么是Mybatis
1.MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation
迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
2.iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
3.MyBatis是一个数据持久层(ORM)框架。把实体类和SQL语句之间建立了映射关系,
是一种半自动化的ORM实现。
下载地址:https://github.com/mybatis mybatis的jar包
2.MyBatis的优点
1. 基于SQL语法,简单易学。
2. 能了解底层组装过程。
3. SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。(重点)
4. 程序调试方便。
所有sql语句,全部定义在xml(建议)中。也可以通过注解的方式在接口上实现。这些映射文件称之为mapper。
3.与jdbc区别
1. 减少了61%的代码量
2. 最简单的持久化框架
3. 架构级性能增强
4. SQL代码从程序代码中彻底分离,可重用
5. 增强了项目中的分工
6. 增强了移植性
4.MyBatis工作流程
1. 加载配置并初始化:加载配置文件,将SQL的配置信息加载成为一个个MappedStatement对象
(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
2. 接收调用请求:调用Mybatis提供的API,传入参数:SQL的ID和传入参数对象,
将请求传递给下层的请求处理层进行处理。
3. 处理操作请求:API接口层传递请求过来,传入参数:为SQL的ID和传入参数对
象,处理过程:
3.1根据SQL的ID查找对应的MappedStatement对象。
3.2根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行
传入参数。
3.3获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得
到执行结果。
3.4根据MappedStatement对象中的结果映射配置,对得到的执行结果进行转换处
理,并得到最终的处理结果。
3.5释放连接资源。
3.6返回处理结果将最终的处理结果返回。
5.操作流程
1.导入 mybatis的jar包 和 与数据库相对的驱动(oracle的为ojdbc6.jar)
2.全局配置文件
2.1SqlMapConfig.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>
<properties resource="db.properties"></properties> <!-- 关联db配置文件 -->
<environments default="development">
<!--可以在environments配置多个环境-->
<environment id="development">
<!-- 事务管理:jdbc 与 managed-->
<!-- jdbc:直接全部使用jdbc的提交回滚功能... -->
<!-- managed: 什么都不做 不回滚 不提交 不关闭连接 而是交给窗口处理 托管-->
<transactionManager type="JDBC" />
<dataSource type="POOLED"><!--POOLED(一般使用这个 带连接缓存池) UNPOOLED JNDI-->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="Mapper.xml" /> <!--关联文件可以多个 根据什么对象可以不同命名比如 EmpMapper.xml -->
</mappers>
</configuration>
2.2 db.properties文件
driver=oracle.jdbc.driver.OracleDriver
url=jdbc\:oracle\:thin\:@localhost\:1521\:orcl
username=scott
password=123456
3.Mapper.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">
<mapper namespace="UserInfo">
<select id="selectUser" parameterType="int" resultType="myBatisTest.UserInfo">
<!--resultType:输出结果映射成java对象类型 注意保证对象属性和列名一致-->
<!--select 定义select语句同理 update....-->
select * from userinfo where id = #{id}
<!--#{}为占位符(语句的?) #{id}表示接收的参数名称是id 如果输入的是简单类型,参数可以任意可以为value或其他名称-->
</select>
</mapper>
4.SqlSessionFactory、SqlSession接口
package myBatisTest;
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;
public class test {
/*该功能一般做在Dao的实现层*/
public static void main(String[] args) throws IOException {
/*获取SqlSessionFactory接口*/
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(is);
/*获取SqlSessionFactory接口*/
SqlSession sqlsession = sf.openSession();
/*带参 查一条*/
/*参数从Mapper.xml获取UserInfo的selectUser 然后插入参数为141*/
UserInfo u= sqlsession.selectOne("UserInfo.selectUser",21);
System.out.println(u);
/*释放资源*/
sqlsession.close();
}
}
5.对象UserInfo
package myBatisTest;
public class UserInfo {
int id;
String userName;
String password;
String sex;
String email;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public UserInfo() {
super();
}
public UserInfo(int id, String userName, String password, String sex, String email) {
super();
this.id = id;
this.userName = userName;
this.password = password;
this.sex = sex;
this.email = email;
}
@Override
public String toString() {
return "UserInfo [id=" + id + ", userName=" + userName + ", password=" + password + ", sex=" + sex + ", email="
+ email + "]";
}
}
6.结果(数据库自行搭建)
UserInfo [id=21, userName=1234, password=1234, sex=男, eamil=null]