1、 MyBatis 框架概述
mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis通过 xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
ps:ORM(Object Relational Mapping)对象映射关系
简单的说就是将数据库表和实体类的属性对应起来,让我们可以操作实体类,就可以实现操作数据库表
所以要注意:实体类中的属性和数据库表的字段名称保持一致。
2、基于Maven的Mybatis 框架工程搭建
1)IntelliJ IDEA下建立工程
选择Maven工程
ps:MyBatis文档
http://www.mybatis.org/mybatis-3/zh/getting-started.html
2)工程pom.xml配置
导入坐标,自动Maven下导入对应框架及其文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.neuedu</groupId>
<artifactId>mybatis_demo01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<!--日志-->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<!--测试-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</project>
3)创建实体类
package com.neuedu.domain;
import java.io.Serializable;
import java.util.Date;
//实体类要实现Serializable接口才能被序列化
// 原因:当我们定义的实体类要在网上传输或者储存在磁盘和缓存的时候,数据都是以二进制的形式传输的,
// 序列化的作用就是将我们的实体类数据变成二进制。如果没有序列化,
// 我们的实体类数据是以对象或者字符串的数据储存的,
// 而当我们要使用这些数据时,是以二进制的数据取出,这个时候就会报错了。
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
4)用户持久层接口
package com.neuedu.dao;
import com.neuedu.domain.User;
import java.util.List;
/**
* 用户持久层接口
*/
public interface UserDao {
/**
* 查询所有操作
* */
List<User> findAll();
}
5)SqlMapConfig.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">
<!--mybatis主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境 default与id内容要一样-->
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydata"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/neuedu/dao/UserDao.xml"/>
</mappers>
</configuration>
6)设置Mapper代理方式配置文件
<?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="com.neuedu.dao.UserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.neuedu.domain.User">
select * from user
</select>
</mapper>
7)环境搭建注意事项:
1、在idea中创建目录的时候,它和包是不一样的
包在创建时:com.neuedu.dao它是三级结构
目录在创建时:com.neuedu.dao是一级目录
2、mybatis的映射配置文件位置必须和dao接口的包结构相同
3、映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
4、映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
当我们遵从了2,3,4之后,我们在开发中就无须再写dao的实现类。
3、测试代码
package com.neuedu.test;
import com.neuedu.dao.UserDao;
import com.neuedu.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* 第一个案例
* 使用main方法执行
* */
public class MyBatisTest {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
//mybatis通过SqlSessionFactoryBuilder对象调用build方法获取工厂对象
//创建工厂 mybatis使用了构建者模式(将对象细节隐藏,使用者直接调用方法即可拿到对象。builder即为构建者)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
// 生产SqlSession对象使用了工场模式,减低了类与类之间的依赖关系(解耦)
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
//创建UserDao接口实现类使用了代理模式,不修改代码的基础上对已存在代码进行加强
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
测试结果: