Mybatis
什么是框架?
框架一整套解决问题的方案,里面并没有具体的业务逻辑,框架是一个半成品的软件
mybatis概述
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis快速入门
- 下载安装
去maven中央仓库引入mybatis的坐标依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
- 创建mybatis的核心配置文件 文件名字规范点:mybatis-config.xml/SqlMapConfig.xml
【核心配置文件名称没有强制性约束】
<!--mybatis配置信息-->
<configuration>
<!--mybatis的配置环境-->
<environments default="mysql">
<!--mybatis配置的具体的环境信息-->
<environment id="mysql">
<!--事务管理 采用JDBC事务-->
<transactionManager type="JDBC"/>
<!--数据源 采用池子类型-->
<dataSource type="POOLED">
<!--数据源的四大组件-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis01"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--
mapper 映射器
orm object relationship mapping
把实体类和数据库中的表产生一一对应(映射)的关系
实体类 表
属性 字段
id id
username username
address address
gender gender
在映射时,确保实体类中的属性名称和表中的字段名称以及属性的数据类型和字段的数据类型高度保持一致。
带来的好处就是封装便利
-->
<mappers>
<!--XXXMapper.xml 存放的就是操作数据库表的一些配置信息-->
<mapper resource="org/mybatis/example/XXXMapper.xml"/>
</mappers>
</configuration>
- 创建dao接口以及pojo实体类
// 持久层dao接口
public interface IUserDao {
// 定义查询所有用户信息
List<User> getAllUsers();
}
// JavaBean 映射数据库的表user
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
private String address;
private String gender;
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 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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public User() {
}
public User(Integer id, String username, Integer age, String address, String gender) {
this.id = id;
this.username = username;
this.age = age;
this.address = address;
this.gender = gender;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
- 配置mapper信息创建对应XXXMapper.xml,但是要求和XXXMapper.java路径保持高度一致.
<?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接口文件,形成关联映射
-->
<mapper namespace="com.zhiyou100.dao.IUserDao">
<!--
在mapper.xml文件中
id 映射接口文件中的方法名称
resultType 映射接口文件中方法的返回值类型,返回值类型没有集合类型 填写的集合当中的泛型类型。(全限定类名)
parameterType 映射接口文件中方法参数的数据类型
-->
<select id="getAllUsers" resultType="com.zhiyou100.pojo.User" >
<!-- /**/ 不支持 会影响sql语句的运行-->
<!-- 查询语句-->
select * from Blog where id = #{id}
</select>
</mapper>
-
注意事项:
- mapper.xml文件和mapper.class文件的名称高度保持一致
- mapper.xml文件和mapper.class文件的路径高度保持一致
-
测试配置信息
-
加载mybatis核心配置文件
-
创建SqlSessionFactory工厂对象
-
通过工厂对象创建SqlSession对象
-
通过SqlSession对象调用openSession方法建立连接
-
通过sqlSession进行增删改查
-
@Test
public void testGetAllUsers() throws Exception {
/**
* 测试配置信息
* - 加载mybatis核心配置文件
* - 创建SqlSessionFactory工厂对象
* - 通过工厂对象创建SqlSession对象
* - 通过SqlSession对象调用openSession方法建立连接
* - 通过sqlSession进行增删改查
*/
// 加载mybatis的核心配置文件 使用mybatis内置的Resources IO类
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 创建SqlSessionFactory工厂对象
// 由于SqlSessionFactory是一个接口,不能直接new创建对象
//SqlSessionFactory sqlSessionFactory = new SqlSessionFactory(); 不可以
// 借助于构建者类SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 通过构建者类的build方法来构建工厂对象
SqlSessionFactory factory = sfb.build(is);
// 通过工厂对象创建SqlSession对象
SqlSession sqlSession = factory.openSession();
// 通过getMapper方法
IUserDao userDao = sqlSession.getMapper(IUserDao.class);//反射 动态代理
// 有了IUserDao的实现类对象
List<User> users = userDao.getAllUsers();
for (User user : users) {
System.out.println(user);
}
}
- mybatis采用第二种方式:使用接口实现方式进行开发
- 创建一个接口的实现类
public class IUserDaoImpl implements IUserDao {
private SqlSessionFactory factory;
public IUserDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
}
@Override
public List<User> getAllUsers() {
SqlSession session = factory.openSession();
//session.se
List<User> users = session.selectList("com.zhiyou100.dao.IUserDao.getAllUsers");
return users;
}
}
- 创建测试方法
@Test
public void testGetAllUsers2() throws Exception {
// 加载mybatis的核心配置文件 使用mybatis内置的Resources IO类
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 创建SqlSessionFactory工厂对象
// 由于SqlSessionFactory是一个接口,不能直接new创建对象
//SqlSessionFactory sqlSessionFactory = new SqlSessionFactory(); 不可以
// 借助于构建者类SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 通过构建者类的build方法来构建工厂对象
SqlSessionFactory factory = sfb.build(is);
// 实例化接口实现类对象
IUserDaoImpl userDao = new IUserDaoImpl(factory);
List<User> users = userDao.getAllUsers();
for (User user : users) {
System.out.println(user);
}
}