栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

初学MyBatis学到的知识

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初学MyBatis学到的知识

MyBatis

文章目录

MyBatis 前言

为什么要学MyBatis? 一、MyBatis是什么?

什么是持久化什么是持久层 二、学习MyBatis所需资源

1.下载MyBatis2.获取Maven中要使用的MyBatis的Jar包3.官方文档 三、第一个MyBatis程序

1.自己创建数据库2.演示3.以上总结4.万能的Map5.模糊查询


前言 为什么要学MyBatis?

帮助程序员将数据存入到数据库中传统的JDBC代码太复杂,为了简化它,创建了这么一个框架,实现了自动化方便使用最重要的一点:使用的人多

优点:

    灵活简单易学解除sql与程序代码的耦合提供映射标签,支持对象与数据库的orm字段关系映射提供对象关系映射标签,支持对象关系组建维护提供xml标签,支持编写动态sql
一、MyBatis是什么?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 什么是持久化

数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程

数据库(JDBC)和IO文件持久化,可以持久化数据
为什么要持久化?

因为内存有一个断电即失的特性,有一些信息对象不能丢失内存太贵 什么是持久层

Java学习中,有很多层,Dao层、Service层、Controller层~~
持久层就是完成持久化工作的代码块

二、学习MyBatis所需资源 1.下载MyBatis

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。

查询可知在Github官网(https://github.com)即可获取




在这里下载压缩包就行

2.获取Maven中要使用的MyBatis的Jar包

在Maven仓库(https://mvnrepository.com)里直接搜索MyBatis


    org.mybatis
    mybatis
    3.5.7

3.官方文档

学习的东西都是参照官方文档

MyBatis中文文档:https://mybatis.org/mybatis-3/zh/index.html

三、第一个MyBatis程序

这里可以看一下我们的MyBatis的官方文档入门我们的学习大部分资源是官方给的
我们的项目目录大概是这样:

这里,我来为大家演示官方给的配置如何使用

1.自己创建数据库
CREATE DATAbase `mybatis`;
 
USE `mybatis`;

CREATE TABLE `user` (
  `id` int(20) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
insert  into `user`(`id`,`name`,`pwd`) values (1,'上泽','200126'),(2,'狂神','20020128'),(3,'南迁','5212415');

建议手动敲一遍,加深印象

2.演示

我们需要的实体类文件

User类

package com.ze.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;
    public User() {
    }
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", pwd='" + pwd + ''' +
                '}';
    }
}


创建一个普通的Maven项目,我们需要的jar包有mysql的配置文件、junit、Mybatis

		
            mysql
            mysql-connector-java
            8.0.22
        
        
            junit
            junit
            4.13.2
        
        
            org.mybatis
            mybatis
            3.5.7
        

文档中的第二步

我们会有很多改动

mybatis-coinfig.xml文件




    
        
            
            
                
                
                
                
            
        
    
    
        
    

MybatisUtils

package com.ze.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            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(){
        return sqlSessionFactory.openSession();
    }

}

文档第三步

这一步是获取SqlSession,SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。也就是说我们可以拿到我们所需要的数据,直接写入测试类,这里我们只使用了一种方法,也就是第二种,另一种是官方不推荐的,这种好处是 代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换

UserDaoTest

package com.ze.dao;

import com.ze.pojo.User;
import com.ze.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

public class UserDaoTest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

我们的测试文件都是官方推荐使用的方法
给一个xml映射

下面的调用方法也是推荐第二种
第二种方法有很多优势,首先它不依赖于字符串字面值,会更安全一点;其次,如果你的 IDE 有代码补全功能,那么代码补全可以帮你快速选择到映射好的 SQL 语句。

UserMapper.xml




   
       select * from user
   

这里的namespace是接口路径 id为接口方法名称 resultType为实体类路径

接口UserDao

package com.ze.dao;

import com.ze.pojo.User;

import java.util.List;

public interface UserDao {
    List getUserList();
}

最后使用测试类,可测出结果

运行时查看xml文件是否加载出来了

因为Maven的约定大于配置,所以可能有配置文件无法导出的问题,解决方案是在配置文件pom.xml中加入如下配置


        
            
                src/main/resources
                
                    ***.xml
                
                true
            
            
                src/main/java
                
                    ***.xml
                
                true
            
        
    

最后运行时可能有很多离谱的问题,我就碰到了一个Causedby:org.apache.ibatis.exceptions.PersistenceException
看了好久是因为在xml文件中加了注释报错的,只觉离谱。有同样问题的小伙伴直接删除即可,或者去看一下这个人的博客看看其他解决办法

当然,第一次运行可能还有其他的错误,网上基本都有解决的方法,我不在一 一阐述

3.以上总结

我们配置好以后,增删改查只有接口方法,=sql语句,和使用不同

在接口中添加方法可以一个一个玩

package com.ze.dao;

import com.ze.pojo.User;

import java.util.List;

public interface UserDao {
    //查询所有用户
    List getUserList();
//    查询指定id
    List getUserId(int id);
//    添加操作
    int insertUser(User user);
//    删除指定用户
    int deleteUser(int id);
//    修改信息
    int updateUser(User user);
}

加入sql语句





   
        select * from user where #{id};
    

    
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd});
    

    
        update user set name=#{name},pwd=#{pwd} where id=#{id} ;
    

    
        delete from user where id=#{id};
    

测试类中测试

    @Test
    public void test2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List userList = mapper.getUserId(1);
        System.out.println(userList);
        sqlSession.close();
    }

    @Test
    public void test3(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        int insert = mapper.insertUser(new User(4, "23", "1234"));
        sqlSession.commit();
        sqlSession.close();
    }

    //删除
    @Test
    public void test4(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        mapper.deleteUser(4);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void test5(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        mapper.updateUser(new User(4,"不糊","456"));
        sqlSession.commit();
        sqlSession.close();
    }

注意:

    增加inster、删除delete和修改update需要提交事务
    **sqlSession.commit();**否则不会更新数据。**sql语句后面的“;”加不加:**针对mysql来说,在mybatis的xml文件中两种形式都是支持的。而对于Oracle,加分号的写法会报“ora-00911:无效字符”的异常。 具体的原因是 “Oracle数据库接口对书写格式要求非常严格,有时候即使多加一个空格,多加一个逗号,分号,回车等都不行”。#{xx}容易写错为{#xx},这个是我的问题
4.万能的Map

在上面我们使用到User实体类,在编写sql语句时需要所有的属性id,name,pwd

update user set name=#{name},pwd=#{pwd} where id=#{id} ;

如果User类有很多的属性(想象为100个),而我们只是想修改密码,这样就会非常繁琐,而Map就能给我们解决这样的问题
给大家简单的示范一下,这个思想以后的开发中经常会使用

添加方法

int updateUser2(Map map);

xml


        update user set pwd=#{password} where id=#{Id}

这里的不同需要注意一下,参数类型parameter为map ,Id与password自己命名,与Map的key值等同(下面自己添加值),我们取得的就是value

测试

@Test
    public void map1Test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        Map map = new HashMap();
        map.put("Id",2);
        map.put("password","5555");
        mapper.updateUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }

注:

    对象传递参数,在sql中取对象的属性 parameterType="Object"只有一个一个参数的情况下,可以直接在sql中取到(parameterType="Object"可以省略)Map传递参数,在sql中取用key即可 parameterType="map"
5.模糊查询

模糊查询怎么写?

    java代码执行的时候,传递通配符% %
List inShang(String name);
 
    select * from user where `name` like "%"#{name}"%";

List user = mapper.inShang("上");

这种情况存在sql注入

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782314.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号