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

mybatis框架(操作数据库)

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

mybatis框架(操作数据库)

文章目录

Mybatis框架的使用步骤

前期准备1. 创建Maven工程2. 加入相关的依赖3. 创建实体类,保存表中一行的数据4. 创建持久层的dao接口5. 创建mapper配置文件6.创建主配置文件和数据库信息配置文件

创建数据库信息配置文件:创建主配置文件: 7. 创建获取SqlSession对象的工具类8. 通过mybatis的动态代理获取dao对象 MyBatis 使用传统 Dao 开发方式

(1) 创建 Dao 接口实现类(2)实现接口中 select 方法(3)实现接口中 insert 方法(4)实现接口中 update 方法(5)实现接口中 delete 方法使用方法 传统 Dao 开发方式的分析 动态sql

动态 SQL 之 < if >动态 SQL 之< where >动态 SQL 之 < foreach >

(1) 遍历 List<简单类型>(2) 遍历 List<对象类型> 动态 SQL 之代码片段动态sql总结 主配置文件说明

包含mapper文件的两种方式自动提交事务 pageHelper数据分页

实现步骤:

(1) maven 坐标(2) 加入 plugin 配置(3) PageHelper 对象 其他零碎知识

mybatis框架是对JDBC的一个封装

jdbc的缺点

    代码比较多,开发效率低需要关注 Connection ,Statement, ResultSet 对象创建和销毁对 ResultSet 查询的结果,需要自己封装为 List重复的代码比较多些业务代码和数据库的操作混在一起

MyBatis 解决的主要问题
减轻使用 JDBC 的复杂性,不用编写重复的创建 Connetion , Statement ; 不用编写关闭资源代码。
直接使用 java 对象,表示结果数据。让开发者专注 SQL 的处理。 其他分心的工作由 MyBatis 代劳。

Mybatis框架的使用步骤 前期准备

mybatis框架是对表实现增删查改操作,不会创建表,所以需要先创建出一个表

CREATE TABLE `student` (
 `id` int(11) NOT NULL ,
 `name` varchar(255) DEFAULT NULL,
 `email` varchar(255) DEFAULT NULL,
 `age` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql的简单操作参考

1. 创建Maven工程


创建Maven工程选择archetype创建,选择图中的组件,next

输入包名和文件名,next

finish创建完成

2. 加入相关的依赖

加入mybatis依赖和JDBC依赖和单元测试依赖

	 
      junit
      junit
      4.11
      test
    
    
    
      org.mybatis
      mybatis
      3.5.1
    
    
    
      mysql
      mysql-connector-java
      8.0.28
    

在build标签中加入

  
    
      
        src/main/java
        
          ***.xml
        
        false
      
    
  

用于构建文件结构
完整的配置文件如下:




  4.0.0

  com.changsha
  Mybatis
  1.0-SNAPSHOT

  
    UTF-8
    1.8
    1.8
  

  
    
      junit
      junit
      4.11
      test
    
    
    
      org.mybatis
      mybatis
      3.5.1
    
    
    
      mysql
      mysql-connector-java
      8.0.24
    

  

  
    
      
        src/main/java
        
          ***.xml
        
        false
      
    
  




创建文件结构如下

3. 创建实体类,保存表中一行的数据
package com.changsha.domain;

public class Student {
	//属性名和列名一样 
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    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 getEmail() {
        return email;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", email='" + email + ''' +
                ", age=" + age +
                '}';
    }
}

4. 创建持久层的dao接口
package com.changsha.dao;

import com.changsha.domain.Student;
import org.apache.ibatis.annotations.Param;

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

public interface StudentDao {
    public List selectStudent();
    
    public Integer insertStudent(Student student);
    
    public Integer deleteStudent(@Param("argID") Integer id,@Param("argName") String name);

    
    public Integer updateStudent(Map args);
}

5. 创建mapper配置文件

mapper文件的名称要和dao接口的名字一样 要和对应的dao接口放在同一个目录下

namespace的值是dao接口的全限定名称
id 是dao方法的名字

内容如下:





    
    
        select * from student where 1 = 1
        
            and name = #{name}
        
        
            and age > 100;
        
    

测试

    @Test
    public void myTest(){
        //1. 通过工具类获取SqlSession对象
        SqlSession session = StudentUtil.getSqlSession();
        //2.通过mybatis框架的动态代理获取mybatis实现的对象
        StudentDao studentDao = session.getMapper(StudentDao.class);
        //3. 功能
        List students = new ArrayList<>();
        students = studentDao.selectIf("章",111);
        students.forEach(stu -> System.out.println(stu));
        //4.关闭 SqlSession,释放资源
        session.close();
    }
动态 SQL 之< where >

标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 1=1 的子句。因为,若 where 后的所有条件均为 false,而 where 后若又没有 1=1 子句,则 SQL 中就会只剩下一个空的 where,SQL出错。所以,在 where 后,需要添加永为真子句 1=1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。
使用标签,在有查询条件时,可以自动添加上 where 子句;没有查询条件时,不会添加where 子句。需要注意的是,第一个标签中的 SQL 片断,可以不包含 and。不过,写上 and 也不错,系统会将多出的 and 去掉。但其它中 SQL 片断的 and,必须要求写上。否则 SQL 语句将拼接出错。
语法: 其他动态 sql

接口方法

    public List selectIf(@Param("name") String myName,@Param("age") Integer myAge);

mapper文件


    
 select id,name,email,age from student
 	
 		where id in
 		
			 #{stuid}
		
 	

测试方法:

@Test
public void testSelectForList() {
	 List list = new ArrayList<>();
	 list.add(1002);
	 list.add(1005);
	 list.add(1006);
	 List studentList = studentDao.selectStudentForList(list);
	 studentList.forEach( stu -> System.out.println(stu));
}
(2) 遍历 List<对象类型>

接口方法:

List selectStudentForList2(List stuList);

mapper 文件:


测试方法:

@Test
public void testSelectSqlFragment() {
 List list = new ArrayList<>();
 Student s1 = new Student();
 s1.setId(1002);
 list.add(s1);
 s1 = new Student();
 s1.setId(1005);
 list.add(s1);
 List studentList = studentDao.selectStudentSqlFragment(list);
 studentList.forEach( stu -> System.out.println(stu));
}
动态sql总结

主配置文件说明




    
    

    
    
        
        
    

    
    
        
    

    
        
            
            
            
            
                
                
                
                
                
                
                
                
            
        
    

    
    
        
        

        
        
       
    


包含mapper文件的两种方式

第一种方式:指定多个mapper文件

    
        
        
	

第二种方式: 使用包名
name参数为xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
使用package的要求:
1. mapper文件名称需要和接口名称一样, 区分大小写的一样
2. mapper文件和dao接口需要在同一目录

    
        
    
自动提交事务

自动提交事务
设置自动提交的方式,factory 的 openSession() 分为有参数和无参数的。

有参数为 true,使用自动提交,可以修改 MyBatisUtil 的 getSqlSession()方法。
session = factory.openSession(true);
再执行 insert 操作,无需执行 session.commit(),事务是自动提交的

pageHelper数据分页

Mybatis 通用分页插件

实现步骤: (1) maven 坐标

	 com.github.pagehelper
	 pagehelper
	 5.1.10

(2) 加入 plugin 配置

在主配置文件标签之前加入


	 

(3) PageHelper 对象

查询语句之前调用 PageHelper.startPage 静态方法。
除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。
在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个
方法后的第一个 MyBatis 查询方法会被进行分页。

    @Test
    public void myTest(){
        //1. 通过工具类获取SqlSession对象
        SqlSession session = StudentUtil.getSqlSession();
        //2.通过mybatis框架的动态代理获取mybatis实现的对象
        StudentDao studentDao = session.getMapper(StudentDao.class);
        //3. 功能
        //pageNum参数表示第几页,PageSize表示每页有几条数据
        PageHelper.startPage(1,2);
        List students = new ArrayList<>();
        students = studentDao.selectPage();
        students.forEach(stu -> System.out.println(stu));
        //4.关闭 SqlSession,释放资源
        session.close();
    }

startPage函数中,第一个参数pageNum参数表示第几页,第二个PageSize表示每页有几条数据

其他零碎知识

在mapper文件中能用#{}的地方都能用${}

    5) # 和  $

      select id,name, email,age from student where id=#{studentId}
	  # 的结果: select id,name, email,age from student where id=? 


	   select id,name, email,age from student where id=${studentId}
	  $ 的结果:select id,name, email,age from student where id=1001

	  String sql="select id,name, email,age from student where id=" + "1001";
	  使用的Statement对象执行sql, 效率比PreparedStatement低。


	  $:可以替换表名或者列名, 你能确定数据是安全的。可以使用$


	  # 和 $区别
	  1. #使用 ?在sql语句中做站位的, 使用PreparedStatement执行sql,效率高
	  2. #能够避免sql注入,更安全。
	  3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
	  4. $有sql注入的风险,缺乏安全性。
	  5. $:可以替换表名或者列名

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

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

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