Mybatis

定义:持久层?

干啥的?作用于哪一方面?

基本配置,基本操作?

  • 重点,难点---结果集映射
  • 分页,
  • 注解开发(重点
  • 一对多,多对多的处理(难点)
  • 动态SQL(重点
  • 缓存(十分重要,极其重要)

mybatis开始

-----环境准备

- JDK 1.8
- mysql 8.0.21
- maven 3.6.1
- mybatis 3.5.3
- IDEA

一.简介

1.什么是MyBatis

  • MyBatis 是一款优秀的持久层框架
  • MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及获取结果集的过程
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,

    将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
  • MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。
  • 2013年11月迁移到Github .

2.持久化

  • 1.持久化是将程序数据在持久状态和瞬时状态间转换的机制。

    • 1).即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用

      将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
    • 2).JDBC就是一种持久化机制。文件IO也是一种持久化机制。
    • 3).在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。
  • 2.为什么需要持久化服务呢?那是由于内存本身的缺陷引起的(内存断电即失

    • 1).内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的

      是,人们还无法保证内存永不掉电。
    • 2).内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也

      高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直

      呆在内存中,需要持久化来缓存到外存

3.持久层

  • 什么是持久层?

    • 1.完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】
    • 2.大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加

      以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
    • 3.不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多

      是必不可少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许

      是,但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久

      单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专著于数据持久

      化逻辑的实现.
    • 4.与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。 【说白了就

      是用来操作数据库存在的!】

4.为什么需要Mybatis?

  • 帮助程序员将数据存到数据库中
  • 方便
  • 传统JDBC代码台复杂。简化。框架。自动化
  • 不用Mybatis也可以,更容易上手。技术没有高低之分
  • 优点-------主要就是用的人多

二.第一个Mybatis程序

思路:搭建环境-->导入mybatis-->编写代码-->测试

1.搭建环境

1).数据库的

        mysql> create database `mybatis`;
Query OK, 1 row affected (0.00 sec) mysql> use `mybatis`;
Database changed
mysql> create table `user`(
-> `id` int not null,
-> `name` varchar(20) DEFAULT null,
-> `password` varchar(20) DEFAULT null,
-> primary key(`id`)
-> )engine = INNODB DEFAULT charset=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into `user`(`id`,`name`,`password`) values(0,'zjz0','123456'),(1,'zjz1','123456'),(2,'zjz2','123456');
Query OK, 3 rows affected (0.00 sec)

2).maven项目

  • 普通maven项目
  • 删除src
  • 导入mysql mybatis junit 包
        <dependencies>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency> </dependencies>
<!-- ex:此处增加的build详细在maven====太长不加了-->

3).创建一个子类modules

4).编写mybatis的核心配置文件

  • 配置 mybatis-config.xml

         <?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核心配置文件--> <configuration>
    <environments default="development">
    <environment id="development">
    <!-- 事务管理-->
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url"
    value="jdbc:mysql://localhost:3306/mybatis? useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    </dataSource>
    </environment>
    </environments>
    <!--每一个mapper.xml都需要在mybatis核心配置文件中注册-->
    <mappers>
    <mapper resource="com/zjz/dao/UserMapper.xml"/>
    </mappers>
    </configuration>
    • 编写mybatis工具类

      • sqlSessionFactory -- 构建sqlSession
         // sqlSessionFactory -产生-> sqlSession
    public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory; static {
    try {
    // 第一步--获取sqlSessionFactory对象 String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }//获取SqlSession连接 public static SqlSession getSqlSession() {
    SqlSession sqlSession = sqlSessionFactory.openSession(); // sqlSession 不是线程安全的
    return sqlSession; }
    }

5).编写代码

  • UserMapper接口

        public interface UserMapper {
    List<User> getUserList();
    }
  • 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,绑定一个Dao/Mapper接口-->
<mapper namespace="com.zjz.dao.UserMapper">
<!--id要与mapper的方法对应-->
<!--resultType返回类型-->
<select id="getUserList" resultType="com.zjz.pojo.User">
select * from user
</select>
</mapper>

6).测试

  • Junit测试

            @Test
    public void test(){ // 第一步,获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    // 执行sql
    UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); System.out.println(userList.toString()); // 关闭SqlSession
    sqlSession.close(); }

三个核心接口



注意

  • org.apache.ibatis.binding.BindingException:

    Type interface com.zjz.dao.UserMapper is not known to the MapperRegistry.
  • MapperRegistry
  • 问题
    • 1.配置文件没有注册(mybatis-config没配置)
    • UserMapper.xml--2.绑定接口错误 3.方法名不对 4.返回类型不对
    • pom.xml 5.Maven导出资源错误 MapperRegistry

总:

三,基本CRUD

操作DML一定要提交事务 sqlSession.commit();

1.namespace

  • namespace中的包名要和Mapper接口的包名一致

2.Mapper.xml

  • 语句

    • 1.id:对应的namesapce中的方法名
    • 2.resultType
      • Sql语句执行的返回值(对应对象则为对象类型)-单表返回对应的对象,多表返回
      • --如果select,必须有,其它可以没有
    • 3.parameterType 参数类型
    • 4.语句中传参使用#{XXX} XXX 要对应 parameterType里面的东西

问题 sqlSession 是如何控制全局的,中途关闭它,有什么影响?(或者只让它有初始值)

  • 查询时,可以依据参数查找对象---入参parameterType 出参 resultType
  • 插入时,入参parameterType--一般就是对象了 ,出参不写

代码

  • 1.接口Mapper

        public interface UserMapper {
    // 查询全部用户
    List<Object> getUserList(); // list中可以指定POJO,也可以指定Object(多表) // 根据id查询
    User getUserById(int id); // 插入insert
    int addUser(User user); // 修改用户
    int updateUser(User user); // 删除用户
    int deleteUser(int id);
    }
  • 2.Mapper.xml

        <!--namespace,绑定一个Dao/Mapper接口-->
    <mapper namespace="com.zjz.dao.UserMapper">
    <!--id要与mapper的方法对应-->
    <!--resultType返回类型-->
    <!--resultType返回类型
    select中,如果指定,那么返回指定对象,不指定报错 多表应该怎么写??
    --> <select id="getUserList" resultType="com.zjz.pojo.User" >
    select * from user
    </select> <select id="getUserById" parameterType="int" resultType="com.zjz.pojo.User">
    select * from mybatis.user where id = #{id}
    </select> <insert id="addUser" parameterType="com.zjz.pojo.User">
    insert into mybatis.user(id,name,password) values (#{id},#{name},#{password});
    </insert> <update id="updateUser" parameterType="com.zjz.pojo.User">
    update mybatis.user
    set name = #{name},password = #{password}
    where id = #{id};
    </update> <delete id="deleteUser" parameterType="int">
    delete from mybatis.user where id = #{id};
    </delete>
    </mapper>
  • 3.Test

            @Test
    public void TestGetUserById(){
    SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User userById = mapper.getUserById(1);
    System.out.println(userById); sqlSession.close();
    } @Test
    public void TestAddUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(new User(5, "zjz05", "123456")); // 提交事务
    sqlSession.commit(); sqlSession.close(); } @Test
    public void TestUpdateUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUser(new User(4,"zjz04","123456")); sqlSession.commit();
    sqlSession.close(); }

模糊查询 切记防止sql注入

  • 方式一:安全的

    • XXXMappper.xml
          <!--like '%zjz%'-->
    <select id="getUserLike" resultType="com.zjz.pojo.User" >
    select * from user where name like #{value}
    </select>
    • test语句
    • List<User> list = mapper.getUserLike("%zjz%");
  • 方式二:可sql注入

    • XXXMappper.xml
          <!--like '%zjz%'-->
    <select id="getUserLike" resultType="com.zjz.pojo.User" >
    select * from user where name like "%"#{value}"%"
    </select>
    • test语句
    • List<User> list = mapper.getUserLike("zjz");

一些错误

  • 1.标签。。各对各的 select……
  • 2.resource绑定mapper,需要使用路径
  • 3.程序配置文件符合规范
  • 4.NullPointException 没找到资源
  • 5.输出的xml文件有乱码。。。
  • 6.maven资源导出问题

Mybatis-基本学习(上)的更多相关文章

  1. Mybatis架构学习

    Mybatis架构学习 MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架.MyBatis 封装了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.可以对配置和原生Map使用 ...

  2. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  3. MyBatis入门学习(二)

    在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...

  4. Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6953005.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(六)——My ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--My ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  10. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)--S ...

随机推荐

  1. Vulhub-DC-2靶场

    Vulhub-DC-2靶场 前言 最近一直忙于学习代码审计和内网渗透,所以靶场这方面的文章一直未更新,但是计划是更新完DC系列靶场的,这个不会鸽. DC-2的靶场是很简单的一共5个flag. 正文 f ...

  2. Bugku-你必须让他停下来

    这道题使用burpsuite抓包就能做,一开始抓包发到repeater之后flag不一定可以直接得到,原因是flag藏在特定的那张图片后面,我们一直go到那张图片便可以得到flag. 进入题目给的网址 ...

  3. VNC远程重装CentOS7

    适用于云服务器,远程安装纯净版的CentOS7.9 脚本执行完成后使用VNC客户端连接 一键重装脚本 #!/bin/bash #Net Reinstall Centos System red='\03 ...

  4. Tomcat服务器种的HttpServletRequest类

    HttpServletRequest 类有什么作用:             每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Reque ...

  5. 跟我一起写 Makefile(十)

    四.foreach 函数 foreach函数和别的函数非常的不一样.因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语 ...

  6. 深入理解HTTP请求流程

    以前写过一篇博客,叫做HTTP的报文分析:https://blog.csdn.net/ZripenYe/article/details/119593269但是感觉还是不太深入.不够全面,顶多了解个大概 ...

  7. Linux 多进程编程实例(一)

    文章目录 目标: main.c process1.c process2.c 目标: 一个进程,创建两个子进程,利用exec函数族使两个子进程执行不同的程序.子进程1执行ls -l命令后正常返回,子进程 ...

  8. .net 温故知新:【5】异步编程 async await

    1.异步编程 异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作. 通过 C#.Visual Basic 和 F# 中易于使用的语言级异步编程模型,.NET 可为应用和服务提供使 ...

  9. kubebuilder实战之三:基础知识速览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. 【权限管理】Apache Shiro和Spring Security的对比

    一.Shiro简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Secu ...