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

Mybatis框架

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

Mybatis框架

目录
  • 三层架构
  • Mybatis
    • Mybatis作用
    • Mybatis的安装
    • Mybatis的传统使用
    • SqlSessionFactory和SqlSession
    • 动态代理getMapper
    • Mybatis深入理解参数
      • 一个简单类型的传参
      • 多个参数传值@Param
      • 使用对象传参
        • 按位置传参
        • Map传参
      • #{}和${}
    • 封装mybatis的输出结果
      • resultType
      • 返回简单类型
      • 定义别名
      • 查询结果返回Map
    • resultMap结果映射
    • like模糊查询参数
    • 动态sql
      • if标签
      • where
      • foreach
      • sql代码片段
    • mybatis配置文件
    • 扩展

三层架构

1:界面层——controller包(servlet)
接收用户的请求参数,处理请求结果(jsp,html,servlet)
2:业务逻辑层——service包(service类)
接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
3:数据访问层——dao包(Dao类)
就是访问数据库,执行对数据的增删查看(CRUD)等

三层中类的交互:
用户使用界面层——>业务逻辑层——>数据访问层(持久层)——>数据库(mysql)

三层对应的处理框架:
界面层:——servlet——springmvc(框架)
业务逻辑层:——service——spring(框架)
数据访问层:——dao类——mybatis(框架)

Mybatis Mybatis作用

Mybatis类似于增强版的JDBC

1:sql mapper:sql映射
可以把数据库中的一行数据 映射为一个java对象
一行数据可以看做是一个java对象,操作这个对象,就相当于操作表中的数据
2:Data Access Objects(DAOs)
数据访问,对数据库执行增删改查(CRUD)

提供的功能

1:提供了创建Connection,Statement,ResultSet的能力
2:提供了执行sql语句的能力
3:提供了循环sql,把sql的结果转为java对象,集合的能力
4:提供了关闭资源(Connection,Statement,ResultSet)的能力

Mybatis的安装

Mybatis下载地址:Github官网下载地址

Mybatis中文帮助官网:mybatis中文网

Mybatis的传统使用

1:加入Mybatis坐标,mysql的驱动
2:创建sql映射的配置文件
在dao目录中和接口同级,文件名和接口保持一致
sql映射文件,写sql语句,一个表对应一个sql映射文件,后缀.xml
3:创建mybatis的主配置文件
一个项目只有一个主配置文件
主配置文件提供了数据库的连接信息和sql映射文件的位置信息
4:使用SqlSession调用操作数据库的操作

创建Maven的普通javaSE的项目:

准备dao目录,mysql表,普通的类(类的数据和表中的数据类型保持一致)

StudentDao文件的内容:

package com.javase.dao;

import com.javase.entity.student;
import java.util.List;

public interface StudentDao {
    List SelectStudents();
}

创建普通的类

打开pom.xml加入依赖
加入依赖:mybatis,mysql
打开mybatis中文网



    
      org.mybatis
      mybatis
      3.5.7
    
    
     
      mysql
      mysql-connector-java
      8.0.27
    
    


 

    
      
        
        src/main/java
        
          
          ***.xml
        
        false
      

      
        
        src/main/resources
        
          
          ***.xml
        
        false
      
    

创建映射sql的配置文件

在dao目录下创建文件file:

配置文件复制mybatis中文网的内容:









  
        select * from usertable where id = #{id}
    

Mybatis对数据类型全限定名称对比表:左边是Mybatis规定名称,右边是数据类型名称

一个简单类型的传参

简单类型:基本数据类型(包括包装类)和String字符串
在sql映射文件中简单类型的参数是用#{字符串}来表示

    
        select * from usertable where id = #{ById} and sex = #{BySex}
    

测试:

    @Test
    public void testSelectStudentByIdAndSex(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        student stu = dao.SelectStudentByIdAndSex(69,"男");
        System.out.println(stu.toString());
    }

结果:

使用对象传参

传多个参数,使用java对象的属性值作为参数
创建接口方法:

student SelectStudentsByObject(student stu);

sql映射文件:

语法:#{属性名,javaType=类型名,jdbcType=数据类型}
javaType是java中的对象属性数据类型
jdbcType是数据库中表结构字段的属性类型
    
        select * from usertable where id = #{id} and username = #{username}
    

测试:

    @Test
    public void testSelectStudentByObject(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        student stu = dao.SelectStudentsByObject(new student(69,"艾伦",null,null,null));
        System.out.println(stu.toString());
    }

结果:

mybatis支持的数据库中的类型

按位置传参

接口:

student SelectStudentByPosition(Integer id,String name);

sql映射文件:

    
        select * from usertable where id = #{mapId} and username = #{mapName}
    
#{}和${}

#{}和${}区别

#{}底层使用了PrepareStatement对象执行sql语句#{}代表sql语句的?这样更安全,更迅速
${}底层使用了Statement对象执行sql语句使用了字符串的连接和替换,有sql注入现象,效率低,不安全
封装mybatis的输出结果 resultType

resultType结果类型,执行完sql语句后将数据转为的结果类型
resultType转为的结果类型是任意的,不需要实体类

    
        select count(username) from usertable
    

测试:

    @Test
    public void testSelectsCount(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        int result = dao.SelectStudentsCount();
        System.out.println("总人数为:" + result);
    }

结果:

定义别名

可以在mybatis主配置文件中定义别名

将全限定名com.javase.entity.student定义为stu
第一种定义方式:
    
        
    
第二种定义方式:
将包内的所有类不需要写全限定名称,比如entity包下的student只需要在sql映射文件中写stuent就可以
    
        
    

"注:两个包下的类名有可能重复,谨慎使用,建议用全限定名"

sql映射文件:

    
        select * from usertable where id = #{id}
    

测试:

    @Test
    public void testSelectByResultTypeMap(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        Map studentMap = dao.SelectStudentByResultTypeMap(69);
        System.out.println(studentMap);
    }
resultMap结果映射

resultMap结果映射是用来指定你的列名和java对象的属性对应关系
当列名和属性名不一样时需要使用resultMap
resultType和resultMap不能一起用
接口:

List SelectStudentsByResultMap();

sql映射文件:

    
    
        
        
        
        
        
        
    
    
        select id,username,password,sex,email from usertable
    

结果:

resultType解决列名和属性名不一致的第二种解决方案
设一个普通类

package com.javase.entity;

public class NewStudent {
    private Integer id;
    private String name;
    private String psw;
    private String sex;
    private String email;

    public NewStudent() {
    }

    public NewStudent(Integer id, String name, String psw, String sex, String email) {
        this.id = id;
        this.name = name;
        this.psw = psw;
        this.sex = sex;
        this.email = email;
    }

    @Override
    public String toString() {
        return "NewStudent{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", psw='" + psw + ''' +
                ", sex='" + sex + ''' +
                ", email='" + email + ''' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPsw() {
        return psw;
    }

    public void setPsw(String psw) {
        this.psw = psw;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

sql映射文件:
sql语句内的列名与转为的结果类型的属性名不一样时可以使用sql语句的别名as

    
        select * from usertable where username like #{name}
    
第二种写法:
    
        select * from usertable
        where
        
        
            username = #{username}
        
        
        
            or id < #{id}
        
    
如果第一个if不成立而第二个if成立的话sql会变成select * from usertable where or id < ?
这样会语法错误,改进代码where 1=1:
    
        select * from usertable
        where 1=1
        
            username = #{username}
        
        
            or id < #{id}
        
    
> 以上代码中or id < #{}中的<表示小于的意思,因为直接写<会造成标签冲突

mybatis的对应符号:

原符号对应符号
<<
>>
<><>
&&
'
""

测试:

    @Test
    public void testSelectSql(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        student stu = new student();
        stu.setId(69);
        stu.setUsername("艾伦");
        List studentList = dao.SelectSql(stu);
        for (student stuList:studentList) {
            System.out.println(stuList.toString());
        }
    }
where

接口:

List SelectSqlWhere(student stu);

sql映射文件:

语法格式:  


    
        select * from usertable where id in
        
            #{id}
        
    
list集合是对象类型的写法:
    

测试:

    @Test
    public void testSelectSqlWhere(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        student stu = new student();
        stu.setUsername("艾伦");
        stu.setId(69);
        List studentList = dao.SelectSqlWhere(stu);
        for (student stuList:studentList) {
            System.out.println(stuList.toString());
        }
    }

结果:

mybatis配置文件

数据库连接配置文件properties
把数据库的连接信息单独写到一个文件中,方便管理连接数据库的信息
在resources配置文件夹下创建文件:自定义文件名.properties

文件中写入连接数据库的信息
格式:key=value

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ccxg
username=root
password=123465

在主配置文件下导入文件位置并修改连接信息(使用${文件的key值}):




    
    
    
        
    

    
        
    

    

        

            
            
                
                
                
                
            

        
    

    
        
    


指定多个sql映射文件(mapper)
假如有多个mapper文件

需要在主配置文件下添加sql映射文件

第一种写法:
    
        
        
    
第二种写法:
    
        
    
扩展

数据展示的翻页插件:
在pom.xml文件中加入pagehelper的依赖:


    com.github.pagehelper
    pagehelper
    5.3.0

在mybatis的主配置文件加入插件:
在environments标签之前

    
        
    

测试:

	@Test
    public void testSelect() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        //加入PageHelper的方法,分页
        //参数pageNum:从第几页开始
        //PageSize:一页中有多少数据
        PageHelper.startPage(1,3);

        List studentList = dao.SelectStudents();

        for (student stu:studentList) {
            System.out.println(stu.toString());
        }
        sqlSession.close();
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458633.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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