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

Mybatis【适用于初学者】

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

Mybatis【适用于初学者】

MyBatis 什么是MyBatis框架

MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 JDBC,开发者只需要关注 sql 语句本身,

而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。

MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,

并通过 java 对象和 sql 的动态参数进行映射生成最终执行的 sql 语句,

最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

框架是什么

框架(framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;

另一种认为,框架是可被应用开发者定制的应用骨架、模板。

简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。

从另一个角度来说框架是一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。

框架安全的,可复用的,不断升级的软件。

框架解决的问题

框架要解决的最重要的一个问题是技术整合。

框架把相关的技术融合在一起,企业开发可以集中在业务领

域方面。

另一个方面可以提供开发的效率。

JDBC编程的回顾

可以看之前总结的这篇博客。

使用JDBC编程的缺点

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

减轻使用 JDBC 的复杂性,不用编写重复的代码创建 Connetion , Statement ;

不用编写关闭资源代码。

直接使用 java 对象,表示结果数据。让开发者专注 SQL 的处理。 其他分心的工作由 MyBatis 代劳。

MyBatis 可以完成:

    注册数据库的驱动,例如
Class.forName(“com.mysql.jdbc.Driver”))

    创建 JDBC 中必须使用的 Connection , Statement, ResultSet 对象

    从 xml 中获取 sql,并执行 sql 语句,把 ResultSet 结果转换 java 对象

List list = new ArrayLsit<>();
ResultSet rs = state.executeQuery(“select * from student”);
while(rs.next){
 Student student = new Student();
 student.setName(rs.getString(“name”));
 student.setAge(rs.getInt(“age”));
 list.add(student);
}
    关闭资源
ResultSet.close() , Statement.close() , Conenection.close()
搭建MyBatis开发环境

    建表

    引入依赖【MyBatis依赖,Mysql驱动】

    创建实体类【类的属性名要与表的列名一致】【表的每一行,都可以封装为一个对象】【面向对象的思想】

    创建持久层的DAO接口

    创建sql映射文件【写sql语句的,MyBatis会执行这些sql语句】,是一个xml文件。

    一般一个表一个sql映射文件。

    创建MyBatis主配置文件,主配置文件提供了数据库的连接信息和slq映射文件的位置信息。

    一个项目就一个主配置文件。

具体搭建过程
    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;
    
    
     
     junit
     junit
     4.11
     test
    
        
     
     org.mybatis
     mybatis
     3.5.1
    
        
     
     mysql
     mysql-connector-java
     5.1.9
     
     
    
    
     
     
     src/main/java
     
     ***.xml
     
     false
     
    
    
    
    public class Student {
         //属性名和列名一样 
         private Integer id;
         private String name;
         private String email;
         private Integer age;
         // set , get , toString
    }
    
    public interface StudentDao {
         
         List selectStudents();
    }
    
    
    
     
     
     
         select id,name,email,age from student where name= #{personName} or 
         age= #{personAge}
    
    

    使用对象

    使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。

    语法格式: #{ property, javaType=java 中数据类型名, jdbcType=数据类型名称 }

    javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property 【对象的属性名】}

    按位置(了解)

    参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是#{arg0}, 第二个是#{arg1}

    注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。

    使用Map(了解)

    Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数。Map 集合使用 String的 key,

    Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值。

    例如:
    Map data = new HashMap();
    data.put(“myname”,”xxx");
    data.put(“myage”,20);
    接口方法:
    List selectMultiMap(Map map);
    mapper 文件:
    
         select count(*) from student
    
    // 测试方法:
    @Test
    public void testRetunInt(){
         int count = studentDao.countStudent();
         System.out.println("学生总人数:"+ count);
    }
    

    对象类型

    处理方法:

    MyBatis执行sql语句,然后调用类的无参构造方法,创建对象。MyBatis把ResultSet指定的列值赋值给同名的属性名。

    Map

    sql 的查询结果作为 Map 的 key 和 value。推荐使用 Map

    注意:Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录是错误。

    resultMap

    resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。

    常用在列名和 java 对象属性名不一样的情况。

    使用方式:

    1.先定义 resultMap,指定列名和属性的对应关系。

    2.在中把 resultType 替换为 resultMap。

    列名和属性名不一样的解决方案 第一 种方式:使用resultMap
    public class PrimaryStudent {
         private Integer stuId;
         private String stuName;
         private Integer stuAge;
         // set , get 方法
    }
    
     
    
         
         
         
         
         
    
    
     
    
         select id as stuId, name as stuName,age as stuAge from student 
    
    
    模糊查询like

    模糊查询的实现有两种方式, 一是 java 代码中给查询数据加上“%” ; 推荐

    二是在 mapper 文件 sql 语句的条件位置加上“%”

    方法一:

    // 需求:查询姓名有“力”的
    // 接口方法:
    List selectLikeFirst(String name);
    mapper文件:
    
         select id,name,email,age from student
         where name like "%" #{studentName} "%"
    
    // 测试方法:
    @Test
    public void testSelectLikeSecond(){
         String name="力";
         List stuList = studentDao.selectLikeSecond(name);
         stuList.forEach( stu -> System.out.println(stu));
    }
    
    动态sql

    动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查询条件进行查询。

    提交的查询条件不同,执行的 SQL 语句不同。若将每种可能的情况均逐一列出,对所有条件进行排列组合,

    将会出现大量的 SQL 语句。此时,可使用动态 SQL 来解决这样的问题

    动态 SQL 之< if >

    对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片断拼接到其所在的 SQL 语句中。
    语法:< if test=“条件” > sql 语句的部分 < /if >

    
         select id,name,email,age from student
     
         
         and name = #{name}
         
         
         and age ">> #{age}
         
     
     
    动态 SQL 之< foreach > 
    

    < foreach/>标签用于实现对于数组与集合的遍历。对其使用,需要注意:

    ➢ collection 表示要遍历的集合类型, list ,array 等。

    ➢ open、close、separator 对遍历内容的 SQL 拼接。

    语法:
    
         #{item 的值}
    
    
    遍历 **List<**简单类型>
    // 需求:查询学生 id 是 1002,1005,1006 
    // 接口方法:
    List selectStudentForList(List idList);
    // mapper 文件:
    
     	select id,name,email,age from student
     
    	 where id in
         
        	 #{stuobject.id}
         
     
    
    
    // 测试方法:
    @Test
    public void testSelectForList2() {
         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.selectStudentForList2(list);
         studentList.forEach( stu -> System.out.println(stu));
    }
    
    动态 SQL 之代码片段

    < sql/ >标签用于定义 SQL 片段,以便其它 SQL 标签复用。

    而其它标签使用该 SQL 片断,需要使用< include/ >子标签。

    该< sql/ >标签可以定义 SQL 语句中的任何部分,所以< include/ >子标签可以放在动态 SQL的任何位置。

     
    
     select id,name,email,age from student
     
    
    
    
    PageHelper

    基于 PageHelper 分页:

    实现步骤:

    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 testSelect() throws IOException {
    	// 获取第1页,3条内容。
        PageHelper.startPage(1, 3);
        List studentList = studentDao.selectSAtudents();
        studentList.forEach(stu -> System.out.println(stu));
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703082.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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