Mybatis(框架)

Mybatis框架

第一章 框架的概述

1.三层架构

mvc:web开发中,使用mvc架构模式 m:数据 v:视图 c:控制器

c:控制器:接收请求,调用service对象,显示请求的处理结果,当前使用servlet作为控制器

v:视图:现在使用jsp,html,css,js。显示请求的处理结果,把m中数据显示出来

m:数据:来自数据库mysql,来自文件,来自网络

mvc作用:

  • 实现解耦合
  • 让mvc各司其职
  • 让系统扩展更好,更容易维护

三层架构:

1.界面层(视图层):接收用户的请求,调用service,显示请求的处理结果。包含了jsp,html,servlet等对象。界面层是直接和用户打交道的。一般放在controller包下面

2.业务逻辑层:真正的处理业务逻辑,使用算法处理数据的,将数据返回给界面层,对应的是service包,和包中的很多的xxxservice类,StudentService一般放在service包下面的。

3.持久层(数据库访问层):访问数据库,或者去读文件,访问网络。获取数据,对应的包是dao.dao包中很多的studentDao,…

2.三层架构请求的处理流程

用户发起请求-》界面层–》业务逻辑–》持久层–》数据库(mysql)

3.为什么用三层?

  1. 结构清晰、耦合度低,各层分工明确
  2. 可维护性高,可扩展性高
  3. 有利于标准化
  4. 开发人员可以只关注整个结构中的某一层的功能实现
  5. 有利于各层逻辑的复用

4.三层架构模式和框架

每一层对应着一个框架

1.界面层:springmvc框架

2.业务层:spring框架

3.持久层:mybatis框架

5.mybatis框架介绍

mybatis是一个优秀的基于java的持久层框架,内部封装了jdbc,开发者只需要关注sql语句本身,而不需要处理加载驱动,创建连接,创建statement.关闭连接

框架:

1.什么是框架?

框架:就是一个软件,完成了部分的功能。软件中的类和类之间的方法调用都已经规定好了。通过这些完成某些功能。框架看作就是模板。

框架就是起到一个辅助功能,实现你需要的功能。

框架是可以升级和改造的,框架是安全的。

框架中一般都是一些常用的功能,框架帮你实现的,对某一方面是有用的,不是全能的。

6.框架可以解决什么问题?

1.框架可以实现技术的整合。

反射类似于透视,看透类中的内部。

框架可以降低难度。

2.框架能够提高开发的效率,降低难度

7.JDBC访问数据库的优缺点

优点:

1.代码直观,好理解

缺点:

1.创建很多的对象,connection,statement,resultset

2.注册驱动

3.执行sql语句

4.把resultset转为student,list集合

5.关闭资源

6.sql语句和处理业务逻辑混在一起

8.mybatis框架概述

什么是mybatis:是一个持久层框架,原名是ibatis,2013改名为mybatis.可以操作数据库,对数据执行增删改查。看作是高级的jdbc,解决jdbc的缺点

mybatis能做什么?

1.注册驱动

2.创建jdbc中使用的connection ,statement ,resultset

3.执行sql语句, 得到resultset

4.处理resultset,把记录集中的数据转为java对象,溶蚀环能把java对象放入到list集合中

5.关闭资源

6.实现sql语句和java代码的解耦合

第二章mybatis框架快速入门

访问官网:https://mybatis.net.cn/

https://mybatis.net.cn/getting-started.html

2.1第一个例子

实现步骤

0.创建student表(id,name,email,age)

1.新建maven项目

2.修改pom.xml

(1)加入以来mybatis以来,mysql驱动,junit

(2)在build加入资源插件

3.创建实体类studnet,定义属性,属性名和列明保持一致

4.创建dao接口,定义操作数据库的方法

5.传教概念xml文件(mapper文件),写sql语句。

mybatis框架推荐是把sql语句和java代码分开

mapper文件:定义和dao接口在同一目录,一个表一个mapper文件。

6.创建mybatis的朱配置文件(xml文件)

(1)定义创建来凝结实例的数据源(datasource)对象

(2)指定其他mapper文件的位置

7.测试mybatis,创建测试的内容

使用main方法,测试mybatis访问数据库

也可以使用junit访问数据库

把重复的代码封装起来:

工具类:

package com.zd.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * @ Author: ZhangDong
 * @ Date: Created in 15:58 2021/11/20
 */
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }
}

mapper.xml文件中:

<select id="getUserById" parameterType="int" resultType="com.zd.pojo.User">
        select * from user where id = #{id}
    </select>

#为占位符,可以设置要输入的查询数据 

添加日志功能:

<settings>
<!--    标准的日志工厂实现-->
    <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
    <setting name="logImpl" value="LOG4J"/>
</settings>

log4j.properties文件:

### set log levels ###
log4j.rootLogger = INFO , console , debug , error 

### console ###
log4j.appender.console = org.apache.log4j.ConsoleAppender 
log4j.appender.console.Target = System.out 
log4j.appender.console.layout = org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n 

### log file ###
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.debug.File = ../logs/springmvc-demo.log 
log4j.appender.debug.Append = true 
log4j.appender.debug.Threshold = INFO 
log4j.appender.debug.layout = org.apache.log4j.PatternLayout 
log4j.appender.debug.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n 

### exception ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.error.File = ../logs/springmvc-demo_error.log 
log4j.appender.error.Append = true 
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.layout = org.apache.log4j.PatternLayout 
log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n 


###需要声明,然后下方才可以使druid sql输出,否则会抛出log4j.error.key not found
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %l %c%n%p: %m%n 

### druid sql ###
log4j.logger.druid.sql=warn,stdout 
log4j.logger.druid.sql.DataSource=warn,stdout 
log4j.logger.druid.sql.Connection=warn,stdout 
log4j.logger.druid.sql.Statement=warn,stdout 
log4j.logger.druid.sql.ResultSet=warn,stdout 

2.2概念

自动提交:当你的sql语句执行完毕后,提交事务,数据库更新操作之间保存数据

手动提交事务: 在你需要提交事务的位置,执行方法,提交事务或者回滚事务

解决mybatis中xml文件indea没有传入到targert文件中,

解决办法:

1.idea中build点击第二个,重新构建一下你的项目

2.pom文件,maven刷新一下。,maven里clean一下

3.把需要的文件拷贝进来也可以

添加数据的时候需要,提交事务才可以完成添加数据

2.3mybatis的一些重要对象

1.resources:mybatis框架中的对象,一个作用读取主配置信息

String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);

2.SqlSessionFactoryBuilder:负责创建sessionfactory对象

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

3.SqlSessionFactory:重要对象

SqlSessionFactory是重量级对象:创建此对象需要使用更多的资源和时间。

SqlSessionFactory接口:作用是SqlSession的工厂,就是创建SqlSession对象。

DefaultSqlSessionFactory实现类:

public class DefaultSqlSessionFactory implements SqlSessionFactory{}

SqlSessionFactory接口中的方法:

openSession():获取一个默认的SqlSession对象,默认是需要手工提交事务的

openSession(boolean参数表示是否自动提交事务)

​ true:创建一个自动提交事务的SqlSession

​ false:等同于没有参数的openSession

把这些固定的语句,都封装到Mybatis工具类中

selectone  用法这个是只能查询一个数据,查询多条数据就会报错	
selectlist:执行sql语句可以返回多条语句
selectmap:执行sql语句的得到一个map结果
insert:执行insert语句
update:执行update语句
delete:执行delete语句
commit:提交事务
rollback:回滚事务

注意:sqlsessionfactory对象不是线程安全的,使用步骤:

1.在方法的内部执行sql语句之前,先获取sqlsession的对象

2.去调用sqlsession的方法,执行sql语句

3.关闭sqlsession对象,执行sqlsession.close()

2.4使用工具类和模板

1.创建模板:mapper文件模板和mybatis主配置文件模板

创建模板的步骤:

第三章 dao代理

3.1mybatis提供代理:

mybatis创建dao接口的实现类对象,完成对sql语句的执行。mybatis创建一个对象代替你的dao实现类功能。

3.1.2使用mybatis代理要求:

1.mapper文件中的namespace一定dao接口的全限定名称

2.mapper文件中标签的id是dao接口方法

3.1.3mabatis代理实现方式

使用sqlsession对象的方法 getMapper(dao.class)

3.2理解参数

理解参数是:通过java程序把数据传入到mapper文件中的sql语句

3.2.1 parameterType

parameterType:表示参数的类型,指定dao方法的形参数据类型,这个形参的数据类型是给mybatis使用。mybatis在给sql语句的参数赋值使用,parameterType.setxxx(位置,值)

parameterType:mybatis通过反射机制可以获取dao接口方法参数的类型,可以不写
<select id="getUserById" parameterType="int" resultType="com.zd.pojo.User">
        select * from user where id = #{id}
    </select>
3.2.2dao接口方法是一个简单类型的参数
dao接口的方法形参是一个简单类型
Student selectByEmail(String email)

dao接口是一个简单类型的参数
mapper文件,获取这个参数值,使用#{任意字符}
<!--    select查询语句-->
    <select id="getUserList" resultType="user">
        select * from user
    </select>
3.2.3dao接口方法有多个简单类型的参数

@param:命名参数,在方法的形参面前使用的,定义参数名。这个名称可以用在mapper文件中。

多个简单类型的参数
    使用@Mapper命名参数,注解是mybatis提供的
    位置:在形参定义的前面
    属性;value自定义的参数名称
        @param("myname")String name

mapper文件

多个简单类型的参数
当使用@param命名后,例如@param("myname")
zaimapper中,使用#{myname}
<select id="getUserList" resultType="user">
        select * from user where name = #{myname}
    </select>
3.2.4dao接口方法使用一个对象作为参数

方法的形参是一个java对象,这个java对象表示多个参数,使用对象的属性值作为参数使用的

3.3 #和$的区别

3.3.1 #占位符

语法:#{字符}

mybatis处理#{}占位符使用jdbc对象是prepareStatment对象

<!--    对象中的属性可以直接取出-->
    <insert id="addUser" parameterType="com.zd.pojo.User">
        insert into user (id,name,pwd)value(#{id},#{name},#{pwd})
    </insert>

mybatis创建prepareStatment对象,执行sql语句
String sql="select * from user where id = ?";
prepareStatment pst = conn.prepareStatment(sql)
pst.setInt(v1,v2);
pst.executeQuery().var;

.#{}特点:

1.使用的prepareStatment对象,执行sql语句,效率高

2.使用的prepareStatment对象,能避免sql语句注入,sql语句执行更加安全

3.#{}常常作为列值使用的,位于等号的右侧,#{}位置的值和数据类型有关的

3.3.2 $占位符

语法:${字符}

mybatis执行${}占位符的sql语句

<select id="getUserList" resultType="user">
        select * from user where name = ${myname}
    </select>

${}表示字符串连接,把sql语句的其他内容和${}内容使用字符串(+)连接在一起
mybatis创建statement对象,执行sql语句
statement stmt = conn.creatstatement(sql);
ResultSet rs = stmt.executeQuery();

${}的特点:

1.使用statement对象,执行sql语句,效率低

2.${}占位符的值,使用的字符串连接方式,有sql注入的风险,有代码安全的问题

3.${}数据是原样使用的,不会区分数据类型

4.${}常用作表名或者列名,在能保证数据安全的情况下使用4{}

3.4 封装mybatis输出结果

封装输出结果:mybatis执行sql语句,得到ResultSet,转为java对象。

3.4.1ResultType

ResultType属性:在执行select时使用,作为《select》标签的属性出现

ResultType:表示结果类型,mysql执行sql语句,得到java对象的类型,它的值有两种:

1.java类型的全下定名称

2.使用别名

<select id="getUserById" parameterType="int" resultType="com.zd.pojo.User">
        select * from user where id = #{id}
    </select>
1.调用com.zd.pojo.User的无参数构造方法,创建对象。
Student student = new Student();//使用反射创建对象
2.同名的列赋值给同名的属性
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
3.得到java对象,如果dao接口返回值是list集合,mybatis把student对象放入到list集合。
3.4.2ResultMap

ResultMap:结果映射。自定义列名和java对象属性的对应关系。常用在列名和属性名不同的情况。

用法:

1.先定义ResultMap标签,指定列名和属性名称的对应关系

2.在《select》标签使用ResultMap属性,指定上面定 义的ResultMap的id值

3.5自定义别名

mybatis提供的对java类型定义简短,好记名称

自定义别名的步骤:

1.在mybatis主配置文件,使用typeAllases标签声明别名

2.在mapper文件中,ResultType“别名” 。

<!--    可以给实体类起别名-->
    <typeAliases>
        <!--    <typeAlias type="com.zd.pojo.User" alias="User"/>-->
        <package name="com.zd.pojo"/>
    </typeAliases>
<select id="getUserById" resultMap="User">
        select *
        from user
        where id = #{id}
    </select>

3.6 列名和java对象属性名不一样解决方式

1.使用ResultMap:自定义列名和属性名对应关系

2.使用ResultType:使用列的别名,让别名和java对象属性名称一样

3.7like

1.java程序中,把like的内容组装好,然后传入sql (%张%)

<select id="selectLikeOne" resulteType="User">
        select *
        from user
        where like #{name}
    </select>
@Test
void testLikeOne()
    .........
    .....
    ..
    String name ="张%";
List<Student> list = dao.selectLikeOne(name);
foreach;

2.在sql语句中,组织like的内容

sql语句like的格式:where name like “%” #{name} “%”

<select id="selectLikeTwo" resulteType="User">
        select *
        from user
        where name like "%" #{name} "%"
    </select>
@Test
void testLikeTwo()
    .........
    .....
    ..
    String name ="张";
List<Student> list = dao.selectLikeOne(name);
foreach;

第四章 动态sql

什么是动态sql:同一个dao的方法,根据不同的条件可以表示不同的sql语句,主要where部分有变化。

使用mybatis提供的标签,实现动态sql的能力,主要讲if,where,foreach,sql.

使用动态sql的时候,dao方法的形参使用java对象。

4.1 if

语法:


<if test="boolean判断结果">
    sql代码
</if>

在mapper文件中:
<select id="selectLikeTwo" resulteType="User">
        select * from user
    <if test="条件">
        sql语句
    </if>
    </select>

4.2 where标签

使用if标签时,容易引起sql语句语法错误,使用where标签解决if产生的语法问题。

使用时where,里面是一个或多个if标签,当有一个if标签判断条件为true,where标签会转为WHERE关键字附加在sql语句的后面。如果if没有一个条件为true,那么久忽略where和里面的if

where会删除离他最近的or或者是and

语法:
<where>
    <if test="boolean判断结果">
    or sql代码
</if>
    <if test="boolean判断结果">
   or sql代码
</if>
</where>

4.3 foreach循环

使用foreach可以循环数组,list集合,一般使用在in语句中。

语法:

<foreach collection="集合类型" open="开始的字符" close="结束的字符" item="集合中的成员" separator="集合成员之间的分隔符 ">
   #{item的值}
</foreach>

标签属性:
collection:表示循环的对象是数组,还是list集合,如果dao接口方法的形参是数组,
collection="array",如果dao接口形参是list,collection="list"
open:循环开始时的字符,sql.append("(");
close:循环结束时的字符,sql.append(")");
item:集合的成员,自定义的变量 Integer item = islist.get(i); 
separator:集合成员之间的分割符 sql.append(",");

4.4 sql标签

sql标签标示一段sql代码,可以使表名,几个字段,where条件都可以,可以在其他地方复用sql标签的内容。

使用方式:

1.在mapper文件中定义sql代码片段《sql id=“唯一字符串”》 部分sql语句 《/sql》

2.在其他的位置,使用include标签引用某个代码片段。

第五章 mybatis settings和别名

mybatis配置文件两大类:

1.mybatis主配置文件;

2.mybatis的mapper文件

1.mybatis主配置文件,提供mybatis全局设置的。包含的内容 日志,数据源,mapper文件位置。

2.mapper文件:写sql语句的,一个表一个mapper文件

5.1 setting部分

settings是mybatis的全局设置,影响这个mybatis的运行。这个设置一般使用默认值就可以了。

5.2 TypeAliase别名

设置别名

 <!--    可以给实体类起别名-->
    <typeAliases>
        <!--    <typeAlias type="com.zd.pojo.User" alias="User"/>-->
        <package name="com.zd.pojo"/>
    </typeAliases>
5.3 配置环境
environments:环境标签,在他里面可以配置多个enviroment
environment:表示一个数据库的连接信息。
属性:id自定义的环境的标识。唯一值。
transactionManager:事务管理器
属性:type表示事务管理器的类型
属性值:1.jdbc使用connection对象,由mybatis自己完成事务的处理
manage:管理,表示事务的处理交给容器实现(由其他软件完成事务的提交,回滚)
dataSource:数据源,创建的Connection对象,连接数据库
属性:type数据源的类型
属性值:1.POOLED,mybatis会在内存中创建POOLEDDataSource类,管理多个Connection连接对象,使用的连接池。
2.还有UNPOOLED,不使用连接池,mybatis创建一个UNPOOLEDDataSource类,每次执行sql语句先创建Connection对象,在执行sql语句,关闭连接。
<environments default="development">
        <environment id="development">
            <!--            默认的事务管理器是JDBC  事务管理器:JDBC   MANAGED-->
            <transactionManager type="JDBC"/><!-- 单独使用时配置成MANAGED没有事务 -->
            <!--            数据源不止POOLED一个,还有UNPOOLED,UNDI.默认是pooled-->
            <dataSource type="POOLED">
                <!--                通过properties属性来实现引用配置文件-->
                <!--                java的配置文件就是db.properties    -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
5.4 使用数据库属性配置文件

需要把数据的配置信息放到一个单独文件中,独立管理。这个文件扩展名是properties。在这个文件中,使用自定义的key=value的格式表示数据。

使用步骤:

1.在resource目录中,创建xxxx.properties

2.在文件中,使用k-v的格式定义数据。

3.在mybatis主配置文件,使用《property》标签引用外部的属性配置文件。

4.在使用值的位置,使用${key}获取key对应的value

5.5 mapper标签

使用mapper指定其他mapper文件的位置

mapper标签使用的格式有两个常用的方式:

1.<mapper resource

2.<package name
ties属性来实现引用配置文件–>








#### 5.4 使用数据库属性配置文件

需要把数据的配置信息放到一个单独文件中,独立管理。这个文件扩展名是properties。在这个文件中,使用自定义的key=value的格式表示数据。

使用步骤:

1.在resource目录中,创建xxxx.properties

2.在文件中,使用k-v的格式定义数据。

3.在mybatis主配置文件,使用《property》标签引用外部的属性配置文件。

4.在使用值的位置,使用${key}获取key对应的value

#### 5.5  mapper标签

使用mapper指定其他mapper文件的位置

mapper标签使用的格式有两个常用的方式:

1.<mapper resource

2.<package name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

“HelloWorld”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值