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, , 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 ?