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

MyBatis学习笔记

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

MyBatis学习笔记

MyBatis 一、框架概述 1.三层架构
  • 界面层:和用户打交道,接受用户的请求参数,显示处理结果。(jsp,html,servlet)
  • 业务逻辑层:接受界面层传递的数据,计算逻辑,调用数据库,获取数据。
  • 数据访问层:就是访问数据库,执行对数据的查询,修改,删除等。

三层对应的包

  • 界面层:controller包(servlet)
  • 业务逻辑层:service包(XXXService类)
  • 数据访问层:dao包(XXXDao类)

三层中类的交互

  • 用户使用界面层→业务逻辑层→数据访问层(持久层)→数据库(mysql)

三层对应的处理框架

  • 界面层—servlet—springmvc(框架)
  • 业务逻辑层—service类—spring(框架)
  • 数据访问层—dao类—mybatis(框架)
2.框架概念
  • 被应用开发者定制的应用骨架、模板。

  • 框架是针对某一个领域有效,特长在某一个方面,比如mybatis做数据库操作。

3.mybatis框架

一个框架,早期叫ibatis,代码在github。mybatis是MyBatis SQL Mapper framework for Java(sql映射框架)

①sql mapper:sql映射

  • 可以把数据库表中的一行数据映射为一个java对象。
  • 一行数据可以看作是一个java对象。操作这个对象,就相当于操作表中的数据。

②Data Access Object(DAOs):数据访问,对数据库执行增删改查。

③mybatis提供了哪些功能:

  • 提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了

  • 提供了执行sql语句的能力,不用你执行sql

  • 提供了循环sql,把sql的结果转为java对象,List集合的能力

    while(rs.next()){
    	Student stu = new Student();
    	stu.setId(rs.getInt("id"));
    	stu.setName(rs.getString("name"));
    	stu.setAge(ts.getInt("age"));
    	//从数据库取出数据转为Student对象,封装到List集合
    	stuList.add(stu);
    }
    
  • 提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet

  • 开发人员做的是:提供sql语句。

  • 流程是:开发人员提供sql语句→mybatis处理sql→开发人员得到List集合或java对象(表中的数据)。

  • 总结:mybatis是一个sql映射框架,提供的数据库的操作能力,增强的JDBC。使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet的创建,销毁,sql的执行。

二、MyBatis框架快速入门 1.主要类的介绍

①Resources:mybatis中的一个类,负责读取主配置文件

InputStream in = Resources.getResourceAsStream(mybatis.xml);

②SqlSessionFactoryBuilder:创建SqlSessionFactory对象

 //3.创建了SqlSessionFactoryBuilder对象
 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
 //4.创建SqlSessionFactory对象
 SqlSessionFactory factory = builder.build(in);

③SqlSessionFactory:重量级对象,程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,仅需一个。

SqlSessionFactory接口,接口实现类:DefaultSqlSessionFactory

SqlSessionFactory作用:获取SqlSession对象。

//5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession
SqlSession sqlSession = factory.openSession();

openSession()方法说明:

  • openSession():无参数的,获取是非自动提交事务的SqlSession对象

  • openSession(boolean):

    • openSession(true) 获取自动提交事务的SqlSession

    • openSession(false) 非自动提交事务的SqlSession对象

④SqlSession

SqlSession接口:定义了操作数据库的方法,例如:selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()等

SelSession接口的实现类DefaultSqlSession

使用要求:SqlSession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,使用openSession()获取SqlSession()对象。在执行完sql语句后,需要关闭它,执行SqlSession.close();这样能保证线程是安全的。

三、MyBatis框架Dao代理 1.动态代理
  • 使用SqlSession.getMapper(dao接口.class)获取这个dao接口的对象。
2.传入参数
  • 从java代码中把数据传入到mapper文件的sql语句中。

①parameterType:写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型。

  • 例如StudentDao接口

    public Student selectStudentById(Integer id)
    
  • mybatis通过反射机制能够发现接口参数的数据类型,可以没有,所以一般不写。

②一个简单类型的参数:

简单类型:mybatis把java的基本数据类型和String都叫简单类型。在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}

接口:

public Student selectStudentById(Integer id)

mapper:

select id,name,email,age from student where id=#{studentid}

③多个参数,使用@Param命名参数

  • 使用 @Param(“参数名”) String name

接口:

public List selectMulitParam(@Param("myname") String name,@Param("myage") Integer age)

mapper文件:


    select id,name,email,age from student where name=#{paramName} or age=#{paramAge}

QueryParam对象:

public class QueryParam {
    private String paramName;
    private Integer paramAge;
    
    public String getParamName() {return paramName;}

    public void setParamName(String paramName) {this.paramName = paramName;}

    public Integer getParamAge() {return paramAge;}

    public void setParamAge(Integer paramAge) {this.paramAge = paramAge;}
}

⑤多个参数,按位置传参(略)

⑥多个参数,使用Map传参(略)

⑦#和$

  • #占位符

    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低。
    • 可以替换表名或者列名,你能确定数据是安全的。可以使用$。
  • #和$区别:

    • #使用?在sql语句中做占位符的,使用PreparedStatement执行sql,效率高。
    • #能够避免sql注入,更安全。
    • $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低。
    • $有sql注入的风险,缺乏安全性。
    • $:可以替换表名或者列名。
3.mybatis的输出结果
  • mybatis执行了sql语句,得到java对象。

①resultType结果类型,指sql语句执行完毕后,数据转为的java对象,java类型是任意的。

​ resultType结果类型的值:类型的全限定名称、类型的别名。例如Java.lang.Integer别名是int

处理方式:

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

②定义自定义类型的别名

  • 在mybatis主配置文件中定义,使用定义别名。
  • 可以在resultType中使用自定义别名。

③resultMap:结果映射,指定列名和java对象的属性对应关系。

  • 你自定义列值赋值给哪个属性
  • 当你的列名和属性名不一样时,一定使用resultMap
  • resultMap和resultType不可以一起使用,二选其一
四、MyBatis框架动态SQL

动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发生变化。

动态sql的实现:使用的是mybatis提供的标签,,,

①是判断条件的,

  • 语法:

    
    	部分sql语句
    
    

②用来包含多个的,当多个if有一个成立的,会自动增加一个where关键字,并去掉if中多余的and,or等。

③循环java中的数组,list集合的。主要用在sql的in语句中。

  • 学生的id是1001,1002,1003的三个学生

    select * from student where id in (1001,1002,1003)
    
    public List selectFor(List idlist)
    
    List list = new ...
    list.add(1001);
    list.add(1002);
    list.add(1003);
    
    dao.selectFor(list);
    
  • 使用foreach将list中的id值读取

    
    
    
    
    • collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
    • item:自定义的,表示数组或集合成员的变量
    • open:循环开始时的字符
    • close:循环结束时的字符
    • separator:集合成员之间的分隔符

④sql代码片段,就是复用一些语法

步骤:

  • 先定义 sql语句,表名,字段等
  • 再使用
五、MyBatis配置文件

1.数据库的属性配置文件:把数据库连接信息放到一个单独的文件中。和mybatis主配置文件分开。目的是便于修改,保存,处理多个数据库的信息。

①在resources目录中定义一个属性配置文件,xxxx.properties,例如jdbc.properties。在属性配置文件中,定义数据,格式是key=value。key:一般使用 . 做多级目录的。

例如 jdbc.mysql.driver , jdbc.driver

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql//....
jdbc.username=root
jdbc.password=123456

②在mybatis的主配置文件,使用指定文件的位置,在需要使用值的地方,${key}

2.mapper文件,使用package指定路径





        

六、扩展

PageHelper做数据分页的。

  • pom.xml中加入依赖

        
          com.github.pagehelper
          pagehelper
          5.1.10
        
    
  • 主配置文件中配置插件

    
    	
    
    
  • 使用

    //加入PageHelper的方法,分页
    //pageNum:第几页,从1开始
    //pageSize:一页中有多少行数据
    PageHelper.startPage(1,3);
    List students = dao.selectAll();
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/288011.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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