您的位置:首页 > 其它

MyBatis框架简述

2020-01-15 11:00 155 查看

MyBatis框架连接数据库操作简述

简介

MyBatis是一个开源的数据持久层框架,它内部封装了通过jdbc访问数据库的操作,支持普通的SQL查询,存储过程和高级映射。

MyBatis属于ORM,前身是Ibatis,Apache的一个开源项目,2010年这个项目从Apache迁移到Google Code改名为MyBatis之后将版本升到3.X,其官网http://blog.mybatis.org/,从3.2版本之后迁移到github,目前稳定版本为3.2.8。

ORM

ORM(Object/Relational Mapping) 即对象/关系映射,是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系。

MyBatis环境搭建

使用IDEA做例子

首先,新建maven项目,附上大佬链接 https://blog.csdn.net/atco/article/details/82872924

下载jar包文件 https://github.com/mybatis/mybatis-3/releases?after=mybatis-3.2.8

若是maven项目,则在xml文件中导入

https://mvnrepository.com/ 点击进入网址

在上方搜索框输入 mybatis

点击进入,选择版本后,在下方找到文本框复制

复制在maven的xml文件中的dependencies标签中

通过maven导入了mybatis所需要的jar包以后,就可以通过mybatis的xml文件进行配置

创建MyBatis核心配置文件

对配置文件的解析

  • configuration:配置文件的根元素节点

  • properties:通过resources属性从外部指定properties属性文件(database.properties),该属性文件描述数据库连接的相关配置(数据库驱动、连接数据库的url、数据库用户名、数据库密码),位置也是在/resources目录下。

  • settings:设置MyBatis运行中的行为,比如此处设置MyBatis的log日志实现为LOG4J,即使用log4j实现日志功能。

  • environments:表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,该元素节点下可以配置多个environment子元素节点,但必须指定其中一个默认运行环境。

  • environment:配置MyBatis的一套运行环境,需指定运行环境ID,事务管理,数据源配置等相关信息。

  • mappers:作用是告诉MyBatis去哪里找到SQL映射文件(该文件内容是开发者定义的映射SQL语句),整个项目可以有1个或多个SQL映射文件。

  • mapper:mappers的子元素节点,具体指定SQL映射文件的路径,其中resources属性的值表述了SQL映射文件的路径(类资源路径)。

举例

<?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">
<configuration>
<typeAliases>
<typeAlias type="cn.easybuy.pojo.User" alias="User" />
<!--将实体类Product起别名 只要出现cn.easybuy.pojo.Product这一串的都可以用Product代替 可省略-->
<typeAlias type="cn.easybuy.pojo.Product" alias="Product" />
</typeAliases>

<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="devel">

<!-- id:唯一标识 -->
<environment id="devel">

<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />

<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/easybuy?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>

<!-- 导入SQL映射文件  注!‘.’要替换成‘/’ -->
<mapper resource="cn/easybuy/mapper/user/UserMapper.xml"/>

</mappers>
</configuration>

创建持久化类(POJO)和SQL映射文件

持久化类是指其实例状态需要被MyBatis持久化到数据库中的类。

POJO从字面上来讲就是普通java对象,POJO类可以简单地理解为JavaBean规范的实体类,它不需要继承和实现任何特殊的Java基类和接口。

示例如下:

public class User {
private Integer id;
private String userName;
private String password;
private String realName;

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 String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getRealName() {
return realName;
}

public void setRealName(String realName) {
this.realName = realName;
}
}

在配置好MyBatis核心配置文件以及用来对数据库进行映射的pojo类以后,就可以开始进行SQL的编写了

mybatis对于SQL语句也是通过xml文件的形式来进行编写的。

首先,我们需要了解SQL映射文件的元素

SQL映射文件元素

mappper:映射文件的根元素节点,只有一个属性namespace

​ namespace:用于区分不同的mapper,全局唯一

select:表示查询语句,是mybatis最常用的元素之一。

​ id属性:该命名空间下的唯一标识符。

​ resultType属性:表示SQL语句返回值类型,此处通过SQL语句返回值类型,如int,string,类。

​ parameterType属性:表示查询语句传入参数的类型的完全限定名或别名。它支持基础数据类型和复杂数据类型。

resultMap元素:表示对外部resultMap定义的引用,对应外部resultMap的id,表示结果映射到哪一个resultMap上。

​ id属性:唯一标识,此id值用于servlet元素resultMap属性的引用。

​ type属性:表示该resultMap的映射结果类型。

​ results子节点:用于标识一些简单属性,其中column属性表示从数据库中查询的字段名,propetry则表示查询出来的 字段对应的值赋给实体对象的哪个属性。

示例如下:

<?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:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="cn.easybuy.mapper.user.UserMapper">

<!-- statement,内容:sql语句。id:唯一标识,随便写,在同一个命名空间下保持唯一
resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表
-->
<select id="getUserList" resultType="User" parameterType="User">
select * from easybuy_user
</select>

<insert id="add" parameterType="User">
INSERT INTO easybuy_user(loginName,userName,password,sex,identityCode,email,mobile,type)
values (#{loginName},#{userName},#{password},#{sex},#{identityCode},#{email},#{mobile},#{type})
</insert>

<!-- 更新语句 返回值为int -->
<update id="update" parameterType="User">
UPDATE easybuy_user
WHERE id = #{id}
</update>

<!-- 删除语句 返回值为int -->
<delete id="deleteUserById" parameterType="Integer">
delete from easybuy_user where id = #{id}
</delete>
</mapper>

动态SQL

动态SQL是MyBatis的一个强大的特性。动态SQL基于OGNL的表达式,可使我们方便的在SQL语句中实现某些逻辑。

if:利用if实现简单的条件选择。

​ test属性:表示进入if内需要满足的条件。

choose:相当于Java中的switch语句,通常和when和othwise搭配。

​ when元素:当其test属性条件满足的时候,就会输出when元素中的内容。

​ otherwise元素:当所有when中的条件都不满足的时候,就会执行这个元素中的内容。

where:简化SQL语句中where的条件判断,where会智能的处理and和or,不必担心多余关键字导致的语法错误。

set:解决动态更新语句,主要是在包含的语句前输出一个set,若包含的语句是以逗号结束的,会自动把该逗号省略掉,再配合if元素可以动态的更新需要修改的字段,而不需修改的字段,则可以不再被更新。

trim:可以灵活的去除多余的关键字。

​ prefix:前缀,作用是通过自动识别是否有返回值后,在trim包含的内容上加上前缀。

​ suffix:后缀,作用是在trim上包含的内容上加上后缀。

​ prefixOverrides:对于trim包含内容的首部进行指定内容(如and、or)的忽略。

​ suffixOverrides:对于trim包含内容的首尾部进行指定内容的忽略。

foreach:迭代一个集合,通常用于in条件

​ item:表示集合中每一个元素进行迭代时的别名。

​ index:指定一个名称,用于表示在迭代过程中,每次迭代到的位置。

​ open:表示该语句以什么开始。

​ separator:表示在每次迭代之间以什么符号作为分隔符。

​ close:表示该语句以什么结束。

​ collection:最关键并容易出错的属性,需格外注意,该属性必须指定,不同情况下传入的值不一样。

​ 若传入单参数且参数类型是一个list时,collection属性值为list

​ 若传入单参数且参数类型是一个数组时,collection属性值为array

​ 若传入多参数,就需要把他们封装成一个Map传入

接口映射

可以创建与mapperxml文件相同名称的接口class文件来达到映射的效果,但方法名称必须一致,以及参数一致

传参方法

  • 只有单参数时可以不限定
  • 多参数时,可以通过注解 方法名 (@Param(“xml文件中参数名称”) 数据类型 参数名称 )的方式导入
  • 如果传入单个对象,也没有限定。

通常会使用新建工具类的方法来拿到所需要的对象。

工具类实例**

public class MyBatisUtil {
private static SqlSessionFactory factory;
static {
try {
//创建输入流引入mybatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

//创建SqlSessionFactory对象
factory = new SqlSessionFactoryBuilder().build(is);
}catch (IOException e){
e.printStackTrace();
}
}

public static SqlSession creatSqlSession(){
return factory.openSession(false);
}

public static void closeSqlSession(SqlSession sqlSession){
if (null != sqlSession){
//关闭SqlSessionFactory对象
sqlSession.close();
}
}
}

实现类

每个MyBatis应用程序都以一个SqlSessionFactory对象的实例为核心。

首先获取SqlSessionFactoryBuilder对象,可以根据XML文件配置文件或Configuration类的实例构建该对象。

然后获取SqlSessionFactory对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获得。

有了SqlSessionFactory对象之后,就可以进而获取SqlSession实例,SqlSession对象中完全包含以前数据库为背景的所有执行SQL操作的方法。

由于参数environment和properties都可以为null,那么去除重复的,真正的重载方法都只有build()一种。

使用mybatis实现查询操作

public List<Product> getProductList(String proName, Integer categoryId, Integer level) {
SqlSession sqlSession = MyBatisUtil.creatSqlSession();

//通过接口做映射,来调用xml文件中的查询
List<Product> product = sqlSession.getMapper(ProductMapper.class).getProductList(proName, categoryId);

MyBatisUtil.closeSqlSession(sqlSession);
return product;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
colahhh 发布了5 篇原创文章 · 获赞 3 · 访问量 260 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: