IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> MyBatis3:入门及基本原理 -> 正文阅读

[Java知识库]MyBatis3:入门及基本原理

1、MyBatis出现的历史背景

1、之前与数据库交互得得做到:编写sql -> 预编译 -> 设置参数 -> 执行sql -> 封装结果,功能简单,sql语句编写子java代码里面,这种硬编码,高耦合的方式,不推荐所以就出来一个框架Hibernate

2、Hibernate:全自动全映射的ORM(Object Relation Mapping)对象关系映射框架:旨在消除sql,从javaBean映射到DbRecoreds中间加上jdbc编写预编译等黑箱操作的中间过程,开发人员即使不懂sql也能够进行开发
缺点:
①因为sql是黑箱操作sql语句已经编写好了,这不好优化,除非用HQL定制sql
②全映射,javaBean有100个字段,数据库就会有100列与之对应,如果只要一个字段,是没办法的,一查就是100个字段全部映射了所以就出来了ibatis

3、MyBatis半自动的,将核心业务交了出来,MyBatis3之前的版本2…现在都叫做ibatis,原来时apche下的项目转给google了,转的时候正值ibatis3.0的发布所以改名了就叫MyBatis,我们所说的MyBatis就是ibatis3.0之后的版本希望sql语句交给开发人员编写,不失去灵活性,所以mybatis就出来了,他把编写sql这个命脉从黑箱中提取出来了
在这里插入图片描述

2、使用框架

用户发起请求-> 界面层controller -> 业务逻辑层service()->
包含service的实现类 -> 持久层dao层数据库的mapper操作层-> 数据库mysql
优点
①结构清晰,耦合度低,各层分工明确
②可维护性高,可扩展性高
③有利于标准化,实现技术的整合
④开发人员可以只关注整个结构中的其中某一层的功能实现
⑤有利于各层逻辑的复用,提高开发效率,降低难度
每一层对应着一个框架
界面层:Spring MVC:接受用户的请求,调用service,显示请求的处理结果,包含jsp、html、servlet等对象,对应controller
业务层:Spring:处理业务逻辑,使用算法处理数据的,把数据返回给界面层,对应的是service包以及实现类
持久层:MyBatis:访问数据库,或者读取文件,访问网络,获取数据,对应的包是dao。

3、MyBatis入门

mapper的配置文件,项目中一个表对应一个mapper,主配置mapper设置数据库连接信息以及可以读取到哪些mapper
①主配置mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--
1. http://mybatis.org/dtd/mybatis-3-config.dtd 主配置文件的约束,和mapper的xml约束文件不能混用-->
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
<!--            配置数据源,创建Connection连接对象-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!--    指定其它mapper文件的配置,得找到其他mapper文件目的是找到其他文件的sql语句-->
    <mappers>
<!--        使用mapper的resource属性指定mapper文件的路径,这个路径是从target/classes路径开始的
注意:resource="mapper文件的相对路径 使用/做分割
一个mapper resource指定一个mapper文件"-->
        <mapper resource="com/byue/dao/StudentDao.xml"/>
    </mappers>
</configuration>

②每个表也就是dao层对应的mapper
照理说因该先写一个接口,通过接口映射到xml文件执行sql,但是他的原理是通过SqlSessionFactor实现的,所以这个接口不要都行

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.byue.dao.StudentDao">
    <insert id="insertStudent" parameterType="com.byue.domain.Student">
        <!-- 如果传入mybatis的是一个java对象,则使用#{属性名}获取属性值,mybatis执行此属性对应的get**方法拿到属性值-->
        insert into student values (#{id},#{name},#{email},#{age})
    </insert>
    <!--    查询一个学生的信息
    <select>表示查询操作,里面是select语句
    id:要执行的sql语句的唯一标识,是一个自定义字符串推荐使用dao接口中的方法名称
    resultType:告诉mybatis,执行sql语句后,把数据赋值给哪个java类型的对象,resultType的值现在使用的是java对象的全限定名称
    -->
<select id="selectStudentById" resultType="com.byue.domain.Student">
    select id from student where id =#{studentId} <!-- #表示占位符,从java中传过来的数据-->
</select>

</mapper>

<!--
1.  http://mybatis.org/dtd/mybatis-3-mapper.dtd约束文件
作用: 定义和限制当前文件中可以使用的标签和属性,以及标签出现的顺序
2. mapper是跟标签  namespace是命名空间,不能为空,唯一值,推荐使用Dao接口全限定名称
作用:参与识别sql语句的作用
3. 在mapper里面可以写<insert> <update> <delete> <select>等标签
-->

③测试函数入口

public class MyTest {
    // 测试mybatis执行sql语句
    @Test
    public void testSelctStudentById() throws IOException {
        // 调用mybatis某个对象的方法,执行mapper文件中的sql语句
        // mybatis的和兴类 SqlSessionFactory
        // 1. 定义mybatis主被指文件的位置。从类路径开始的相对路径
        String config="mybatis.xml";
        // 2. 读取主配置文件,手机用mybatis框架中的Resources
        InputStream inputStream = Resources.getResourceAsStream(config);
        // 3. 创建SqlSessionFactory对象,使用SqlSessionFactoryBuidler
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
        // 4. 获取SqlSession对象
        SqlSession session = factory.openSession();
        // 5. 指定要执行sql语句的id,sql语句的id=namespace+"."+select|update|insert|delete的id属性值
        String sqlId="com.byue.dao.StudentDao"+"."+"selectStudentById";

        // 6. 通过SqlSession的方法,执行sql语句
//        Student student = session.selectOne(sqlId);
        Student student = session.selectOne(sqlId,2);
        System.out.println("使用mybatis来查询一个学生"+student);
        session.commit(); // mybatis默认执行sql语句是手工提交事务模式,在做insert、update和delete时需要手动提交事务
        // 7. 关闭SqlSession对象
        session.close();

    }
    @Test
    public void insertStudent() throws IOException {
        String config="mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = factory.openSession();
        String sqlId="com.byue.dao.StudentDao"+"."+"insertStudent";
        Student s1 = new Student();
        s1.setAge(34);
        s1.setId(7);
        s1.setName("王五");
        int rows = session.insert(sqlId,s1);
        System.out.println("使用mubatis来新增一个学生影响的行数为"+rows);
        session.close();

    }

遇到的2个错误,第一个编译文件找不到,在maven中的pom配置文件中加上一个配置,让他可以将项目中的文件编译进去,第二个classNotFound,我明明以及引入了maven中的mysql,并且classpath已经设置好了,还是不想,最后通过给该项目引入mysql的jar包才解决的

 <build>
<!--        资源插件:处理src/main/java目录中的xml-->
        <resources>
            <resource>
                <directory>src/main/java</directory> <!--所在的目录位置-->
                <includes> <!-- 包括目录下二点.properties,.xml文件都会被扫描到在编译文件中红-->
                   <include>**/*.properties</include>
                   <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

在这里插入图片描述

已经配好了环境变量但是还是没有用

在这里插入图片描述
将对应执行的sql已经他的生命周期打印在控制台中的设置如下
在这里插入图片描述

4、MyBatis的重要对象

①Resource:mybatis框架中的对象信息,就一个作用,读取主配置信息
InputStream inputStream = Resources.getResourceAsStream(config);
②SqlSessionFactoryBuilder:负责创建SqlSessionFactory对象
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
③SqlSessionFactory:重量级对象,创建此对象需要更多的资源和时间,创建此对象,费时又费力(Connection),保证重量级对象有一个就可以了,创建比较费劲。
SqlSessionFactory实际上是一个接口:作用是SqlSession的工厂,就是创建SqlSession对象,ctrl+h可以看到他们的继承关系,找到sqlSessionFactory的实现类
public class DefaultSqlSessionFactory implements SqlSessionFactory{}
④SqlSessionFactory接口中的方法
openSession():获得一个SqlSession的对象,默认是需要手工提交事务的
openSession(boolean):boolean参数表示是否自动提交事务,true创建一个自动提交事务的SqlSession,false:等同于没有参数的openSession
⑤SqlSession对象是通过SqlSwssionFactory获取的,SqlSession本身是一个接口,他的作用是提供了大量的执行sql语句的方法
public class DefaultSqlSession implements SqlSession {}
selectOne:执行sql语句,最多得到一行记录,多余1行是错误的
selectList:执行sql语句返回多行语句
selectMap:执行sql语句,得到一个map结果
insert、update、delete、commit、rollback方法
注意SqlSession对象不是线程安全的,所以他的使用步骤如下
①在方法的内部,执行sql语句之前,先获取sqlsession对象
②调用sqlsession的方法,执行sql语句
③关闭sqlsession对象,执行sqlsession.close()

5、MyBatis的dao代理

mybatis提供代理:mybatis创建dao接口的实现类对象,完成sql语句的执行。mybatis创建一个对象代替程序员手动写dao的实现类
要求
①mapper文件中的namespace:必须是dao接口的全限定名称
②mapper文件中标签的id是dao接口中的方法名称(一模一样才行)
mybatis的实现方式
使用SqlSession对象的方法getMapper(dao.class)
例如:现在有个StudentDao接口

SqlSession session=MyBatisUtils.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
Student student = dao.selectById(1001);
// 上面的代码中
StudentDao dao = session.getMapper(Student.class);
dao -> com.sun.proxy.$Proxy2 相当于之前手动写的StudentDaoImpl实现类
等同于
Student dao = new StudentDaoImpl();
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:15:56  更:2021-08-17 15:16:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 8:50:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码