mybatis介绍及简单使用

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 mybatis介绍及简单使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

mybatis

  • 框架如何学习包括配置文件,看官方文档 https://mybatis.org/mybatis-3/zh/index.html
    在这里插入图片描述

1.简介

1.1 什么是 MyBatis?

  • MyBatis 是一款优秀的持久层框架
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis本是apache的一个开源项目iBatis,
  • 2010年这个项目由apache software foundation迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis。2013年11月迁移到Github

1.2 如何获得 MyBatis?

  • maven仓库
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.10</version>
</dependency>
  • Github上找https://github.com/mybatis/mybatis-3/releases
  • 中文文档地址:https://mybatis.org/mybatis-3/zh/index.html

1.3 持久化

  • 数据持久化

将程序中的数据在持久状态和瞬时状态转换的过程

内存:断点即失

数据库DB持久化,IO文件持久化

  • 数据持久化原因:

一些对象不能丢掉

内存成本大

1.4 持久层

  • 完成持久化工作的代码
  • 分界线明显

1.5 MyBatis重要性

  • 方便

  • 传统的jdbc代码复杂了。建华了,框架。自动化

  • 不用也行,但容易上手。

  • 优点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql。

2.第一个mybatis程序

  • 流程:搭建环境–>导入mybatis–>编写代码–>测试!

2.1 搭建环境

  • 搭建数据库
use school;
CREATE TABLE `user`(
`id` int(40) not NULL,
`name` VARCHAR(100) not NULL,
`pwd` VARCHAR(50) not NULL,
 PRIMARY KEY(`id`)
)
  • 新建普通maven项目,导入依赖
  • 删除src目录
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.10</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>

2.2 创建模块

  • 编写mybaits的核心配置文件
<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/school?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/school?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>
  • 编写mybaits的工具类
public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        //第一步:获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

2.3 编写代码

  • 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
}
  • dao接口
public interface UserMapper {
    public User selectUserById(int id);
    public List<User> selectUser();

}
  • dao接口实现类转为UserMapper.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绑定对应的UserMapper即实现-->
<mapper namespace="entity.UserMapper">
    <select id="selectUserById" resultType="entity.User">
        select * from user where id = #{id}
    </select>
    <!--返回集合对象类型也是用resultType指明集合泛型-->
    <select id="selectUser" resultType="entity.User">
        select * from user
    </select>
</mapper>

2.4 测试

  • junit测试
@Test
public void testMybatis01(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = mapper.selectUser();
    System.out.println(users.size());
    users.forEach(val->{
        System.out.println(val.getName());
    });
    sqlSession.close();
}
  • 问题1:资源过滤问题java中的xml文件无法导出。
    在这里插入图片描述
  • 将一下资源过滤复制到pom.xml中,必须进行reload一下,否则还是无法过滤成功,报上述错误
    在这里插入图片描述
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

在这里插入图片描述

  • 然后在build重编译下工程,即可解决。

  • 问题2:没有在mapper注册中心找到这个UserMapper.xml,需要在mybatis-config.xml中进行配置
    在这里插入图片描述

<!--每个UserMapper.xml都需要在mybatis-config.xml文件中配置-->
<mappers>
    <mapper resource="com/zk/mybatisExample01/entity/UserMapper.xml"/>
</mappers>
  • 问题3:绑定接口错误,命名空间
  • 问题4:返回类型不对,未起别名前,用全限定名
  • 问题5:方法名不对

3.CRUD

3.1 namespace

  • 命名空间中的包名类名要和mapper接口名一致

3.2 Mapper.xml中标签元素

  • id对应namespace中的方法名

  • resultType:sql语句执行的返回值

  • parameterType:sql语句的参数类型

  • UserMapper接口中的参数和mapper.xml中sql语句中的参数一致

public interface UserMapper {
	public User selectUserById(int id);
}
<--UserMapper.xml-->
<select id="selectUserById" resultType="com.zk.mybatisExample01.entity.User"
parameterType="int">
	select * from user where id = #{id}
</select>

3.4 查询

  • 编写接口
public User selectUserById(int id);
  • 编写mapper.xml中的sql
<select id="selectUserById" resultType="com.zk.mybatisExample01.entity.User" parameterType="int">
    select * from user where id = #{id}
</select>
  • 测试
@Test
public void testMybatis02(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user.toString());
    sqlSession.close();
}

3.5 增加

  • 编写接口
int insertUser(User user);
  • 编写mapper.xml中的sql,注意:参数用了对象,那sql中用的是对象中的属性,可以直接当参数取出来
  • sql中可以不写数据库,原因在mybatis-config.xml文件中配置了数据库信息
  • idea连数据库可以写上,不连不写数据库名,但连数据库后,且需要设置sql方言,在sql di后面设置
<!--对象中的属性,可以直接当参数取出来-->
<insert id="insertUser" parameterType="com.zk.mybatisExample01.entity.User">
    INSERT INTO school.`user`(`id`,`name`,`pwd`) VALUES(#{id},#{name},#{pwd})
</insert>
  • 测试
//增删该需要提交事务
@Test
public void testMybatis03(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User(6, "tony", "132456");
    int num = mapper.insertUser(user);
    //提交事务
    sqlSession.commit();
    System.out.println("num===="+num);
    sqlSession.close();
}

3.6 修改

  • 编写接口
int updateUser(User user);
  • 编写mapper.xml中的sql
<update id="updateUser" parameterType="com.zk.mybatisExample01.entity.User">
    update school.`user` set name = #{name},pwd = #{pwd}  where id = #{id};
</update>
  • 测试
@Test
public void testMybatis04(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User(4, "mary", "654321");
    int num = mapper.updateUser(user);
    //提交事务
    sqlSession.commit();
    System.out.println("num===="+num);
    sqlSession.close();
}

3.7 删除

  • 编写接口
int deleteUser(int id);
  • 编写mapper.xml中的sql
<delete id="deleteUser" parameterType="int">
    delete from school.`user`  where id = #{id};
</delete>
  • 测试
@Test
public void testMybatis05(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int num = mapper.deleteUser(6);
    //提交事务
    sqlSession.commit();
    System.out.println("num===="+num);
    sqlSession.close();
}
  • 增删该需要提交事务

3.8 错误点

  • namespace用全限定名用.隔开

  • mapper.xml中标签名不要弄错

  • mybatis-config.xml中的mapper映射资源resource用//来寻找路径

<mappers>
    <mapper resource="com/zk/mybatisExample01/entity/UserMapper.xml"/>
</mappers>
  • mybatis-config.xml中的environment配置错误
  • maven资源没有导出问题

3.9 参数Map的使用

  • 若实体类或数据库表字段、参数过多,应该考虑使用map
  • 实体类字段太多,sql语句用到字段太少,这样new一个对象出来,太浪费空间,不如直接map
int insertUserMap(Map<String,Object> map);
<!--sql参数传map的key键-->
<insert id="insertUserMap" parameterType="map">
    INSERT INTO school.`user`(`id`,`name`,`pwd`) VALUES(#{id},#{account},#{password})
</insert>
@Test
public void testMybatis06(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> map = new HashMap<>();
    map.put("id",5);
    map.put("account","test");
    map.put("password",111111);
    int num = mapper.insertUserMap(map);
    //提交事务
    sqlSession.commit();
    System.out.println("num===="+num);
    sqlSession.close();
}
  • map传递参数,直接在sql中去除key即可
  • 对象传递参数,直接在sql中取出对象属性即可
  • 只有一个基本类型参数的情况下,可以直接在sql中取到,mapper.xml中参数可以不写
  • 但是多个参数要使用map或者注解

3.10 模糊查询

  • 方式1:代码执行时传递通配符%%
//方式安全
List<User> users = mapper.selectUserStr("%ma%");
  • 方式2:sql中拼接使用通配符,存在sql注入
<!--存在sql注入-->
<select id="selectUserStr" resultType="com.zk.mybatisExample01.entity.User">
    select * from user where name like "%" #{value} "%"
</select>
  • mysql 用模糊查询需要使用concat(‘%’,变量,‘%’) ==》CONCAT(str1,str2,…)

本专栏下一篇:mybatis配置解析介绍

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123925.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!