zoukankan      html  css  js  c++  java
  • mybatis框架

    1.三层架构:
        1.视图层:主要功能是接受用户的数据,显示请求的处理结果,使用web页面和用户交互;可以理解为(JSP,HTML,servlet等等...)
        2.业务逻辑层:接收表示传递过来的数据,进行业务逻辑,调用数据访问层获取数据
        3.数据访问层:就是访问数据库

    2.三层对应的包
        1.视图层:controller(servlet)
        2.业务逻辑层:service包(XXXService类)
        3.数据访问层:dao包(XXXDao类)

    3.三层中类的交互
        用户使用界面层--》业务逻辑层--》数据访问层--》数据库(MySQL)

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

    5.框架
        1.框架是一个舞台,一个模板,规定了一些条款和内容,可以加入自己的东西
        2.框架是一个半成品的软件,定义好了一些基础功能,需要加入你的功能才完整,基础功能是可重复利用的,可升级的
        3.特点;1)框架一般不是全能的,不能做所有事情 2)是针对某一个领域,特长是在某一个方面,比如mybatis做数据库操作厉害,但是不能做其他的; 3)是一个软件

    6.mybatis的定义:
        一个框架,早期叫ibatis,代码在GitHub,mybatis是mybatis SQL Framework forJava(sql映射框架)
        1)sql mapper:sql映射--》可以把数据库表中一行数据,映射为一个Java对象,一行数据可以看作是一个Java对象,操作这个对象,就相当于操作表中的数据
        2)data Access Object(数据访问)--》对数据库执行增删改查

    7.mybatis提供的功能;
        1.提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建
        2.提供了执行sql语句的能力,不用你执行
        3.提供了循环sql,把sql的结果转为Java对象,list集合的能力
        4.提供了关闭资源的能力

    8.开发人员做的事情;提供sql语句
    最后是:开发人员提供sql语句--》mybatis处理sql--.开发人员得到list集合或Java对象(表中的数据)

    9.总结:mybatis是一个sql映射框架,提供的数据库的操作能力,增强的jdbc,使用mybatis让开发人员集中精力写sql就行,不必关心connection,statement...等等的创建,烧毁等等;

    10.动态代理:使用SqlSession.getMapper(dao接口.class)获取这个接口的对象

    11.传入参数;从Java代码中传入到mapper文件的sql语句中。
        1.parameterType;写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型
        例如;StudentDao接口中;
            public Student selectStudentById(Integer id)

    12.在mybatis中获取简单类型的参数的值:#{占位字符}
    简单类型:mybatis把Java的基本数据类型和String都叫做简单类型;
    例如:在接口中;public Student selectStudentById(Integer id);
    在mapper中;select id,name,email,age from student where id=#{id}

    原理;使用#{占位字符}后,mybatis使用sql是使用jdbc中的PreparedStatement对象
        1.mybatis创建connection对象,PreparedStatement对象
        String sql=........;
        PreparedStatement pst=conn.PreparedStatement();....
        执行sql封装成resultType="com.bjpowernode.entity.Student"指定的类型;

    13.多个参数的传递方法一;
        在dao接口中 public List<Student> selectMultipleParam(@Param("myname")String name, @Param("myage")Integer age);
        在mapper文件中  select id,name,email,age from student where name=#{myname} or age=#{myage}

    多个参数传递方法二;使用Java对象 语法;#{参数名,javaType=全限定名称,jdbcType=全限定名称}  或者#{参数名}
        1.创建一个存储数据的类,
        2.类中的属性名和我们要传递的参数名对应
        3.在dao接口中只要传递这个类的对象
        4.在mapper文件中,参数名对应这个类的属性名;

    多个参数传递方法三;使用参数的位置   语法:在mybatis3.4之前,使用#{0},#{1}和表示第一个和第二个参数
                                在mybatis3.4以后,使用#{arg0},#{arg1}表示;
        在接口中;public List<Student> selectMultiplePosition(String name,Integer age);
        在mapper中; select id,name,email,age from student where name=#{0} or age=#{1}

    14.包的区别
    vo;value object,放一些存储数据的类,比如说:提交请求参数,name,age,现在想把name,age传给一个service类。
    projo:普通的有set  get方法的Java类,普通的Java对象
    entity(domain);实体类,和数据库中的表对应的类;

    15.占位符的区别
        #;告诉mybatis使用实际的参数值代替,并使用preparedStatement执行sql语句,#{...}代替的是sql的?
        优点是避免了sql注入,安全,效率高;
             select id,name,email,age from student where name=#{0} or age=#{1}
        执行后的代码:select id,name,email,age from student where name=? or age=?

        $;可以替换表名或者列名,确认数据是安全,可以使用$,不使用占位符,是字符串连接的方式;使用的是Statement对象执行sql,效率比上面低,安全性不高;
            select id,name,email,age from student where id=${id}
        执行后的代码;select id,name,email,age from student where id=1002

    16.mybatis的输出结果:mybatis执行sql语句得到的Java对象
        1.resultType结果类型:只sql语句执行完后,数据转为的Java对象
         处理方式;1.mybatis执行完sql语句,然后mybatis调用类的无参构造方法创建对象
        2.mybatis会把resultSet指定列值赋给同名属性
        3.resultType中填写mybatis执行sql返回的类型,可以是全限定名称(最好用,建议用),还可以是别名
        例如:resultType("java.lang.Ingeter") 或者resultType("int")

    17.设置自定义类型的别名;
        方式一:在mybatis的主配置文件中, <typeAliases>
            <typeAlias type="com.bjpowernode.entity.Student" alias="Student" />
                            </typeAliases>

        方式二: <typeAliases>
           <package name="com.bjpowernode.entity"/>  意思为在这个包下所有类的别名都是类名;
                </typeAliases>

    18.返回map类型
        1.列名是map的key,列值是map的value
        2.只能返回一行数据,否则报错
    例如:在mapper文件中   select id,name,email,age from student where id=#{id}
    执行结果  map==={name=lisi, id=1001, email=lisi@qq.com, age=20}
        
            resultMap:结果映射  指定列名和Java对象的属性对应关系
        1.你自定义列值赋值给哪个属性
        2.当你的列名和属性名不一样时,一定要使用resultMap来指定
        3.resultType和resultMap不要一起用

    <!--列名和属性名不一样时第一种方式 使用resultMap-->
    <!--列名和属性名不一样时第二种方式 使用resultType  列别名

     19.like模糊查询
        1.方式一  在Java代码中写like的值
    mapper   select id,name,email,age from student where name like #{name}
    测试方法中  String name="%li%";     List<Student> li=studao.selectLikeone1(name);

        2.方式二  在mapper中拼接like
    mapper  select id,name,email,age from student where name like "%"+#{name}+"%"
    测试方式中  String name="li";    List<Student> li=studao.selectLikeone1(name);


    20,动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化
        1.动态sql的实现,使用的是mybatis提供的标签:<if> <where> <foreach>
         2.<if>是判断条件的
        语法<if test="判断Java对象的属性值">部分sql</if>



        3.<where>用来包含多个<if>,当多个if有一个成立的,<where>会自动增加一个where关键字并去掉if中多余的and or等;
        4.<foreach>循环Java中的数组,list集合的,主要用在sql的in语句中
        学生ID是1001,1002,1003的三个学生
        select * from student where id in(1001,1002,1003)
        语法;<foreach collection="")"  item="" open="(" separator=",">
                       #{stu.id}
                 </foreach>
    这里collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list;item:自定义的,表示数组和集合成员的变量,open是循环开始的字符,close是循环结束的字符;

    21.sql代码片段:复用语句,使用步骤;
        1.先使用<sql id="自定义名称">sql片段</sql>
        2.再使用<include refid="ID的值"/>

    22.数据库的属性配置文件;把数据库连接信息放在一个单独的文件中,和mybatis主配置文件分开。目的是便于 修改,保存,处理多个数据库的信息。
        1.在resources目录中定义一个属性配置文件,xxx.properties  格式为 key=value  这里的key一般使用多级目录,便于区分;
            jdbc.driver=com.mysql.jdbc.Driver
            jdbc.url=jdbc:mysql://localhost:3306/bjpowernode
            jdbc.password=wsacpc980
            jdbc.user=root

        2.在mybatis的主配置文件中使用<property>指定文件的位置,在需要使用的地方  ${key}


    23.在mybatis主配置文件中指定mapper文件的位置;
        1.第一种方式比较笨,都一个一个写;
        2.第二种方式,使用包名<package name="包名的全限定名称"/>
    注意:使用第二种方式的前提条件;mapper文件名称需要和接口名称一样,mapper文件需要和dao接口在同级目录;

    24.pageHelper:做数据分页的
    使用步骤:1.在maven中加入它的依赖  2.在mybatis的主配置文件中加入它的插件(注意加入的位置有要求) 3.在Java代码中执行;
    原理:在执行时在sql后面加上limit ?
        










  • 相关阅读:
    CentOS 7 虚拟机的安装
    2 MySQL rpm
    01-在实体类上加了lombok的@Data注解
    02-myBatisPlus的wrapper接口的使用
    2 MySQL rpm 安装 --下载
    1-MySQL介绍
    MySQL的不归路
    电脑型号4 1500 内存大 机械大硬盘
    电脑型号3 1200 大硬盘
    电脑概览 2 1200 固态SSD
  • 原文地址:https://www.cnblogs.com/1877chl/p/13379387.html
Copyright © 2011-2022 走看看