ssm框架系列(4)-MyBatis入门
![](https://i-blog.csdnimg.cn/blog_migrate/2cd37375b4a3a970e2b1ed93302288d3.jpeg)
MyBatis介绍
1, MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结集。
2,MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的实体类映射成数据库中的记录。
MyBatis优点
MyBatis是一个持久层的框架,它是对JDBC的封装,要学好MyBatis,首要要对JDBC有一个较深的认识,这里通过比对JDBC来对MyBatis有一个初步的认识,即我们为什么要使用MyBatis。
使用JDBC操作数据库存在一些问题,例如代码冗余,需要写很多重复的代码,不便于维护等,MyBatis正是为解决这些痛点而诞生的。
下面对比几种典型的场景
JDBC(问题)
1,数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
2,将sql语句硬编码到Java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。
3,向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
4,从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
MyBatis(对策)
1,使用数据库连接池管理数据库连接。
2,将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3,将sql语句及占位符号和参数全部配置在xml中。
4,将查询的结果集,自动映射成java对象。
对比JDBC持久化的流程,MyBatis很多工作在配置文件中进行设置,减少了很多代码量,同时也使得代码结构更加清晰,维护起来也更加方便。
JDBC的工作流程
1,加载数据库驱动
2,创建并获取数据库链接
3,创建jdbc statement对象
4,设置sql语句
5,设置sql语句中的参数
6,通过statement执行sql并获取结果
7,对sql执行结果进行解析处理
8,释放资源
MyBatis的工作流程
1,配置mybatis的配置文件,SqlMapConfig.xml
2,通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂。
3,通过SqlSessionFactory创建SqlSession。SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。
4,调用sqlSession的方法去操作数据。如果需要提交事务,需要执行SqlSession的commit()方法。
5,释放资源,关闭SqlSession
MyBatis的使用(简单介绍)
编写一个mapper接口和对应的XML文件映射,将所有的SQL语句交给XML进行管理。
在编写mapper.xml(映射文件)和mapper.java需要遵循以下规范:
1,mapper.xml中namespace就是mapper.java的类全路径。
2,mapper.xml中statement的id和mapper.java中方法名一致。
3,mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入参数类型一致
4,mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。
如下,举例一个简单的mapper的用法
mapper.java
public interface CommitMapper {
/**
* 新增评论
*/
public void addCommit(Commit commit) throws Exception;
/**
* 删除评论
*/
public List<Commit> findCommitList(Integer commit_id) throws Exception;
}
mapper.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"><mapper namespace="com.amuxia.mapper.CommitMapper">
<select id="addCommit" parameterType="com.amuxia.pojo.Commit">
insert into
tb_commit
(
commit_content,
commit_user_id,
commit_goods_id
)
value
(
#{commit_content},
#{commit_user_id},
#{commit_goods_id}
) </select>
<select id="findCommitList" parameterType="integer"
resultType="com.amuxia.pojo.Commit">
select
c.commit_id,
c.commit_content
from
tb_commit c,
tb_user u,
tb_goods g
where
c.commit_user_id=u.user_id
and c.commit_id=g.id
and c.commit_id=#{commit_id} </select></mapper>
名词解释
1,parameterType:MyBatis中通过parameterType指定输入的参数类型
2,resultType:MyBatis中通过resultType指定输出的结果。
3,#{}:表示的是占位符,#{}接收的参数是输入的参数,类型可以是简单类型、pojo、hashmap
#{}如果接收的是简单类型的话,里面的值可以value或者其他名称
#{}接收pojo对象,通过OGNL读取对象中的属性值,通过属性.属性的方式获取。
4,selectOne:表示查询出一条记录,如果是使用selectone是可以实现的结果,selectList也是可以实现了(list中只有一个对象)
5,selectList:表示查询出一个列表(多条记录)进行映射的。如果是使用selectOne是不可以实现的。
Java知音公众号后续将会系统的整理发布一系列关于ssm框架的知识点,由浅入深。结合小例子来感受ssm框架给我们开发带来的便利,如果您有好的Demo或者文章,欢迎投稿!