1.mybatis的概述
mybatis是一个持久层框架,用java编写的。
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程 它使用了ORM思想实现了结果集的封装。
ORM:Object Relational Mappging 对象关系映射
简单的说:就是把数据库表和实体类及实体类的属性对应起来 ,让我们可以操作实体类就实现操作数据库表。
2.mybatis入门
2.1mybatis的环境搭建
第一步:创建maven工程并导入坐标 pom.xml
<?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.itheima</groupId>
<artifactId>day01_eesy_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <!--此处设置打包方式-->
<dependencies>
<dependency> <!--导入mybatis坐标,这是一个dependency依赖-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency> <!--数据库-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency> <!--日志-->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency> <!--进行单元测试-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
第二步:创建实体类和dao的接口 User.java 与 IUserDao.java
package com.itheima.domain;
import java.io.Serializable;
import java.util.Date;
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 + '\'' +
'}';
}
}
package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
/*
用户的持久层接口,“操作数据库,基于Dao"
*/
public interface IUserDao {
//查询所有操作
List<User> findAll();
}
第三步:创建Mybatis的主配置文件SqlMapConifg.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的环境-->
<environment id="mysql"> <!--与上面的名字起得一样-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,也叫连接池 连接池的取值有三个-->
<dataSource type="POOLED"><!--POOLED使用连接池-->
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<!--针对IUserDao文件,在resources中写的对应的xml配置文件-->
<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
第四步:创建映射配置文件 IUserDao.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属性的取值必须是dao接口的全限定类名-->
<mapper namespace="com.itheima.dao.IUserDao">
<!--配置查询所有-->
<!--id是dao接口的方法名称 resultType是返回类型,封装到哪里去-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user <!--此处分号可写可不写-->
</select>
</mapper>
附录补充:
1.进行导入sql文件(mybatisdb.sql)
自行在相关文件中修改读取数据库时需要的数据
2.将日志文件log4j.properties放在项目中
2.2环境搭建的注意事项:
1.创建IUserDao.xml 和 IUserDao.java时名称一样。
在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
所以:IUserDao 和 IUserMapper是一样的
2.在idea中创建目录的时候,它和包是不一样的
包在创建时:com.itheima.dao它是三级结构
目录在创建时:com.itheima.dao是一级目录
3.mybatis的映射配置文件位置必须和dao接口的包结构相同
4.映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
不要忘记在映射配置中告知mybatis要封装到哪个实体类中
告知的方式:指定实体类的全限定类名
5.映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
3.mybatis入门案例(是在前面操作的基础上的三种案例)
3.1在前面操作的基础上,创建一个MybatisTest.java
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.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.InputStream;
import java.util.List;
/*
mybatis的入门案例
*/
public class MybatisTest {
/*
入门案例
*/
public static void main(String[] args) throws Exception{
//1.读取配置文件(这个案例在连接数据库)
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
/*SqlSessionFactory是一个接口,接口不可以new,mybatis把建工厂的细节省略了,
提供了一个SqlSessionFactoryBuilder,这个是可以直接new的,用builder.build()构建工厂,把流传进去 ,而怎么解析配置文件,怎么去封装,与我们无关*/
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession,创建Dao接口的代理对象 (Dao的实现)
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
3.2.mybatis基于注解的入门案列
1.移除IUserDao.xml文件,在dao接口的方法上使用@Select注解,并指定Sql语句
2.在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
3.3mybatis不使用XML和注解配置,自己写dao实现类
我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
不管使用XML还是注解配置。
但是Mybatis它是支持写dao实现类的。
1.创建UserDaoImpl.java
package com.itheima.dao.impl;
import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class UserDaoImpl implements IUserDao {
//定义一个可以拿到session对象的变量
private SqlSessionFactory factory;
//在创建时传值,保证factory有值
//把默认构造函数覆盖,相当于没有默认构造函数,所以在用的时候,一定会传一个工厂进来
public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory;
}
@Override //实现类
public List<User> findAll() {
//1.使用工厂创建SqlSession对象,
SqlSession session = factory.openSession();
//2.使用session执行查询所有方法
//填入的是xml配置文件中的对应的namespace.id
List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");
session.close(); //用完后关闭
//3.返回查询结果
return users;
}
}
2.修改MybatisTest.java
3.4“查询所有”功能的分析
4.自定义mybatis框架(主要目的是了解mybatis中执行细节)
4.1自定义Mybatis分析
4.2自定义mybatis(有xml和注解两种自定义配置)
4.2.0删除pom.xml中mybatis的配置(删除图中部分)
4.2.1删除后,根据 MybatisTest测试类 中缺的 进行 创造类和接口
1.Resources.java
2.SqlSession.java
3.SqlSessionFactory.java
4.SqlSessionFactoryBuilder.java
4.2.2对于SqlSessionFactoryBuilder.java的build进行操作
1.创建utils下工具类XMLConfigBuilder用于解析配置文件 XMLConfigBuilder.java
2.在pom.xml中导入dom4j和jaxen的坐标---------->用于解析配置文件的技术dom4j和xpath
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
3.对应的为XMLConfigBuilder.java中出现错误的地方创建该有的类
Configuration.java
Mapper.java ,
Select.java
前面两个文件是xml配置,后面一个是注解配置,可以先把XMLConfigBuilder.java中关于注解配置的代码先注释掉,先进行学习xml配置,然后再学注解配置,不然两个一起学,容易混
4.在前面的操作完成后,XMLConfigBuilder.java中没有错误,
此时,对SqlSessionFactoryBuilder.java的build进行操作
5.有了config,还是没有工厂,而现在工厂现在是接口,所以创建工厂接口的实现类
6.工厂有了,则每个session就有了
上面的操作:
SqlSessionFactoryBuilder有了构建者,
DefaultSqlSessionFactory(cfg)构建者就构建出了工厂
DefaultSqlSession(cfg)工厂就生产了一个SqlSession
7.在session方法里,实现创建代理对象和查询所有的操作
需要添加的文件:
MapperProxy.java
DataSourcesUtil.java
Executor.java
完成上面的操作,运行MybatisTest.java的main方法,得到结果
大白话解释
❶.我们需要最后实现查询所有,而查询所有的功能在工具类里面,最后就是调用这个工具类,
❷. 那么什么时候调用呢?在创建Dao实现类增强的时候,
❸.那什么时候增强呢?在创建代理对象时进行创建Dao实现类(MapperProxy的调用),
invoke用于对方法进行增强的,我们的增强其实就是selectList方法,
MapperProxy找到要执行的语句和封装的结果
为什么要找执行的语句和封装的结果?
①从setMappers的内容就可以看出来getMappers的结果
②从方法 MapperProxy(Map<String,Mapper> mappers,Connection conn)
的第一个参数也可以有所察觉
❹.从哪里找?从配置文件中找,
❺.怎么读取配置文件?读取配置文件由XMLConfigBuilder进行,读取完了之后,需要存起来,
如何存起来?就用到了Configuration对象
当前的项目结构【其中,图中的Select.java是注解配置,在此之前的4.2.2讲的是xml配置,所以还没有涉及Select.java】
需要的文件:
MapperProxy.java
DataSourcesUtil.java
Executor.java
8.之前4.2.2已经完成1~7部分内容,就是xml配置部分,接下来将其改为注解配置,需要修改三个地方
SQLMapConfig.xml文件中,修改为注解配置
IUserDao.java文件修改
进行添加Select.java文件,如果前面添加过,即不需要再次添加 Select.java
完成上面的操作,运行MybatisTest.java的main方法,得到结果