入门MyBatis框架

1、回顾JDBC存在问题

  • 程序主要处理的就是数据,数据通常被存储在数据库(MySQL、Oracle)或内存中;
  • Java操作数据库是使用Sun公司的这套JDBC API,具体的接口实现类(数据库驱动)由各个数据库厂商进行实现;
  • 传统JDBC怎么操作数据库呢?

1、加载驱动
2、创建连接
3、创建执行对象
4、进行CRUD操作——>解析数据
5、释放资源

  • 数据库访问,连接一定要处理好,普通情况下,每次创建连接,用完关闭连接,这个连接非常消耗资源,通常我们采用数据库连接池DBPool。

采用硬编码的方式访问数据库:

import java.sql.*;
public class MyTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //加载驱动jar包
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接对象
        String url="jdbc:mysql://localhost:3306/enducation?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false";
        String username="root";
        String password="123456";
        //获取连接对象
        Connection conn = DriverManager.getConnection(url, username, password);
        //获取操作对象
        Statement statement = conn.createStatement();
        //执行SQL语句
        String sql="select * from student";
        //获取执行之后返回的结果
        ResultSet resultSet = statement.executeQuery(sql);
        //取出数据
        while (resultSet.next()) {
            System.out.println(resultSet.getInt(1) + "----" + resultSet.getString(2) + "-----" + resultSet.getInt(3) + "-----" + resultSet.getString(4));
        }

        //释放资源
        conn.close();
        statement.close();
        resultSet.close();

        /*1----zhangsan-----22-----123456
        2----lisi-----21-----123456
        4----zaholiu-----22-----123456
        5----tianqi-----23-----123456
        6----wangwu-----24-----123456*/
    }
}
  • 以上操作数据库的代码有什么问题?

1、连接数据库的一套代码结构每次都是一样的,没必要重复书写;
2、SQL语句的参数设置很麻烦;
3、查询到的结果集解析的时候很麻烦;
4、SQL的可读性很差,如果SQL语句很长,不利于阅读和维护;

  • 数据库访问组件apache DBUtils的最大特点是可以将ResultSet转换为我们需要的Java对象;
public List<Account> queryAll() throws SQLException{ 
	List<Account> list = new ArrayList(); 
	QueryRunner qr = new QueryRunner(datasource); 
	String sql = "select * from account"; 
	return qr.query(sql, new BeanListHandler<Account>(Account.class), 参数1, 参数2...); 
}

DBUtils的原理是什么?
反射,将查询结果的列和Java对象对应起来,将值通过反射设置到Java对象的属性中;
数据库元数据(理解为是描述数据的数据):ResultSet,它的元数据就是查询的sql所包含的列,列的类型,长度…

  • 我们可以发现:DBUtils无法将参数自动的和SQL中占位符匹配,DBUtils对于单表的支持很好,但对于关联查询的结果封装很不友好,没有缓存,每一次的查询都是物理查询

  • 以上的参数自动映射,返回结果自动映射,以及缓存,多表连接查询封装等等这些问题如果都解决了,那就不是普通的数据库访问组件了,而是框架。

  • 数据库访问层框架:

mybatis
hibernate

hibernate 是一个全自动的ORM框架,老系统还在维护,业务不怎么变
【sql语句不用编写,直接操作Java类,就可以到反应到数据库表中,不用写数据库,直接写Java类,编写配置文件,一键生成,20多种数据库脚本。数据库可以随意移植, 缺点是繁琐的配置】

mybatis是一个半自动化的ORM框架 新项目用mybatis多,求新求变,天天在变
【sql语句一定要你写,简单,代码生成器】

2、框架前言

名词辨析

  • 技术、组件、框架、系统

技术:解决某一类问题的方法和手段,jdbc技术,jsp技术;
组件:应用程序中可以复用的“零件”(封装的类库),分页组件,数据库访问组件;
框架:Framework,是构成一组特定软件可复用设计的一组相互协助工作的类,是一个程序的半成品。生活中的简历模板,盖房子,钢构结构,活动板房;
系统:实现了完整功能的应用程序,淘宝系统,网上交易系统。

  • 需要注意:技术实现的效率一定是最高的,因为它本身非常纯粹,但是大量冗余的代码会增加维护的成本;而框架则是牺牲效率,维护起俩很方便;

各个服务器的介绍

在这里插入图片描述
各个Web服务器介绍

原文链接

  • Tomcat服务器

Tomcat服务器是一个免费的开源的Web应用服务器,是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

由于有了 Sun 的参与和支持,最新的 Servlet 和 JSP 规范总是能在 Tomcat 中得到体现,Tomcat 5 支持最新的 Servlet 2.4 和 JSP 2.0 规范。

因为Tomcat技术先进、性能稳定,运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且很重要的是它免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。而且由于开源,它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好 Apache 服务器,可利用它响应对HTML页面的访问请求。实际上 Tomcat 部分是 Apache 服务器的扩展,但它是独立运行的,所以当你运行 Tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

Tomcat 最新版本是4.0x,4.0x与3.x的架构不同,而是重新设计的。Tomcat4.0x中采用了新的Servlet容器:Catalina,完整的实现了Servlet 2.3和Jsp1.2规范。由于Java的跨平台特性,基于Java的Tomcat也具有跨平台性。

与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有HTML和JSP文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。

在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。

Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache.我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet,这种集成只需要修改一下Apache和Tomcat的配置文件即可。

在Tomcat4中,你还可以利用Servlet2.3提供的事件监听器功能,来对你的应用或者Session实行监听。Tomcat也提供其它的一些特征,如与SSL集成到一块,实现安全传输。还有Tomcat也提供JNDI支持,这与那些J2EE应用服务器提供的是一致的。

  • JBoss服务器

一个基于J2EE的开放源代码的应用服务器。因为JBoss代码遵循LGPL许可,你可以在任何商业应用中免费使用它,而不用支付费用。JBoss支持EJB 1.1和EJB 2.0 EJB3.0的规范,它是一个管理EJB的容器和服务器。类似于Sun’sJ2SDK Enterprise Edition(J2EE),JBoss的目标是一个源代码开放的J2EE环境。但是JBoss核心服务仅是提供EJB服务器。JBoss不包括serverlers/JSPpage的WEB容器,当然可以和Tomcat或Jetty绑定使用。

JBoss还具有如下六大优点:

1、JBoss是免费的,开放源代码J2EE的实现,它通过LGPL许可证进行发布。
2、JBoss需要的内存和硬盘空间比较小。
3、安装非常简单。先解压缩JBoss打包文件再配置一些环境变量就可以了。
4、JBoss能够"热部署",部署BEAN只是简单拷贝BEAN的JAR文件到部署路径下就可以了。如果没有加载就加载它;如果已经加载了就卸载掉,然后LOAD这个新的。
5、JBoss与Web服务器在同一个Java虚拟机中运行,Servlet调用EJB不经过网络,从而大大提高运行效率,提升安全性能。
6、用户可以直接实施J2EE-EAR,而不是以前分别实施EJB-JAR和Web-WAR,非常方便。

  • WebLogic服务器

WebLogic是美国bea公司(目前被Oracle收购)出品的一个application server,确切的说是一个基于Javaee架构的中间件,纯Java开发的,BEAWebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和JavaEnterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。目前weblogic在世界application server市场上占有最大的份额;

它的优点包括:

1、领先的标准:对业内多种标准的全面支持,包括EJB、JSB、JMS、JDBC、XML和WML,使Web应用系统的实施更为简单,并且保护了投资,同时也使基于标准的解决方案的开发更加简便。
2、无限的可扩展性 :BEA WebLogic Server以其高扩展的架构体系闻名于业内,包括客户机连接的共享、资源pooling以及动态网页和EJB组件群集。
3、快速开发:凭借对EJB和JSP的支持,以及BEA WebLogic Server 的Servlet组件架构体系,可加速投放市场速度。这些开放性标准与WebGain
Studio配合时,可简化开发,并可发挥已有的技能,迅速部署应用系统。
4、部署更趋灵活:BEA WebLogic Server的特点是与领先数据库、操作系统和Web服务器紧密集成。
5、关键任务可靠性 :其容错、系统管理和安全性能已经在全球数以千记的关键任务环境中得以验证。
6、体系结构:BEA WebLogic Server是专门为企业电子商务应用系统开发的。企业电子商务应用系统需要快速开发,并要求服务器端组件具有良好的灵活性和安全性,同时还要支持关键任务所必需的扩展、性能、和高可用性。

  • WebSphere服务器

WebSphere是 IBM的集成软件平台。它包含了编写、运行和监视全天候的工业强度的随需应变 Web应用程序和跨平台、跨产品解决方案所需要的整个中间件基础设施,如服务器、服务和工具。WebSphere提供了可靠、灵活和健壮的集成软件。(太贵了,了解不多)

  • Apache服务器

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。在Apache基金会里面Apache Server永远会被赋予最大的支持。

Apache支持静态页,Tomcat支持动态的,比如Servlet等,一般使用Apache+Tomcat的话,Apache只是作为一个转发,对JSP的处理是由Tomcat来处理的。

Apache是Web服务器,Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。

Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)

如果要在Apache环境下运行jsp的话就需要一个解释器来执行jsp网页,而这个jsp解释器就是Tomcat,为什么还要JDK呢?因为jsp需要连接数据库的话,就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要Apache+tomcat+JDK。整合的好处是:

◆如果客户端请求的是静态页面,则只需要Apache服务器响应请求。

◆如果客户端请求动态页面,则是Tomcat服务器响应请求。

◆因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。

Apache:侧重于HTTPServer
Tomcat:侧重于Servlet引擎,如果以Standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想;

换句话说,Apache是一辆卡车,上面可以装一些东西如HTML等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。

  • 以上各个服务器之间的异同

相同点:

五个服务器都是基于java的基础架构来满足实时处理需求,不同的版本与jdk版本兼容和有所不同;因为都是要和前台交互,所以他们都基于sun公司的servlet来实现的。

不同点:

1、应用服务器提供更多的J2EE特征,如EJB,JMS,JAAS等,同时也支持Jsp和Servlet.而Tomcat则功能没有那么强大,它不提供EJB等支持。但如果与JBoss(一个开源的应用服务器)集成到一块,则可以实现J2EE的全部功能。

2、事实上,我们的很多中小应用不需要采用EJB等技术,Jsp和Servlet已经足够,这时如果用应用服务器就有些浪费了。而Tomcat短小精悍,配置方便,能满足我们的需求,这种情况下我们自然会选择Tomcat;

3、Tomcat也可以与其它一些软件集成起来实现更多的功能。如与上面提到的JBoss集成起来开发EJB,与Cocoon(Apache的另外一个项目)集成起来开发基于Xml的应用,与OpenJMS集成起来开发JMS应用;

4、价位不同:JBoss与Tomcat的是免费的。

5、开源性不同:JBoss与Tomcat的是完全开源的,而其他两个不是。

6、对技术的支持:Tomcat不支持EJB,JBoss是实现了EJB容器,再集成了Tomcat。
JBoss和WebLogic、WebSphere都含有Jsp和Servlet容器,也就可以做web容器;JBoss和WebLogic、WebSphere也都包含EJB容器,是完整的J2EE应用服务器。JBoss是实现了EJB容器,同时内嵌Tomcat,处理静态页面Jboss的速度要比较快,可以作应用服务器。

7、扩展性的不同:WebLogic和WebSphere都是以其高扩展的架构体系闻名于业内,包括客户机连接的共享、资源 pooling以及动态网页和EJB组件群集。

8、WebLogic更加强大,他是j2ee的应用服务器(application server),包括ejb ,jsp,servlet,jms等等,全能型的。是商业软件里排名第一的容器(JSP、servlet、EJB等),并提供其他如JAVA编辑等工具,是一个综合的开发及运行环境。

9、Tomcat只能算Web Container,是官方指定的JSP&Servlet容器。只实现了JSP/Servlet的相关规范,不支持 EJB(硬伤啊)! 不过Tomcat配合jboss和apache可以实现j2ee应用服务器功能; 一般来说考虑stucts等架构tomcat就可以了,但如果考虑EJB的话,WebLogic是比较好的选择。

10、用WebLogic运行标准的java可能并不是最好的方式,WebLogic里支持他自己的一些东西,这些东西虽然是在纯java基础上开发的,但其他工具里都没有。WebLogicServer凭借其出色的群集技术,拥有处理关键Web应用系统问题所需的性能、可扩展性和高可用性。WebLogic Server既实现了网页群集,也实现了EJB组件群集,而且不需要任何专门的硬件或操作系统支持。网页群集可以实现透明的复制、负载平衡以及表示内容容错。无论是网页群集,还是组件群集,对于电子商务解决方案所要求的可扩展性和可用性都是至关重要的。共享的客户机/服务器和数据库连接以及数据缓存和EJB都增强了性能表现。这是其它Web应用系统所不具备的;所以,在扩展性方面WebLogic是远远超越了Tomcat。

框架概述

  • 通过上图可知,我们发现前端,servlet,dao都存在一些问题,框架就是解决以上问题的。目前的框架,都不涉及或者很少涉及service

  • 框架介绍

前端:
js jquery vue
h5 bootstrap

spring

spring贯穿整个应用程序,也就是后台三层中都是使用到了spring,IOC,AOP,萌芽于2000年,诞生于2004年;

servlet层的MVC框架

springMVC(最优秀的mvc框架),是spring在2005年的后续产品;
struts【退出舞台了】;
struts2【奄奄一息,老系统还要维护,是2000年产物】

dao

mybatis(互联网项目很流行)2010年,早期ibatis,后来google,更名为mybatis 2013;
hibernate(老系统在维护,或者新的系统但不怎么更改更新)

SSH-> spring + struts2 + hibernate
SSM-> spring + springMVC+mybatis

springboot

是简化Spring开发的,SSM做一个查询,需要30分钟,springboot只需要5分钟不到, 2014年;

springcolud

用于微服务,一站式框架,架构

3、ORM的介绍

  • Object Relational Mapping 对象关系映射,面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式业务实体在内存中表现为对象,在数据库中表现为关系数据
  • 内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射

在这里插入图片描述

  • ORM框架的核心思想是:

O–>java对象
R–>数据库表
M–>映射文件,也就是对应的关系
一个java类对应数据库的表,一个java对象对应数据库一条数据,一个java对象的属性对应数据库表的一个列;

在这里插入图片描述

  • 为什么要使用ORM框架:

当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

  • dao层的两个框架:mybatishibernate都属于ORM框架,它们有什么区别?

1、mybatis是不完全的orm映射框架,保存一条记录,映射配置有一些是不可见的;
2、 hibernate是一个完全的orm映射框架,映射关系必须配置明确;在hibernate的理念中就是操作java类就是在操作数据库的表数据;

4、MyBatis的CRUD

  • 环境说明:

Intellij IDEA 支持Maven;
Maven,配置阿里云的私服;
JDK 8 和JDK 11 对应mybatis懒加载支持是有区别的;

  • 所有框架开发,遵循以下流程:

maven依赖,写入依赖的jar包坐标;
编写核心配置文件;
根据框架的API编码;
测试;

  • 编写数据库脚本、添加mybatis maven依赖:

SQL脚本

CREATE TABLE account( 
	aid INT PRIMARY KEY AUTO_INCREMENT, 
	aname VARCHAR(50) NOT NULL, 
	apass VARCHAR(50) NOT NULL, 
	a_nikename VARCHAR(100) 
)
INSERT INTO account(aname,apass,a_nikename) VALUES('xiexun','xunxun','金毛狮王'); 
INSERT INTO account(aname,apass,a_nikename) VALUES('zhangcuishan','shanshan','张翠山');

pom.xml文件

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>

  <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
  </dependency>
</dependencies>
  • 编写配置文件mybatis-config.xml

这个配置文件需要一个模板,我们可以从mybatis的官网拷贝一份,不需要手写;

<?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">
<!--根节点configuration配置-->
<configuration>
    <!--环境:指的是一个程序可能会操作很多个数据源(数据库),之前学习JDBC,
    写XML配置文件的时候,我们就可以配置多个数据库,
    而且注意:我们的开发环境和本地测试环境也不一样-->
    
    <!--default就是程序默认使用的数据源-->
    <environments default="development">
        <!--指的是其中一个数据源-->
        <environment id="development">
            <!--事务管理JDBC-->
            <transactionManager type="JDBC"/>
            <!--数据源配置,type类型是pooloed连接池-->
            <dataSource type="POOLED">
                <!--数据库连接的驱动-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/db2020&amp;serverTimezone=UTC&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载mapper映射文件-->
    <mappers>
        <!--mapper文件的全路径,注意使用/分割-->
        <mapper resource="com/oracle/mapper/AccountMapper.xml"/>
    </mappers>
</configuration>
  • 编写Java实体类:ORM中的O
//mybatis建议实体类放在model包下
//实际上放在entity,pojo等都可以
public class Account {
    //实体类中的属性尽量使用包装类,因为包装类变量的默认值都是null
    //比如有的时候获取一个int类型的值为0,
    //但是你不明白到底是值为0,还是没输入所以为0
    private Integer aid;
    private String aname;
    private String apass;
    //有意为之,数据库列a_nikename
    private String anikename;

    …………get和set方法
}
  • 编写映射文件AccountMapper.xmlORM中的M
<?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是指命名空间,这与C#里面的命名空间含义很类似,
程序通过SQL映射的唯一标识获取SQL,比如当前文件有一个SQl标识,
但是其他文件也有一个insert sql标识,就无法区分了,
所以不同的SQL功能操作,使用namespace区分-->
<mapper namespace="com.oracle.mapper.AccountMapper">
    <!--SQL代码,mybatis提供了4个最基础的SQL标签,增删改查
    id是程序中获取SQL的标识,完整的标识应该是namespace.sqlID-->
    <select id="selectAll" resultType="com.oracle.model.Account">
    	<!--这里的#{}是占位符的意思,mybatis中的占位符很强大,
    	它可以帮你判断要不要添加单引号'-->
    	<!--resultType指的是返回值类型-->
        select * from account where aid = #{id}
    </select>
    
    <!--<insert id="">
        
    </insert>
    <update id="">
        
    </update>
    <delete id="">
        
    </delete>-->
</mapper>

#{}中的这个变量是自定义书的,不受限制;

  • 按照框架的API测试:

1、读取配置文件
2、获取SqlSession工厂
3、CRUD操作
4、事务提交,关闭连接

import com.alibaba.fastjson.JSON;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class AccountMapperTest {
    @Test
    public void show() throws IOException {
        //读取核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //获取sqlSession工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //sqlSession是和数据库的一次会话,线程不安全,每一个会话是新的对象
        //打开一次会话
        SqlSession sqlSession = factory.openSession();
        Object o = sqlSession.selectOne("com.oracle.mapper.AccountMapper.selectAll", 1);
        String s = JSON.toJSONString(o, true);
        System.out.println(s);

        /*{
            	"aid":1,
                "aname":"xiexun",
                "apass":"xunxun"
        }*/

        sqlSession.commit();
        sqlSession.close();
    }
}

最开始发生异常:IOException,文件读取不到,这是因为在编译的时候映射文件AccountMapper.xml没有被编译进target目录里面;我们需要在pom.xml中配置一下:表示该目录下的所有.xml都要进行编译;

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>
                    **/*.xml
                </include>
            </includes>
        </resource>
    </resources>
</build>
  • 我们发现部分字段找不着了,SQL语句写在mapper.xml中,好处是SQL代码和Java代码相分离便于SQL的维护数据库中的a_nikename字段没有查询出来,这是因为mybatis默认是列名和对象的属性名一致匹配,我们可以使用别名来解决(后面有更好的方法);
<select id="selectOne" resultType="com.oracle.model.Account">
	select aid,aname,apass,a_nikename as anikename from account where aid = #{id}
</select>

在这里插入图片描述

  • 查询多条:
<select id="selectAll" resultType="com.oracle.model.Account">
	select aid,aname,apass,a_nikename as anikename from account
</select>
@Test
public void selectAll() throws IOException {
        //读取核心配置文件
		InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSession工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //打开一次sqlSession会话
        SqlSession sqlSession = factory.openSession();
        //获取查询到的结果集
        List<Account> list = sqlSession.selectList("com.oracle.mapper.AccountMapper.selectAll");

        //解析并展示数据
        String s = JSON.toJSONString(list, true);
        System.out.println(s);
        /*[
            {
                "aid":1,
                "aname":"xiexun",
                "anikename":"金毛狮王",
                "apass":"xunxun"
            },
            {
                "aid":2,
                "aname":"zhangcuishan",
                "anikename":"张翠山",
                "apass":"shanshan"
            }
        ]*/

        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }
}
  • 插入数据:
<insert id="insert">
	insert into account values (#{aid},#{aname},#{apass},#{anikename})
</insert>
@Test
public void insert() throws IOException {
    //读取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    //获取SqlSession工厂
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //打开一次sqlSession会话
    SqlSession sqlSession = factory.openSession();

    Account account = new Account();
    account.setAid(null);
    account.setAname("张三");
    account.setApass("xiaozhang");
    account.setAnikename("张小小");

    //获取查询到的结果集
    sqlSession.insert("com.oracle.mapper.AccountMapper.insert", account);

    //只要程序不报错,就代表插入成功!

    //提交事务
    sqlSession.commit();
    sqlSession.close();
}
  • 删除数据:
<delete id="delete">
	delete from account where aid=#{aid}
</delete>
@Test
public void delete() throws IOException {
    //读取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    //获取SqlSession工厂
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //打开一次sqlSession会话
    SqlSession sqlSession = factory.openSession();

    Account account = new Account();
    account.setAid(1);

    //获取查询到的结果集
    sqlSession.delete("com.oracle.mapper.AccountMapper.delete", account);

    //只要程序不报错,就代表删除成功!

    //提交事务
    sqlSession.commit();
    sqlSession.close();
}
  • 修改数据:
<update id="update">
	update account set aname=#{aname} where aid=#{aid}
</update>
@Test
public void update() throws IOException {
    //读取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    //获取SqlSession工厂
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //打开一次sqlSession会话
    SqlSession sqlSession = factory.openSession();

    Account account = new Account();
    account.setAid(1);
    account.setAname("李四");
    account.setApass("xunxun");
    account.setAnikename("金毛狮王");

    //获取查询到的结果集
    sqlSession.update("com.oracle.mapper.AccountMapper.update", account);

    //只要程序不报错,就代表更新成功!

    //提交事务
    sqlSession.commit();
    sqlSession.close();
}
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页