Mybatis总结

简介

Mybatis 官网:

https://mybatis.org/mybatis-3/zh/getting-started.html

环境配置

  1. 新建一个普通的maven项目
  2. 删除项目的src目录
  3. 导入maven依赖


    
    
        mysql
        mysql-connector-java
        5.1.47
    
    
    
        org.mybatis
        mybatis
        3.5.2
    
    
    
        junit
        junit
        4.12
    
    
    
        org.projectlombok
        lombok
        1.18.10
	

解决Maven resources资源 过滤问题



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

建立模块

1、上面建立的普通Maven项目为父工程,后面都通过建立Module模块来当子工程

2、建立一个Module项目(普通maven项目)

3、在resources资源文件夹下创建配置文件 db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

4、在resources资源文件夹下创建 mybatis-config.xml 文件,编写mybatis的核心配置文件





    
    
    
    
        
        
        
        
    
    
    
        
    
    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

  • 编写mybatis工具类
package com.qiu.util;

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 {
            //使用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 命令所需的所有方法。
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

编写业务代码

创建实体类

package com.qiu.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 + '\'' +
                '}';
    }
}

编写Dao层接口

public interface UserDao {
    
}

编写UserMapper.xml配置文件

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





    
    


编写测试类

import org.junit.Test;
public class UserDaoTest {

}

CURD

下面的步骤顺序为:接口、Mapper配置文件、测试类

查询全部用户

//查询全部用户
List getUserList();



解释:
 id : 就是对应的namespace中的方法名;
 resultType:Sql语句执行的返回值!(如果为集合,则写集合中的泛型)
 parameterType : 参数类型!
@Test
public void getUserList(){
    //第一步,获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    //方式一:getMapper
    UserMapper userDao = sqlSession.getMapper(UserMapper.class);
    List userList = userDao.getUserList();

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

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

根据ID查询用户

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


@Test
public void getUserById(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserById(1);
    System.out.println(user);
    sqlSession.close();
}

插入用户

//插入用户
int addUser(User user);


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

@Test
public void addUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int ok = mapper.addUser(new User(5, "李六", "123456"));
    if(ok>0){
        System.out.println("插入成功!");
    }
    sqlSession.commit();	//提交事务
    sqlSession.close();
}

修改用户

//修改用户
int updateUser(User user);

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

@Test
public void updateUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int ok = mapper.updateUser(new User(4, "赵六", "123456"));
    if(ok>0){
        System.out.println("修改成功");
    }
    sqlSession.commit();
    sqlSession.close();
}

删除用户

//删除用户
int deleteUser(int id);


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

@Test
public void deleteUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int ok = mapper.deleteUser(4);
    if(ok>0){
        System.out.println("删除成功!");
    }
    sqlSession.commit();
    sqlSession.close();
}

分页

//分页
List getUserByLimit(Map map);

@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",3);
    List userList = mapper.getUserByLimit(map);
    for (User user : userList) {
        System.out.println(user);
    }
    sqlSession.close();
}

基于RowBounds分页

//RowBounds分页
List getUserByRowBounds();


@Test
public void getUserByRowBounds(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    RowBounds rowBounds = new RowBounds(0, 3);
    List userList = sqlSession.selectList(
        "com.qiu.dao.UserMapper.getUserByRowBounds", null, rowBounds);
    for (User user : userList) {
        System.out.println(user);
    }
    sqlSession.close();
}

模糊查询

模糊查询怎么写?

  1. Java代码执行的时候,传递通配符 % %

    List userList = mapper.getUserLike("%李%");
    
  2. 在sql拼接中使用通配符!

    select * from mybatis.user where name like "%"#{value}"%"
    

注意点:

  • 增删改需要提交事务!

  • 可以在工具类创建的时候实现自动提交事务!

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

动态SQL

什么是动态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(30) NOT NULL COMMENT '博客作者',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `views` int(30) NOT NULL COMMENT '浏览量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8

创建实体类

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

查询数据

//查询数据
List queryBlogIF(Map map);

    
        and title = #{title}
    
    
        and author = #{author}
    
    
        and views > #{views}
    



@Test
public void queryBlogIF(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    Map map= new HashMap();
    //map.put("views",5000);
    List blogs = mapper.queryBlogIF(map);
    for (Blog blog : blogs) {
        System.out.println(blog);
    }
    sqlSession.close();
}

指定更新

//指定更新
int updateBlog(Map map);

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

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

    HashMap map = new HashMap();
    map.put("title","我要学习框架");
    map.put("id",1);
    int ok = mapper.updateBlog(map);
    if(ok>0){
        System.out.println("更新成功!");
    }
    sqlSession.close();
}

指定删除

//指定删除
int delBlog(Map map);

    delete from mybatis.blog
    
        
        
            and create_time > #{createTime}
        
    


@Test
public void delBlog(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    HashMap map = new HashMap();
    map.put("createTime","2020-06-05 16:49:00");
    int ok = mapper.delBlog(map);
    queryBlog();
    sqlSession.close();
}

配置解析

核心配置文件

mybatis-config.xml

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

类型别名(typeAliases)

类型别名是为 Java 类型设置一个短的名字。

存在的意义仅在于用来减少类完全限定名的冗余。



    

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

扫描实体类的包,它的默认别名就为这个类的 类名,首字母小写!



    

在实体类比较少的时候,使用第一种方式。

如果实体类十分多,建议使用第二种。

第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解

@Alias("user")
public class User {}

结果集映射(resultMap)

作用:解决属性名和字段名不一致的问题

id   name   pwd
id   name   password


    
    
    
    



映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件;

方式一: 【推荐使用】



    

方式二:使用class文件绑定注册



    

注意点:

  • 接口和他的Mapper配置文件必须同名!
  • 接口和他的Mapper配置文件必须在同一个包下!

方式三:使用扫描包进行注入绑定



    

注意点:

  • 接口和他的Mapper配置文件必须同名!
  • 接口和他的Mapper配置文件必须在同一个包下!

日志(log4j)

首先导入log4j的包



    log4j
    log4j
    1.2.17

在resources资源文件夹下创建 log4j.properties 配置文件

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

配置log4j为日志的实现


    

常见报错情况

第一种:1 字节的 UTF-8 序列的字节 1 无效。

Mybatis总结_第1张图片

原因:

​ 在配置文件中引入了, 在配置文件可能包含有中文注释,导致在编译后中文注释在配置文件乱码抛异常。

解决方案1:

在项目依赖配置文件pom.xml上加入构建项目编码属性


	UTF-8

解决方案2:

把UTF-8改为UTF8

注意点:

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

检查核心配置文件中是否注册 mappers

本篇总结参考 B站狂神说Java:https://space.bilibili.com/95256449

你可能感兴趣的:(Mybatis总结)