文章目录
MyBatis介绍
- MyBatis原本是apache的一个开源项目iBatis
- 2010年该项目由apache software foundation迁移到了Google code,并且改名为MyBatis
- 2013年11月迁移到GitHub
- MyBatis是一款持久化框架,它支持自定义SQL查询、存储过程以及高级映射
- 与传统的 JDBC 开发相比, MyBatis 消除了几乎所有的代码和参数的手工设置
- MyBatis是一个ORM框架
- MyBatis可以使用 XML 或注解方式进行配置和映射,它是把 实体类和SQL语句 之间建立了映射关系,而Hibernate是在实体类和数据库表之间建立了映射关系。
Hibernate与MyBatis都是持久化框架,都是ORM框架。都是在简化持久化操作。
MyBatis最终生成的所有程序都是程序员手动生成的。
- GitHub源码:
https://github.com/mybatis/mybatis-3 - MyBatis中文手册:
http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis核心XML配置文件
XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)
<?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>
<settings>
全局参数的设置
打印SQL语句
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
多个数据源环境配置
<environments default="development">
<environment id="development">
事务和数据源
</environment>
</environments>
</configuration>
<environment id="development">
<!-- 事务管理器类型 -->
<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=""/>
</dataSource>
</environment>
选择Managed的话表示通过容器来管理了
以后用Spring了就可以用下面的类型了
unpooled:不用数据库连接池,每次新建链接
pooled:数据库连接池,用数据库链接池的链接
jndi:
-
UNPOOLED: 这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢, 这是对简单应用程序的一个很好的选择, 因为它不需要及时的可用连接。
-
POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求很流行的方法
-
JNDI:这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器, 容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用
<?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">
<!-- SQL映射文件的配置 -->
<!-- nameSpace=映射空间。唯一标识的字符串-->
<mapper namespace="com.mybatis.mapper.UserMapper">
<select id="selectAllUsers"
resultType="com.mybatis.entity.User">
select * from user
</select>
</mapper>
MyBatis主要的类层次结构
SqlSessionFactory:可以创建Seiion的工厂类
Executor:动态语句生成与缓存的维护
java数据类型和jdbc数据类型对照表 https://blog.csdn.net/qq_43517117/article/details/86551215
public class MyBatisUtil {
private static SqlSessionFactory factory;
//第一次加载时自动执行
static {
try {
//参数:主配置文件的文件名。默认路径resources文件目录
InputStream is = Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession openSqlSession() {
return factory.openSession();
}
}
第一个MyBatis程序
使用流程
项目结构
-
创建一个Java Project
-
导入MyBatis需要的jar包
一个是MyBatis必须包。一个是MySql驱动包。
-
创建实体类和映射器接口(DAO)
user.java
package com.mybatis.entity;
public class User {
private Integer id;
private String userName;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password=" + password + "]";
}
}
UserMapper.java
package com.mybatis.mapper;
import java.util.List;
import com.mybatis.entity.User;
//类型是interface ,
//这是映射器接口,定义对持久化对象的增删改查方法
//一个映射器接口对应一个映射文件
public interface UserMapper {
List<User> findAllUsers();
}
-
创建MyBatis的主配置文件mybatis.xml
在工程中新建Source Folder命名为resources来专门存放MyBatis的主配置文件,在resources中新建XML File命名为mybatis.xml
MaBatis.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>
<!--全局参数的设置,例如日志的实现类 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!--多个数据源环境配置,default:下面定义的标签的id-->
<environments default="development">
<environment id="development">
<!-- 事务管理器类型 -->
<transactionManager type="JDBC"/>
<!-- 数据源选择从数据库连接池获得对象 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/database_mybatis?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- SQL映射文件 -->
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
-
创建MyBatis的SQL映射XML文件
创建MyBatis的SQL映射XML文件,并且映射文件要同刚才创建的映射器接口在同一包中,与映射器接口命名也相同,所以映射文件名为UserMapper.xml
注意:要将映射文件关联到主配置文件
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为唯一标识,映射器接口的全限定名 -->
<mapper namespace="com.mybatis.mapper.UserMapper">
<!-- select用来映射查询语句
id=对应的映射器接口的方法名
resultType同映射接口中该方法的返回值类型一致,或跟返回值中元素类型一致
因为没有声明文件位置,所以参数需要输入全部包名-->
<select id="findAllUsers" resultType="com.mybatis.entity.User">
select * from mybatis_01_01_user
</select>
<select id=""></select>
</mapper>
- 将SQL映射文件与主配置文件进行关联
在MyBatis.xml文件中添加代码
<!-- SQL映射文件 -->
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
- 编写代码进行测试
Test.java
package com.mybatis.ui;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.mybatis.entity.User;
import com.mybatis.mapper.UserMapper;
import com.mybatis.util.MyBatisUtil;
public class Test {
public static void main(String[] args) {
System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
//创建SqlSession对象
SqlSession session = MyBatisUtil.openSqlSession();
//映射器接口权限定名+方法名(映射文件的nameSpace的数值+某一条SQL语句映射的id属性的值)
//方式1,调用SqlSession的方法
System.out.println("-=---------------------");
List<User> users = session.selectList("com.mybatis.mapper.UserMapper.findAllUsers");
System.out.println(users);
session.close();
}
}
Test.java
package com.mybatis.ui;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.mybatis.entity.User;
import com.mybatis.mapper.UserMapper;
import com.mybatis.util.MyBatisUtil;
public class Test {
public static void main(String[] args) {
//方式2:更推荐
//参数=映射器接口的类型,
//返回值=该接口实现类型对象
SqlSession session = MyBatisUtil.openSqlSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.findAllUsers();
System.out.println(users);
System.out.println("----------------------------");
session.close();
}
}
SqlSession工作流程
事务的操作都放到这里面了
通过唯一的那条id可以定位到那条SQL语句