2021-07-24

一、框架概述
1.1软件开发常用结构
1.1.1三层架构
三层架构:界面层、业务逻辑层、数据访问层(持久层)
界面层:和用户打交道,接受用户的请求参数,显示数据结果
业务逻辑层:接受了界面层传递的数据,计算逻辑,调用逻辑,获取数据
数据访问层:访问数据库,执行对数据的增删改查
三层对应的包;
界面层:controller包(servlet)
业务逻辑层:service包(XXXService类)
持久层:dao包(XXXDao类)
三层对应的处理框架:
界面层—servlet—springmvc(框架)
业务逻辑层—service类—spring(框架)
持久层—dao类—mybatis(框架)
框架是一个模板

1.1.2框架

  • 框架可以定义好一些功能,这些功能是公用的
  • 可以加入项目中自己的功能,可以利用框架中写好的功能

框架是一个半成品的软件,其特点:

  • 框架不是全能的
  • 框架是针对某一个领域,例mybatis做数据库强
  • 框架是一个软件
    1.2mybatis框架
    mybatis是MyBatis SQL Framework for java(sql映射框架)
    1)sql mapper:sql映射
    可以把数据库表中的一行数据映射为 一个java对象
    一行数据可以看作一个java对象,操作对象即操作数据库中的数据
    2)Data Access Objects(DAOs):数据访问,对数据库执行增删改查
    mybatis提供的功能:
  • 提供Connection,Statement,ResultSet的能力
  • 提供执行sql语言的能力
  • 提供循环sql,把sql结果转换为java对象List集合能力
  • 提供关闭资源的能力

开发人员的责任:提供sql语句

总结:
mybatis是一个sql映射框架,提供的数据库的操作功能,增强的JDBC使用mybatis让开发人员集中精神写sql语言

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

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

2)SqlSessionFactoryBuilder:创建SqlSessionFactory对象

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

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

SqlSessionFcatory:接口 接口的实现类:DeFaultSqlsessionFactory
作用:获取SqlSession对象

  SqlSession sqlSession = factory.openSession();

openSession()方法说明 :

  1. openSession():无参数的,获取的是非自动提交事务的SqlSession对象
  2. openSession(boolean):openSession(true) 获取自动提交事务的SqlSession

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

使用要求:SqlSession对象不是线程安全的,需在方法内部使用,在执行sql语句之前,使用openSqlSession()获取SqlSession对象,在执行sql语句之后需要关闭它,执行SqlSession.close(),即线程安全

三、
1.动态代理:使用SqlSession.getClass(dao接口.class) 获取这个dao接口的对象
2.传入参数:从java代码中把数据传入到mapper文件中的sql语句中
1)parameterType:写在mapper文件的一个属性,表示dao接口中方法的参数的数据类型
例:StudentDao接口:

 public Student selectStudentById(Integer id)
   mapper:
 select * from Student where id = #{id}

2)一个简单类型的参数:
简单类型:mybatis把java的基本数据类型和String都叫简单类型
在mapper文件中获取简单类型第一个参数的值,使用#{任意字符}
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}
   </selcet>

4)多个参数,使用java对象
语法:#{属性名}
vo:value object,放一些存储数据的类。比如说:提交请求参数,name,age,现在想把name,age传给一个service
pojo:普通的有set,get方法的java类,普通的java对象
Servlet — StudentService(addStudent(MyParam param))
entity(domain域):实体类,和数据库中的表对应一致
3.两个占位符(#,$)
#:告诉mybatis使用实际的参数值传递,并使用PrepareStatement对象执行sql语句,#{…}代替sql语句中的?,更安全,更迅速
$:字符串替换,告诉mybatis使用 $包含的"字符串"替换所在的位置
例:

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

#和$的区别:

1.#使用 ?zaisql语句中作占位的,使用PrepareStatement对象执行sql效率高

2.#能避免sql注入,更安全

3.$不适用占位符,是字符串连接的方式,内部使用Statement对象执行效率低

4.$有sql注入风险,缺乏安全性

5.$可以替换表名和列名

4.封装mybatis输出结果
mybatis执行了sql语句,得到的java对象
1)resultType结果类型 指sql语句执行完毕以后,数据转为java对象,java类型是任意的
resultType结果类型的值:1.类型的全限定名称 2.类型的别名
处理方式:
1.mybatis执行的sql语句,然后mybatis调用类的无参数构造方法,创建对象
2.mybatis把resultSet指定为列值付给同名的属性
2)定义自定义类型的别名
2.1在mybatis主配置文件中定义,使用定义别名
2.2可以在resultType中使用自定义的别名

第一种方式:
可以指定一个类型一个自定义别名
type:自定义类型的全限定名称
alias:别名
例:<typeAlias type="com.bjpowernode.domin.Student" alias="stu"/>
第二种方式:
name是包名,这个包中的所有类,类名就是别名(类名不区分大小写)
例:<package name="com.bjpowernode.domin"/>

3)resultMap:结果映射,指定列名和java对象的属性对应关系的
3.1自定义列值赋值给哪个属性
3.2当列名和属性名不一致时,一定使用resultMap
resultMap和resultTyppe不一起使用,二选一
4)列名和属性名不同的两种处理方式

方式一:使用resultMap

例:

 <resultMap id="myStudentMap" type="com.bjpowernode.domin.MyStudent">
        <!--定义列名和java属性的关系-->
        <!--主键列,使用id标签
            column:列名
            property:java类型的属性名
        -->
        <id column="id" property="stuid"/>
        <!--非主键列,使用result-->
        <result column="name" property="stuname"/>
        <result column="email" property="stuemail"/>
        <result column="age" property="stuage"/>
    </resultMap>
    <!--列名和属性名不一样:方式一-->
    <select id="selectMyStudent" resultMap="myStudentMap">
        select * from Student
    </select>

方式二: resultType的默认原则:同名的列值赋值给同名的属性,使用列别名(java对象对应的属性名)

例:

<select id="selectDiffColProperty" resultType="com.bjpowernode.domin.MyStudent">
        select id as stuid,name as stuname,email as stuemail,age as stuage from Student
</select>

5)模糊like
第一种like,java代码中指定like的内容
例:

//mapper文件中:
<select id="selectLikeOne" resultType="com.bjpowernode.domin.Student">
        select * from Student where name like #{name}
</select>
//测试类:
@Test
public void testselectLikeOne(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
        String name = "%李%";
        List<Student> students = mapper.selectLikeOne(name);
        for(Student st : students){
            System.out.println(st);
        }
        sqlSession.close();
}

第二种like,在mapper文件中拼接like的内容
例:

//mapper文件中:
<select id="selectLikeTwo" resultType="com.bjpowernode.domin.Student">
        select * from Student where name like "%" #{name} "%"
</select>
//测试类:
 @Test
 public void testselectLikeTwo(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
        String name = "李";
        List<Student> students = mapper.selectLikeTwo(name);
        for(Student st : students){
            System.out.println(st);
        }
        sqlSession.close();
}

四、动态sql
动态sql:sql内容是变化的,可以根据条件获取到不同的sql语句主要是where部分发生变化
动态sql的实现,使用的是mybatis提供的标签,<if>,<where>,<foreach>
1)<if>是判断条件的

//语法:
 <if test = "判断java对象的属性值">
     //部分sql语句
 </if>

2)<where>用来包含多个<if>的,当多个if有一个成立,<where>会自动增加一个where关键字,并去掉if中多余的and,or等
3)<foreach>循环java中的数组,list集合的,主要是sql的in语句中
例:

 //学生id是1001,1001,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);
 //mapper文件:
 <!--foreach使用1List<Integer>-->
 <select id="selectForeachOne" resultType="com.bjpowernode.domin.Student">
        select * from Student where id in
        /**
        *collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
        item:自定义的,表示数组和集合的成员的变量
        open:循环开始的字符
        close:循环结束时的字符
        sepatator:集合成员之间的分隔符
        */
        <foreach collection="" item="" open="" close="">
            #{xxx}                        
        </foreach>
</select>

4)sql代码片段用来复用一些语法
步骤:

  1. 先定义<sql id="自定义名称唯一 "> sql语句,表名,字段等 </sql>
  2. 在使用 <include refid = "id的值">

五、
1.数据库的属性配置文件:把数据库连接信息放到一个单独的文件中,和mybatis主配置文件分开,目的便于修改,保存,处理多个数据库信息
1)在resources目录中定义一个属性配置文件,xxx.properties 例如:jdbc.properties,在属性配置文件中,定义数据,格式是key=value
key一般使用.做多级目录,例如:jdbc.mysql.driver
2)在mybatis的主配置文件,使用<properties>指定文件的位置,在需要使用值得地方${key}
2.mapper文件,使用package指定路径

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

六、PageHelper
PageHelper做数据分页

//1.加入maven依赖
<!--PageHelper依赖-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.10</version>
      <scope>test</scope>
    </dependency>
//2.在mybatis主配置文件中加入plugin
<plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
//3.查询方法之前,加入PageHelper方法调用
PageHelper.startPage(1,2);
List<Student> students = mapper.selectAll();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值