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

Mybits学习

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

Mybits学习

环境

JDK1.8

Mysql5.7

meaven3.6.1

什么是 MyBatis?

MyBatis 是一款优秀的持久层框架

,它支持自定义 SQL、存储过程以及高级映射

。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

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

github地址:Releases · mybatis/mybatis-3 · GitHubMyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.https://github.com/mybatis/mybatis-3/releases

 中文文档:

mybatis – MyBatis 3 | 简介https://mybatis.org/mybatis-3/zh/index.htmlmeaven仓库


    org.mybatis
    mybatis
    3.5.2

 

 

 环境搭建

搭建数据库

CREATE DATAbase `mybatis`;
USE `mybatis`;

CREATE TABLE `user`(
	id INT PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAr(40) DEFAULT NULL,
	`password` VARCHAr(40) DEFAULT NULL
	
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user`(id,`name`,`password`)VALUE(1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456');

新建项目



    4.0.0
    
    org.example
    mybatis-study
    1.0-SNAPSHOT

    

        
            mysql
            mysql-connector-java
            5.1.47
        

        
            org.mybatis
            mybatis
            3.5.2
        
        
        
            junit
            junit
            4.11
        
    

创建一个模块

编写mybatis的核心配置文件






    
        
            
            
                
                
                
                
            
        

    

    
        
    

编写mybatis工具类

package com.qi.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;

//工具类
//sqlSessionFactory --> sqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用mybatis的第一步,获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    public static SqlSession getSqlSession(){
        return  sqlSessionFactory.openSession();
    }

}

编写代码

实体类

package com.qi.entity;
//实体类
public class User {
    private int id;
    private String name;
    private String password;

    public User() {
    }

    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", password='" + password + ''' +
                '}';
    }
}

Dao接口

package com.qi.dao;

import com.qi.entity.User;

import java.util.List;

public interface UserDao {
    List getUserList();
}

接口实现类由原来的UserDaoImpl转变成为一个Mapper配置文件








    
        select * from mybatis.user
    

测试jutil


org.apache.ibatis.binding.BindingException: Type interface com.qi.dao.UserDao is not known to the MapperRegistry.

MapperRegistry?是什么

meaven资源失效


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

————————————————
版权声明:本文为CSDN博主「zerozero121」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45540125/article/details/115471705
package com.qi.dao;

import com.qi.entity.User;
import com.qi.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 sqlSession = MybatisUtils.getSqlSession();
        //执行SQL 方式一getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List userList = userDao.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }

        //关闭SqlSession
        sqlSession.close();
    }
}

 七步

 CRUD

1nameSpace

nameSpace里面的包名要与Dao/Mapper接口包名一致

 Mapper

package com.qi.dao;

import com.qi.entity.User;

import java.util.List;

public interface UserMapper {
    //获取全部用户
    List getUserList();

    //根据ID查询用户
    User getUserById(int id);

    //增加用户
    int addUser(User user);

    //修改事务
    int updateUser(User user);

    //删除一个用户
    int deleteUser(int id);
}

Mapper.xml








    
        select * from mybatis.user where id = #{id}
    


    
        insert into mybatis.user(id,name,password)value (#{id},#{name},#{password});
    

    
        update mybatis.user
        set name = #{name},password = #{password}
        where id = #{id};
    


    
        delete from mybatis.user where id = #{id};
    

Test

package com.qi.dao;

import com.qi.entity.User;
import com.qi.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import javax.jws.soap.SOAPBinding;
import java.util.List;

public class UserDaoTest {


    @Test
    public void test(){
        //第一步获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try {
                //执行SQL 方式一getMapper
                UserMapper userDao = sqlSession.getMapper(UserMapper.class);
                List userList = userDao.getUserList();

                for (User user : userList) {
                    System.out.println(user);
                }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭SqlSession
            sqlSession.close();
        }

    }
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User userById = mapper.getUserById(1);

        System.out.println(userById);

        sqlSession.close();
    }

    //增删改需要提交事务
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        int res = mapper.addUser(new User(4, "爱的看哈", "123456"));
        if (res>0){
            System.out.println("success");
        }
        //提交事务
        sqlSession.commit();

        sqlSession.close();
    }

    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser(new User(4,"安静","11111"));

        sqlSession.commit();


        sqlSession.close();

    }

    @Test
    public void delectUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUser(4);

        sqlSession.commit();

        sqlSession.close();
    }

}

Map

  //map万能使用
    int addUser2(Map map);





    
        insert into mybatis.user(id,name,password)value (#{userid},#{username},#{passWord});
    

    @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        HashMap map = new HashMap();
        map.put("userid",7);
        map.put("username","阿大赛");
        map.put("passWord","713212313");
        mapper.addUser2(map);

        sqlSession.close();
    }
}

 配置解析

CRUD

package com.qi.dao;

import com.qi.entity.User;


import java.util.List;
import java.util.Map;

public interface UserMapper {


    //模糊查询
    List getUserLike(String value);

    //获取全部用户
    List getUserList();

    //根据ID查询用户
    User getUserById(int id);

    //map万能使用
    int addUser2(Map map);

    //增加用户
    int addUser(User user);

    //修改事务
    int updateUser(User user);

    //删除一个用户
    int deleteUser(int id);
}






    
        select * from mybatis.user where id = #{id}
    

    
        insert into mybatis.user(id,name,password)values (#{id},#{name},#{password});
    

    
        update mybatis.user
        set name = #{name},password = #{password}
        where id = #{id};
    

    
        insert into mybatis.user(id,name,password)values (#{userid},#{username},#{passWord});
    

    
        delete from mybatis.user where id = #{id};
    

    
        select * from mybatis.user where id = #{id}
    

resultMap 元素是 MyBatis 中最重要最强大的元素。

ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

这就是 ResultMap 的优秀之处——你完全可以不用显式地配置它们

日志

日志工厂

如果数据库出现异常,我们排错,日志就是最好的助手

曾经的 sout debug

现在日志工厂

 

 具体使用日志在设置中设定

STDOUT_LOGGING标准日志输出

在mybatis核心配置文件中,配置我们的日志

 Log4j

1导入log4j的包

    
            log4j
            log4j
            1.2.17
        

2log4j的properties文件

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3配置log4为日志的实现

 

        
    

4log4j 的使用

 简单使用

1,在使用的 Log4j 的类中导包

import org.apache.log4j.Logger;
package com.qi;

import com.qi.dao.UserMapper;
import com.qi.entity.User;
import com.qi.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;



public class UserDaoTest {

   static Logger logger = Logger.getLogger(UserDaoTest.class);

    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User userById = mapper.getUserById(1);

        System.out.println(userById);

        sqlSession.close();
    }

    @Test
    public void testLog4j(){
        logger.info("info:进入了testLog4j");
        logger.debug("debug:进入了testLog4j");
        logger.error("error:进入了testLog4j");
    }


}

-----------------------------------------
C:UsersV556U.jdkscorretto-1.8.0_302binjava.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=60143:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibcharsets.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextaccess-bridge-64.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextcldrdata.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextdnsns.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextjaccess.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextjfxrt.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextlocaledata.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextnashorn.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextsunec.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextsunjce_provider.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextsunmscapi.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextsunpkcs11.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibextzipfs.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibjce.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibjfr.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibjfxswt.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibjsse.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibmanagement-agent.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibresources.jar;C:UsersV556U.jdkscorretto-1.8.0_302jrelibrt.jar;C:UsersV556UDesktopspringbootmybatis-studymybatis-03targettest-classes;C:UsersV556UDesktopspringbootmybatis-studymybatis-03targetclasses;C:UsersV556U.m2repositorymysqlmysql-connector-java5.1.47mysql-connector-java-5.1.47.jar;C:UsersV556U.m2repositoryorgmybatismybatis3.5.2mybatis-3.5.2.jar;C:UsersV556U.m2repositoryjunitjunit4.11junit-4.11.jar;C:UsersV556U.m2repositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;C:UsersV556U.m2repositorylog4jlog4j1.2.17log4j-1.2.17.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.qi.UserDaoTest,testLog4j
[INFO ] 2021-09-25 09:55:58,932 method:com.qi.UserDaoTest.testLog4j(UserDaoTest.java:31)
info:进入了testLog4j
[DEBUG] 2021-09-25 09:55:58,938 method:com.qi.UserDaoTest.testLog4j(UserDaoTest.java:32)
debug:进入了testLog4j
[ERROR] 2021-09-25 09:55:58,938 method:com.qi.UserDaoTest.testLog4j(UserDaoTest.java:33)
error:进入了testLog4j

Process finished with exit code 0

分页

减少数据的处理量

使用limit分页

语法        

select * from user limit startIndex,pageSize;
select * from user limit 2,2;

使用Mybatis实现分页,核心SQL

1接口

  List getUserByLimit(Map map);

2Mapper.XML

 
        select * from mybatis.user limit #{startIndex},#{pageSize}
    

3测试

    @Test
    public void getUserByLimit(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        HashMap map = new HashMap<>();
        map.put("startIndex",0);
        map.put("pageSize",2);

        List userList = mapper.getUserByLimit(map);
        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();
    }

Mybatis分页插件

PageHelpe 可以查看官方的文档进行使用

使用注解开发

 

 

 使用注解开发

对于像 BlogMapper 这样的映射器类来说,还有另一种方法来完成语句映射。 它们映射的语句可以不用 XML 来配置,而可以使用 Java 注解来配置。

 本质反射机制

底层:动态代理

 CRUD

我们可以在工具类创建时自动提交事务

1openSession设置为true

package com.qi.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;

//工具类
//sqlSessionFactory --> sqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用mybatis的第一步,获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    public static SqlSession getSqlSession(){
        return  sqlSessionFactory.openSession(true);
    }

}

2接口加注解

package com.qi.dao;


import com.qi.entity.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {

    @Select("select * from mybatis.user")
    List getUser();

    //方法存在多个参数,所有参数前面必须加上注解@Param(“”)注解
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") int id);

    @Insert("insert into user(id,name,password) values (#{id},#{name},#{password})")
    int addUser(User user);

    @Update("update user set name=#{name},password=#{password} where id =#{id}")
    int updateUser(User user);

    @Delete("delete from user where id =#{id}")
    int deleteUser(@Param("id") int id);
}

测试类

【注意我们必须将我们的接口绑定到核心配置文件中】

import com.qi.dao.UserMapper;
import com.qi.entity.User;
import com.qi.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

//        List userList = mapper.getUser();
//
//        for (User user : userList) {
//            System.out.println(user);
//
//        }
//
//        User userById = mapper.getUserById(1);
//        System.out.println(userById);

//        mapper.addUser(new User(5,"理解啊的啦","211345"));

//        mapper.updateUser(new User(5,"ss","214222"));
        mapper.deleteUser(5);
        sqlSession.close();
    }
}

关于@Param()注解

 lombok

    
        
            org.projectlombok
            lombok
            1.18.20
        
    

 

@Data
@AllArgsConstructor
@NoArgsConstructor

 多对一

 

 SQl

CREATE TABLE `teacher`(
`id` INT(10) NOT NULL,
`name` VARCHAr(40) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`,`name`) VALUES (1,'杜老师');

CREATE TABLE `student`(
	id INT(10) NOT NULL,
	`name` VARCHAr(40) DEFAULT NULL,
	`tid` INT(10) DEFAULT NULL,
	PRIMARY KEY (`id`),
	KEY `fktid` (`tid`),
	ConSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher`(`id`)
	
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO student(`id`,`name`,`tid`) VALUES (1,'小明',1);
INSERT INTO student(`id`,`name`,`tid`) VALUES (2,'小红',1);
INSERT INTO student(`id`,`name`,`tid`) VALUES (3,'小张',1);
INSERT INTO student(`id`,`name`,`tid`) VALUES (4,'小李',1);
INSERT INTO student(`id`,`name`,`tid`) VALUES (5,'小王',1);

 环境搭建

1导入lombok

2新建实体类Teacher Student

3建立Mapper接口

4建立Mapper.xml文件

5在核心配置文件中绑定注册我们的Mapper接口或者文件

6测试查询是否能够成功

 按照查询嵌套处理






    
    
        select * from teacher where id = #{id};
    

 按照结果嵌套处理

    
        select s.id sid,s.name sanme,t.name tname,t.id tid
        from student s,teacher t
        where s.tid = t.id and t.id = #{tid};
    

    
        
        
        
        
            
            
            
        
    

按照查询嵌套处理


        select * from student where tid =#{tid}
    

 

 

 动态SQL

什么动态SQL,不同的需求不同的sql

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

 搭建环境

CREATE TABLE `blog`(
`id` VARCHAr(50) NOT NULL COMMENT '博客id',
`title` VARCHAr(100) NOT NULL COMMENT '博客标题',
`author` VARCHAr(100) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`views` INT(30) NOT NULL COMMENT '浏览量'
)ENGINE=INNODB DEFAULT CHARSET=utf8

创建一个基础工程

package com.qi.entity;

import lombok.Data;

import java.util.Date;

@Data
public class Blog {
    private int id;
    private String title;
    private String author;
    private Date createTime;
    private int views;
}

 IF

 
        select * from mybatis.blog
        
            
                and title =#{title}
            
            
                and author = #{author}
            
        

    
    
        update mybatis.blog
        
            
                title = #{title},
            
            
                author = #{author}
            
        
        where id =#{id}
    

动态sql本质sql ,只是在SQL层面上去执行一个逻辑代码

sql片段

有时候我们会将一些SQL片段提取出来

1将固定的用sql抽取出来

2使用的地方用include调用

    
        
            and title =#{title}
        
        
            and author = #{author}
        
    

Foreach

  

缓存

1查询        链接数据库        耗资源

                一次查询的结果暂存在一个可以直接查询到的地方------》内存 :缓存

再次查询出来直接走缓存,不用走数据库

 

 

 

 

 

 1.开启全局缓存

 

2在要使用二级缓存Mapper中开启

 

 

 

 自定义缓存-ehcache

 要在程序中使用

1导包

   
            org.mybatis.caches
            mybatis-ehcache
            1.1.0
        

定义

   

 ehcache。xml的创建

 xml文件内容



    
    

    
    


        

mybatis流程图

 

 

 

 

 

 

 

 

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

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

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