1.Mybatis的入门知识
1.Mybatis是一个持久层的框架技术.
下面是三大框架的架构图
其中SpringMVC是表现层的框架:用于接收和展示数据的;
业务层(Service)是处理逻辑业务的。
Mybatis则是持久层(dao)的框架,封装了许多和数据操作相关的细节,提高开发效率。
需要注意的是,Spring是一个无可替代的框架,它横跨了表现层–业务层–持久层 经典的服务器开发的三层架构,Spring是整合前后两个层次的必需品。
2.经典的持久层技术分析
- Jdbc技术(是规范)
- Spring的JdbcTemplate(对Jdbc的简单封装)
- DBUtils(对Jdbc的简单封装)
以上这些都不是框架,后两者都是工具类,Mybatis是一个用户只需要关注sql语句和数据库优化上的框架,而不用关注加载驱动,简化连接和释放预处理对象,关闭连接等繁琐的过程。
3.Mybatis技术简介
mybatis通过配置xml和注解的方式把各种statement配置起来,通过java对象和statement中的sql中的动态参数进行映射生成最终执行的sql,最终将结果集映射为java对象并返回。
mybatis采用ORM(对象关系映射)思想解决了实体和数据库映射的关系,封装了jdbc,对用户避免了使用jdbc的繁琐api。
- ORM(对象关系映射)思想
简单的说就是 把数据库实体的表的字段和java实体类的属性对应起来,
让我们可以操作实体类就实现了对数据表的操作。
2.Mybatis的入门案例
1.mybatis的环境搭建
- 搭建项目,导入jar,mybatis.jar.
- 创建实体类和dao接口方法
- 配置mybatis-config.xml主配置文件和实体类的dao的映射文件Userdao.xml
2.配置文件有几点需要注意的
- 第一:Mybatis中把持久层的接口名称和配置文件叫Mapper,所有UserDao和UserMapper是一样的
- 第二:mybatis的映射配置文件(mapper)必须和dao接口的包路径一致。
- 第三:映射配置文件的mapper标签的namespace属性取值必须是dao的全限定类名
- 第四:映射文件配置,例如select配置查询,id属性值必须与dao中的方法名称一致,resultType属性设置返回实体类的全限定类路径。
- 满足 第 二三四点之后,我们在开发就不需要写dao的实现类了,通过配置文件完成一切操作。
3.项目实例 测试代码如下
//1.读取mybatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
//2.创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSessioon对象创建dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> ulist = userDao.findAll();
for(User user:ulist){
System.out.println(user);
}
//6.释放资源
session.close();
is.close();
mybatis案例测试查询结果如图:
mybatis-config.xml配置代码如下
<!--mybatis主配置文件 -->
<configuration>
<!--配置环境 -->
<environments default="mysql">
<!--配置mysql的环境 -->
<environment id="mysql">
<!--配置事务类型 -->
<transactionManager type="jdbc"></transactionManager>
<!--配置数据源(连接池) -->
<dataSource type="pooled">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="fun/borened/dao/UserDao.xml"/>
</mappers>
</configuration>
UserDao.xml配置如下
<!--配置dao接口的操作方法 -->
<mapper namespace="fun.borened.dao.UserDao" >
<!--配置查询所有 id值必须是dao中的方法名,resultType是返回值类型 -->
<select id="findAll" resultType="fun.borened.domain.User">
select * from user
</select>
</mapper>
如果使用注解,则可以在Dao接口的方法上使用@Select(“sql”)指定sql语句,则可以删掉上面的UserDao.xml的配置文件。但是主配置文件中,mapper属性需要更改为class=“全限定类名”,而不是目录形式的resource属性。
开发中为了简便,不再去写dao的实现类。
mybatis实现数据库操作整体流程可以简化为两大步
1.生成dao的代理对象
这其中包括:
- 加载配置文件
//1.读取mybatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
- .创建SqlSessionFactory,获取数据库操作对象的工厂
//构建者模式
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
- 使用工厂生产SqlSession对象(数据库操作的会话对象)
SqlSession session = factory.openSession();
- 使用SqlSessioon对象创建dao接口的代理对象(Mapper中存放的是数据库操作和Dao的映射)
UserDao userDao = session.getMapper(UserDao.class);
- 使用代理对象执行方法
List<User> ulist = userDao.findAll();
- 最后释放资源
session.close();
is.close();
2.通过配置的数据源参数和标签select➕sql执行相应的方法
根据映射关系,找到代理对象dao中的方法对应的id值,调用sql会话对象的方法执行相应的配置文件或注解中的sql语句,完成查询等操作。