MyBatis入门

庞会
• 阅读 1093

MyBatis使用场景

在进行MyBatis开发时,我们的大部分精力都放在了SQL映射配置文件上了。MyBatis虽然需要开发人员自己配置SQL语句,MyBatis来实现映射关系,但是这样的项目可以适应经常变化的项目需求。所以,使用MyBatis的场景是,对SQL优化要求比较高,或是项目需求或业务经常变动。

MyBatis整体架构

  • 数据源配置文件
  • SQL映射配置文件
  • 会话工厂与会话

数据源配置文件

数据源配置在SqlMapConfig.xml(文件名可更改)配置文件中的,其中包括数据库连接地址、数据库用户名和密码等参数。

SQL映射配置文件

即SQL配置在独立的配置文件Mapper.xml(文件名可更改)中。

会话工厂与会话

会话工厂即是SqlSessionFactory类。SqlSessionFactory可以根据数据库配置信息和SQL语句的配置信息产生出可以连接数据库并与其交互的SqlSession会话实例类。

编写日志输出环境配置文件

创建一个log4j.properties空白属性文件:

log4j.rootLogger = debug, stdout  
log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern = %5p \[%t\] - %m%n

编写数据库连接池配置文件

编写一个入门级SqlMapConfig配置文件,此配置文件是整个MyBatis的全局配置文件:

<?xml version="1.0" encoding="UTF-8"?><!--指定xml版本信息和编码格式-->  
<!DOCTYPE  configuration  
  PUBLIC  "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd"><!--使用DTD文档定义类型-->  
<configuration>  
    <settings>  
        <setting name="logImpl" value="LOG4J" /> <!--配置日志输出模式logImpl为LOG4J-->
    </settings>  
    <!-- 和spring整合后 environments配置将废除,可以将MyBatis中的数据源配置交由Spring管理-->
  <environments default="development">  
        <environment id="development">  
            <!-- 使用jdbc事务管理-->  
  <transactionManager type="JDBC" />  
            <!-- 数据库连接池-->  
  <dataSource type="POOLED">  
                <property name="driver" value="org.gjt.mm.mysql.Driver"/>  
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis\_test?characterEncoding=utf-8"/>  
                <property name="username" value="root"/>  
                <property name="password" value="123456"/> 
            </dataSource>  
        </environment>  
    </environments>  
 <!--解析Mapper文件,必须放在configuration标签的最后 -->  
 <!--解析Mapper文件-->  
  <mappers>  
        <mapper resource="sqlmap/UserMapper.xml"/>  
  </mappers>  
</configuration>

编写SQL映射配置文件

所有的配置都包裹在mapper标签对中,mapper标签的namespace属性的作用就是对SQL进行分类化管理,实现不同业务的SQL隔离。

SQL语句分为增、删、改、查这几大类型,所对应的标签对有insertdeleteupdate、及select

每一个SQL配置标签都有parameterType、parameterMap、resultType、resultClass及resultMap属性,分别代表输入参数类型、输入参数集合、结果类型、结果类、结果集合。

新建一个UserMapper.xml文件,这里配置一个查询语句:

<?xml version="1.0" encoding="UTF-8"?>  <!--指定xml版本信息和编码格式-->  
<!DOCTYPE  mapper  
  PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--使用DTD文档定义类型-->  
  
<mapper namespace="test">  
    <select id="findUserById" parameterType="int" resultType="cn.com.mybatis.po.User">  
        select * from user where id=#{id}  
    </select>  
</mapper>

id 属性select标签的唯一标识。
在MyBatis的SQL配置中,#{} 标示一个占位符,当接受简单类型时,#{} 中只能写 "value",如果接受的是javabean,#{}中要填入javabean的属性名。

编写完SQL映射文件后,为了能让MyBatis资源文件加载类解析Mapper文件,必须配置在SqlMapConfig.xml中的configuration标签的最后,配置信息如下:

  <mappers>  
        <mapper resource="sqlmap/UserMapper.xml" />  
  </mappers>

编写数据交互类与测试用例

持久化实体类

持久化实体类是一个类中的成员变量与数据库表中字段一一相对应的java类。

package cn.com.mybatis.po;  
  
import java.io.Serializable;  
import java.util.Date;  
  
public class User implements Serializable{  
    private int id;  
    private String username;  
    private String password;  
    private String gender;  
    private String email;  
    private String province;  
    private String city;  
    private Date birthday;  
  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getUsername() {  
        return username;  
    }  
    public void setUsername(String username) {  
        this.username = username;  
    }  
    //余下的get与set方法省略
}

数据库交互类

创建一个可以获取SqlSession(即数据库交互对象)的类:

package cn.com.mybatis.datasource;  
  
import java.io.IOException;  
import java.io.InputStream;  
  
import org.apache.ibatis.io.Resources;  
import org.apache.ibatis.session.SqlSession;  
import org.apache.ibatis.session.SqlSessionFactory;  
import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  
public class DataConnection {  
    //MuBatis配置文件  
    private String resource="SqlMapConfig.xml";  
    private SqlSessionFactory sqlSessionFactory;  
    private SqlSession sqlSession;  
  
    public SqlSession getSqlSession() throws IOException {  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        //创建会话工厂,传入MyBatis配置文件信息  
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);  
        sqlSession=sqlSessionFactory.openSession();  
        return sqlSession;  
    }  
}

编写测试用例

编写一个从数据库中取出id为1的用户的数据:

package cn.com.mybatis.test;  
  
import cn.com.mybatis.datasource.DataConnection;  
import cn.com.mybatis.po.User;  
import org.apache.ibatis.session.SqlSession;  
import org.junit.jupiter.api.DynamicTest;  
import org.junit.jupiter.api.Test;  
  
import java.io.IOException;  
import java.util.List;  
  
public class MyBatisTest {  
    public DataConnection dataConnection = new DataConnection();  
  
    @Test  
  public void TestSelect() throws IOException{  
        SqlSession sqlSession = dataConnection.getSqlSession();  
        User user = sqlSession.selectOne("test.findUserById", 1);  
        System.out.println(user.getUsername());  
        sqlSession.close();  
    }  

入门程序数据操作

模糊查询样例

在UserMapper.xml配置文件中配置SQL映射:

<select id="findUserByUsername" parameterType="String" resultType="cn.com.mybatis.po.User">  
    select * from user where username like '%${value}%'  
</select>

在MyBatis中,在SQL配置文件中select标签对中SQL语句的${}符号,表示拼接SQL串,将接收到的参数内容不加任何修饰地拼接在SQL中,存在SQL注入的风险,在${}中只能使用value代表其中的参数。

编写一个新的测试方法:

@Test  
public void TestFuzzySearch() throws IOException{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    List<User> userList = sqlSession.selectList("test.findUserByUsername","丽");  
    for (var user:userList) {  
        System.out.println( user.getUsername());  
    }  
}

新增样例

添加一个新用户:

<insert id="insertUser" parameterType="cn.com.mybatis.po.User">  
    insert into user(username,password,gender,birthday,email,province,city)  
      value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE},  
      #{email},#{province},#{city})  
</insert>

新增测试方法:

@Test  
public void TestInsert() throws Exception{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    User user = new User();  
    user.setUsername("xiaoxiao");  
    sqlSession.insert("test.insertUser", user);  
    sqlSession.commit();  
    sqlSession.close();  
}

添加一个新用户并返回该条目所对应的主键信息:

<insert id="insertUser" parameterType="cn.com.mybatis.po.User" useGeneratedKeys="true" keyProperty="id">  
    insert into user(username,password,gender,birthday,email,province,city)  
      value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE},  
      #{email},#{province},#{city})  
</insert>

useGeneratedKeys表示使用自增主键,而keyProperty是Java对象的属性名。执行完insert语句后,会自动将自增长id值赋给对象User的属性id。
还有一种获取自增主键的方式:

<insert id="insertUser" parameterType="cn.com.mybatis.po.User">  
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  
            SELECT LAST_INSERT_ID()  
        </selectKey>  
        insert into user(username,password,gender,birthday,email,province,city) 
            value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE},
            #{email},#{province},#{city})  
</insert>

SELECT LAST_INSERT_ID()用于查询MySQL的最后一个自增主键,order参数表示该SQL函数相对于insert语句的执行时间,是在其之前(before)还是之后(after)。执行完insert语句后,会自动将自增长id值赋给对象User的属性id。

删除与修改样例

SQL配置:

    <!-- 删除用户 -->  
    <delete id="deleteUser" parameterType="java.lang.Integer">  
        delete from user where id=#{id}  
    </delete>  
    <!-- 修改用户 -->  
    <update id="updateUserName" parameterType="cn.com.mybatis.po.User">  
        update user set username=#{username} where id=#{id}  
    </update>  
    

新增2个测试方法:

@Test  
public void TestDelete() throws Exception{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    sqlSession.delete("test.deleteUser", 7);  
    sqlSession.commit();  
    sqlSession.close();  
}  
  
@Test  
public void Testupdate() throws Exception{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    User user = new User();  
    user.setId(4);  
    user.setUsername("孙xiao");  
    sqlSession.update("test.updateUserName", user);  
    sqlSession.commit();  
    sqlSession.close();  
}

至此,入门程序的所有编写及开发工作全部完成。

点赞
收藏
评论区
推荐文章
zdd小小菜鸟 zdd小小菜鸟
3年前
MyBatis面试
MyBatis面试1.MyBatis中{}和${}的区别是什么?tex\{}是预编译处理,${}是字符替换。在使用{}时,MyBatis会将SQL中的{}替换成“?”,配合P
Stella981 Stella981
4年前
Spring Boot(六)集成 MyBatis 操作 MySQL 8
一、简介1.1MyBatis介绍MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。1.2MyBatis发展史MyBatis原本是apache的一个开源项目iBatis,2010年这个项目由apache
Wesley13 Wesley13
4年前
Java框架之Mybatis(二)
本文主要介绍Mybatis(一)之后剩下的内容:1mybatis中log4j的配置2dao层的开发(使用mapper代理的方式)3mybatis的配置详解4输入输出映射对应的类型(parameterType和resultType)5mybatis动态sql6mybatis中的一级缓存7mybat
Stella981 Stella981
4年前
MyBatis基于Maven的入门
主要内容如下: 1.myBatis在maven中的配置 2.myBatis在工程中的config配置文件3.myBatis为Bean和表的映射文件4.myBatis基本的使用 myBatis在maven中的配置,在pom.xml中增加内容       1.增加依赖 ,mybatis的,还有mysql的驱动的
Stella981 Stella981
4年前
Mybatis映射器源码解析
Mybatis映射器映射器是MyBatis最强大的⼯具,也是我们使用MyBatis时⽤得最多的工具,因此熟练掌握它⼗分必要。MyBatis是针对映射器构造的SQL构建的轻量级框架,并且通过配置生成对应的JavaBean返回给调用者,⽽这些配置主要便是映射器,在MyBatis中你可以根据情况定义动态SQL来满足不同场景的需要,它比其他框架
Stella981 Stella981
4年前
SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
一、Mybatis框架1、mybatis简介MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO
Easter79 Easter79
4年前
SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
一、Mybatis框架1、mybatis简介MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO
Stella981 Stella981
4年前
MybatisPlus知识详解以及用十数个例子完成MybatisPlus的入门到进阶
1\.MybatisPlus1.1业务需求Mybatis缺点:1.Mybatis操作数据库的过程中,需要编辑大量的sql语句.无论该sql是否复杂或者简单.2.Mybatis操作时在xml配置文件中需要额外记忆单独的标签.需求:能否实现单表操作的CRUD的全自动的实现.能否实现
Stella981 Stella981
4年前
Maven中使用mybatis
1、Mybatis优缺点优点:Mybatis实现了对Dao层的封装,隔离了SQL语句,便于管理,避免了像JDBC那样操作数据集,便于扩展等等。缺点:Mybatis属于?半自动“ORM”,比Hibernate的工作做得要多很多,对象参数传递比较麻烦,没有Hibernate对象操作的概念。2、Mybatis的实现方式Mybat
Stella981 Stella981
4年前
MyBatis入门(三)
映射文件是所有SQL语句放置的地方,写好SQL语句映射文件后,需要在配置文件的mappers标签中引用。映射文件和与它具有相同功能的JDBC代码相比省掉了大部分的代码,而且对SQL的构建比普通方法还要好,这就是MyBatis的强大之处。映射文件包含的顶级元素:cache:给定命名空间的缓存配置。cacher