MyBatis笔记


第一章

一、

三层架构

  1. 界面层: 和用户打交道的, 接收用户的请求参数, 显示处理结果的。(jsp ,html ,servlet。前两个是发送请求参数,后边的是接收请求参数)
  2. 业务逻辑层: 接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
  3. 数据访问层: 就是访问数据库, 执行对数据的查询,修改,删除等等的。

三层对应的包

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

三层中类的交互

  • 用户使用界面层(发送请求)—> 业务逻辑层(进行访问)—>数据访问层(持久层)(拿数据)—>数据库(mysql)
  • 用户使用界面层<—(在业务逻辑层加工数据后返回给)业务逻辑层<—(返回给)数据访问层(持久层)<—(数据返回给)数据库(mysql)

三层对应的处理框架

  • 界面层—servlet—springmvc(框架)
  • 业务逻辑层—service类–spring(框架)
  • 数据访问层—dao类–mybatis(框架)

二、

框架

框架是一个舞台, 一个模版

模版

  1. 规定了好一些条款,内容
  2. 加入自己的东西

框架是一个模块

  1. 框架中定义好了一些功能。这些功能是可用的。
  2. 可以加入项目中自己的功能, 这些功能可以利用框架中写好的功能。

框架是一个软件,半成品的软件,定义好了一些基础功能, 需要加入你的功能就是完整的。

基础功能是可重复使用的,可升级的。

框架特点:

  1. 框架一般不是全能的, 不能做所有事情
  2. 框架是针对某一个领域有效。 特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。
  3. 框架是一个软件

使用 JDBC 的缺陷

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

mybatis提供了哪些功能

  1. 提供了创建Connection ,Statement, ResultSet的能力 ,不用开发人员创建这些对象了
  2. 提供了执行sql语句的能力, 不用你执行sql
  3. 提供了循环sql, 把sql的结果转为java对象, List集合的能力
//以下都不用写,都可以通过框架调用完成
  while (rs.next()) {
		Student stu = new Student();
		stu.setId(rs.getInt("id"));
		stu.setName(rs.getString("name"));
		stu.setAge(rs.getInt("age"));
		//从数据库取出数据转为 Student 对象,封装到 List 集合
		stuList.add(stu);
	  }
  1. 提供了关闭资源的能力,不用你关闭Connection, Statement, ResultSet

开发人员做的是: 提供sql语句
最后是: 开发人员提供sql语句–mybatis处理sql—开发人员得到List集合或java对象(表中的数据)

总结

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

第一个入门的mybatis例子

项目:D:\LABORATORY\MyBatis\学习\1-student

实现步骤:
1.新建的student表
2.加入maven的mybatis坐标,mysql驱动的坐标
3.创建实体类,student--保存表中一行数据的
4.创建持久层的dao接口,定义操作数据库的方法
5.创建一个mybatis使用的配置文件   
  叫做sql映射文件:写sql语句的。
               一般一个表一个sql映射文件。这个文件是xml文件。   
               (1)在接口的所有目录中   (2)文件名和接口保持一致
6.创建mybatis的主配置文件:
    一个项目就一个主配置文件。
    主配置文件提供了数据库的连接信息和sql映射文件的位置信息
7.创建使用mybatis类,通过mybatis访问数据库

报错!!!!!!!注意

  1. 路径,鼠标划过去一定要有显示内容,否则需要重新输入,最好使用软件提示;
  2. mybatis.xml文件中,注意如下语句
 1)<mapper resource="com\cen\dao\studentDao.xml"/>
 2)<property name="url" value="jdbc:mysql://localhost:3306/school?characterEncoding=UTF8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
 小心把false写成flase!!!!!
 3)检查密码用户名
 4)<environments default="mydev">  注意其使用哪一个部分
  1. studentDao.xml中
注意路径
1)<mapper namespace="com.cen.dao.studentDao">
2)<select id="selectStudents" resultType="com.cen.domain.student" >
  1. main部分
1) //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)
    String config="mybatis.xml";
2) //6.【重要】指定要执行的sql语句的标识。  sql映射文件中的namespace + "." + 标签的id值
   //String sqlId = "com.bjpowernode.dao.StudentDao" + "." + "selectStudents";
  String sqlId = "com.cen.dao.studentDao"+"."+"selectStudents";
  1. 注意各种包名不要写错
  2. pom.xml文件中,注意使用的版本号

插入数据库
1.改写接口
2.改写sql语句
3.改写主函数的方法,注意添加提交事务,因为mybatis不会自动提交

第二章

项目:D:\LABORATORY\MyBatis\学习\2-mybatis-dao

主要类的介绍

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

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

2)SqlSessionFactoryBuilder : 创建SqlSessionFactory对象

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

3)SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。
在整个项目中,有一个就够用了。

//SqlSessionFactory是接口 
//该接口实现类:DefaultSqlSessionFactory
//SqlSessionFactory作用: 获取SqlSession对象。
SqlSession sqlSession = factory.openSession();
//openSession()方法说明:
	//1. openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
	//2. openSession(boolean): 
		   //openSession(true)  获取自动提交事务的SqlSession. 
           //openSession(false)  非自动提交事务的SqlSession对象

4)SqlSession:
SqlSession是接口 :定义了操作数据的方法
例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()
SqlSession接口的实现类DefaultSqlSession。

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

第三章

1. 动态代理

使用SqlSession.getMapper(dao接口.class) 获取这个dao接口的对象

项目:D:\LABORATORY\MyBatis\学习\3-mybatis-dao -proxy

2. 传入参数

从java代码中把数据传入到mapper文件的sql语句中。

项目:D:\LABORATORY\MyBatis\学习\4-mybatis-param

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

例如StudentDao接口
	  public Student  selectStudentById(Integer id); 

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

接口部分:public Student  selectStudentById(Integer id); 
mapper文件: select `id`,`name`, `email`,`age` from student where `id`=#{studentId}

(3) 多个参数,使用@Param命名参数(掌握)

接口部分: public List<Student> selectMulitParam(@Param("myname") String name, @Param("myage") Integer age)
	  使用  @Param("参数名")  String name 

mapper文件:
	     <select>
             select * from student where name=#{myname} or age=#{myage}
		  </select>

(4) 多个参数,使用java对象(了解)
语法 #{属性名}

vo: value object , 放一些存储数据的类。比如说 提交请求参数, name ,age
现在想把name ,age 传给一个service 类。

vo: view object , 从servlet把数据返回给浏览器使用的类,表示显示结果的类。

pojo: 普通的有set, get方法的java类。 普通的java对象

Servlet — StudentService( addStudent( MyParam param) )

entity(domain域): 实体类, 和数据库中的表对应的类,

 多个参数,使用java对象的属性值,作为参数实际值
         使用对象语法:#{属性名,javaType=类型名称,jdbcType=数据类型}很少用。
         javaType:指java中的属性数据类型。
         jdbcType:在数据库中的数据类型。
         
例如: select `id`,`name`,`email`,`age` from stu where name=#{Pname,javaType=java.lang.String,jdbcType=VARCHAR}
                                                      or age=#{Page,javaType=java.lang.Integer,jdbcType=INTEGER}

我们使用的简化方式:#{属性名},javaType,jdbcType的值mybatis反射能获取。不用提供
 多个参数-简单类型的,按位置传值,
     * mybatis.3.4之前,使用 #{0} ,#{1}
     * mybatis。3.4之后 ,使用 #{arg0} ,#{arg1}
多个参数,使用Map存放多个值

(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、 $:可以替换表名或者列名

3.mybatis的输出结果

mybatis执行了sql语句,得到java对象。

(1)resultType结果类型, 指sql语句执行完毕后, 数据转为的java对象, java类型是任意的。
resultType结果类型的它值 1. 类型的全限定名称 2. 类型的别名, 例如 java.lang.Integer别名是int

    处理方式:
	   1. mybatis执行sql语句, 然后mybatis调用类的无参数构造方法,创建对象。
		2. mybatis把ResultSet指定列值付给同名的属性。


		<select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
      select id,name, email,age from student
    </select>

	  对等的jdbc
	  ResultSet rs = executeQuery(" select id,name, email,age from student" )
	  while(rs.next()){
           Student  student = new Student();
				student.setId(rs.getInt("id"));
				student.setName(rs.getString("name"))
	  }

(2) 定义自定义类型的别名

1)在mybatis主配置文件中定义,使< typeAlias >定义别名
2)可以在resultType中使用自定义别名

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

1)你自定义列值赋值给哪个属性
2)当你的列名和属性名不一样时,一定使用resultMap

resultMap和resultType不要一起用,二选一

第四章动态sql

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

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

(1)< if >

是判断条件的,
语法

	<if test="判断java对象的属性值">
            部分sql语句
	</if>
	<select id="selectStudentIf" resultType="com.cen.domain.Student">
        select id,name,email,age from stu
        where
        <if test="name != null and name != ''">
            name=#{name}
        </if>
        <if test="age > 0">
            and age > #{age}
        </if>
        <!-- 以上相当于name = ? age > ?  。
            #{}为在主函数填入的判断数据  -->
        <!-- 同时应在where后加上一个式子例如id>0,以便假若使用or 第一个条件不满足,接下来的也可以连接的上
                  where 1==1
        <if test="name != null and name != ''">
            name=#{name}
        </if>
        <if test="age > 0">
            or age > #{age}
        </if>

          -->
        <!--  当符合<if test="">的条件时,where后边就跟着<if></if>中间的语句,
        因此之后除了第一个条件后的每一句都是跟在where后边,所以需要加一个and连接-->
	</select>

(2)< where >

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

 <!--  where:<where><if></if><if></if>...</where>
        可以解决<if>标签的缺陷
    -->
    <select id="selectStudentWhere" resultType="com.cen.domain.Student">
        select id,name,email,age from stu
        <where>
            <if test="name != null and name != ''">
                name=#{name}
            </if>
            <if test="age > 0">
                or age > #{age}
            </if>
        </where>
    </select>

(3)< foreach >

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

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

	 select * from student where id in (1001,1002,1003)

	 public List<Student> selectFor(List<Integer> idlist)

	 List<Integer> list = new ...
	 list.add(1001);
	 list.add(1002);
	 list.add(1003);

	 dao.selectFor(list)


	 <foreach collection="" item="" open="" close="" separator="">
             #{xxx}
    </foreach>

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

4)sql代码片段, 就是复用一些语法
步骤
1.先定义 < sql id=“自定义名称唯一”> sql语句, 表名,字段等 < /sql>
2.再使用, < include refid=“id的值” />

第五章

1.数据库的属性配置文件:

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

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

例如 
jdbc.mysql.driver, 
jdbc.driver, mydriver 	 
jdbc.driver=com.mysql.jdbc.Driver 	  
jdbc.url=jdbc:mysql//..... 	 
jdbc.username=root
jdbc.password=123456

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

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

 <mappers>

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

和主配置文件放在同一个目录下
在这里插入图片描述

第六章:PageHelper

PageHelper做数据分页的。是一个小功能组件,不属于mybatis框架

在主配置文件中mybatis:

  <!--配置插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor" />
    </plugins>
<environments 。。。

在pom.xml中

   <!--PageHelper依赖-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.10</version>
    </dependency>

在mapper中

   <!--查询所有-->
    <select id="selectAll" resultType="com.bjpowernode.domain.Student">
        select * from student order by id
    </select>

在主函数中

 @Test
    public void testSelectAllPageHelper(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao  =  sqlSession.getMapper(StudentDao.class);
        //加入PageHelper的方法,分页
        // pageNum: 第几页, 从1开始
        // pageSize: 一页中有多少行数据
        PageHelper.startPage(1,3);
        List<Student> students = dao.selectAll();
        for(Student stu:students){
            System.out.println("foreach--one ==="+stu);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值