• MyBatis入门


    目录

    01-MyBatis

    第1 章 框架概述

    1.1 什么是框架

    1.2 框架要解决的问题

    1.3 软件开发的分层重要性

    1.4 javaEE下常见的分层框架

    1.5 回顾JDBC

    1.6问题分析

    第2章 Mybatis 框架快速入门

    2.1 mybatis概述

    2.2创建测试用的数据表

    2.3创建maven工程

    2.4对照数据表编写实体类

    2.5编写持久层接口UserDao

    2.6编写SqlMapConfig.xml 配置文件

    2.7编写UserDao的映射文件

    2.8配置日志文件(从网上找一个)

    2.9测试类

    补充:使用注解配置mybatis

     1.添加注解

    总结:


    01-MyBatis

    1 章 框架概述

    1.1 什么是框架

            框架(Framework )是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法 ; 另一种 定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定 义。 简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是 使用别 人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。

    1.2 框架要解决的问题

             框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的 软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因 此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不 是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。

    1.3 软件开发的分层重要性

            框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为 了实现 软件工程中的“高内聚、低耦合 。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我 们常见的 MVC 软件设计思想就是很好的分层思想。

    1.4 javaEE下常见的分层框架

    框架图解:
    1.4.1 解决数据库持久化问题的框架
    Mybatis
            mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc ,使开发者只需要关注 sql 语句本身,而 不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。
    SpringMVC
            在web 模型中, MVC 是一种很流行的框架,通过把 Model View Controller 分离,把较为复杂的 web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。还是为了组内开发人员之间的配合。总之就是一种分层工作的办法。
    SpringMVC ,是 spring 的一个子框架,当然拥有 spring 的特性,如依赖注入。
            Spring下的子项目: Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求- 响应模型,框架的目的就是帮助我们简化开发, Spring Web MVC 也是要简化我们日常 Web 开发的。
    Spring , spring是开源的轻量级框架
            spring主要由两部分:1.面向切面编程(aop)不需要去修改源代码去增强方法的功能。2.控制反转(ioc) 极大程度地解决了程序之间的耦合度,通过spring去管理javabean对象,减少代码与代码之间的依赖关系。

    1.5 回顾JDBC

    1. package com.test.jdbc;
    2. import javax.xml.transform.Result;
    3. import java.sql.*;
    4. public class jjdbcText {
    5. public static void main(String[] args) throws Exception {
    6. // 连接对象
    7. Connection connection = null;
    8. // 执行对象
    9. PreparedStatement preparedStatement = null;
    10. // 结果集
    11. ResultSet resultSet = null;
    12. try{
    13. Class.forName("com.mysql.jdbc.Driver");
    14. connection = DriverManager.getConnection("jdbc:mysql://192.168.137.168/travel?serverTimezone=UTC","root","123456");
    15. String sql = "select * from tab_user";
    16. preparedStatement = connection.prepareStatement(sql);
    17. resultSet = preparedStatement.executeQuery();
    18. while (resultSet.next()){
    19. System.out.println(resultSet);
    20. }
    21. }catch ( Exception e ){
    22. System.out.println();
    23. }
    24. // 释放资源......
    25. }
    26. }

    1.6问题分析

    • 每执行一次都会创建一次链接释放一次连接,极大的造成了性能资源的浪费
    • 加载驱动,数据库,连接数据库的账号密码全部使用硬编码直接写死,不利于代码维护与管理
    • sql语句糅杂在java代码中,耦合度高,可读性低
    • 结果集每次都要一个一个手动判断获取,提高了代码书写的工作量

    2 Mybatis 框架快速入门

    2.1 mybatis概述

    Mybatis 是一个持久层框架,用 java 编写的。
            它封装了jdbc 操作的很多细节,使开发者只需要关注 sql 语句本身,而无需关注注册驱动,创建连接 等繁杂过程 它使用了ORM(Object Relational Mappging 对象关系映射)思想实现了结果集的封装。简单的说: 就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。

    2.2创建测试用的数据表

    1. CREATE TABLE`user`
    2. (
    3. `id` int(11) NOT NULL auto_increment,
    4. `username` varchar(32) NOT NULL COMMENT '用户名称',
    5. `birthday` datetime default NULL COMMENT '生日',
    6. `sex` char(1) default NULL COMMENT '性别',
    7. `address` varchar(256) default NULL COMMENT '地址',
    8. PRIMARY KEY (`id`)
    9. );
    10. insert into`user`(`id`,`username`,`birthday`,`sex`,`address`)values(41,'老
    11. 王','2020-02-27 17:47:08','男','北京'),(42,'小二王','2020-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2020-03-04 11:34:34','女','北京金燕龙'),(45,'六星教育','2020-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2020-03-07 17:37:26','男','北京'),
    12. (48,'小马宝莉','2020-03-08 11:44:00','女','北京修正');

    2.3创建maven工程

    maven配置如下:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>org.mybatisgroupId>
    6. <artifactId>mybatisartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <properties>
    9. <maven.compiler.source>17maven.compiler.source>
    10. <maven.compiler.target>17maven.compiler.target>
    11. properties>
    12. <dependencies>
    13. <dependency>
    14. <groupId>org.mybatisgroupId>
    15. <artifactId>mybatisartifactId>
    16. <version>3.4.5version>
    17. dependency>
    18. <dependency>
    19. <groupId>junitgroupId>
    20. <artifactId>junitartifactId>
    21. <version>4.10version>
    22. <scope>testscope>
    23. dependency>
    24. <dependency>
    25. <groupId>mysqlgroupId>
    26. <artifactId>mysql-connector-javaartifactId><version>8.0.19version>
    27. <scope>runtimescope>
    28. dependency>
    29. <dependency>
    30. <groupId>log4jgroupId>
    31. <artifactId>log4jartifactId>
    32. <version>1.2.12version>
    33. dependency>
    34. dependencies>
    35. project>

    2.4对照数据表编写实体类

    1. package com.haohao.domain;
    2. import java.io.Serializable;
    3. import java.util.Date;
    4. public class user implements Serializable {
    5. private Integer id;
    6. private String username;
    7. private Date birthday;
    8. private String sex;
    9. private String address;
    10. public Integer getId() {
    11. return id;
    12. }
    13. public void setId(Integer id) {
    14. this.id = id;
    15. }
    16. public String getUsername() {
    17. return username;
    18. }
    19. public void setUsername(String username) {
    20. this.username = username;
    21. }
    22. public Date getBirthday() {
    23. return birthday;
    24. }
    25. public void setBirthday(Date birthday) {
    26. this.birthday = birthday;
    27. }
    28. public String getSex() {
    29. return sex;
    30. }
    31. public void setSex(String sex) {
    32. this.sex = sex;
    33. }
    34. public String getAddress() {
    35. return address;
    36. }
    37. public void setAddress(String address) {
    38. this.address = address;
    39. }
    40. @Override
    41. public String toString() {
    42. return "user{" +
    43. "id=" + id +
    44. ", username='" + username + '\'' +
    45. ", birthday=" + birthday +
    46. ", sex='" + sex + '\'' +
    47. ", address='" + address + '\'' +
    48. '}';
    49. }
    50. }

    2.5编写持久层接口UserDao

    1. package com.haohao.dao;
    2. import com.haohao.domain.User;
    3. import java.util.List;
    4. public interface UserDao {
    5. /**
    6. * 查询所有用户
    7. * @return
    8. */
    9. List findAll();
    10. }

    2.6编写SqlMapConfig.xml 配置文件

    1. configuration
    2. PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    4. <configuration>
    5. <environments default="mysql">
    6. <environment id="mysql">
    7. <transactionManager type="JDBC">
    8. transactionManager>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="com.mysql.jdbc.Driver"/>
    11. <property name="url" value="jdbc:mysql://192.168.137.168:3306/travel?serverTimezone=UTC"/>
    12. <property name="username" value="root"/>
    13. <property name="password" value="123456"/>
    14. dataSource>
    15. environment>
    16. environments>
    17. <mappers>
    18. <mapper resource="com/haohao/dao/UserDao.xml"/>
    19. mappers>
    20. configuration>

    2.7编写UserDao的映射文件

    1. mapper
    2. PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.haohao.dao.UserDao">
    5. <select id="findAll" resultType="com.haohao.domain.User">
    6. SELECT * FROM user
    7. select>
    8. mapper>

    2.8配置日志文件(从网上找一个)

    1. ### 设置###
    2. log4j.rootLogger = debug,stdout,D,E
    3. ### 输出信息到控制抬 ###
    4. log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    5. log4j.appender.stdout.Target = System.out
    6. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    7. log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    8. ### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
    9. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    10. log4j.appender.D.File = E://logs/log.log
    11. log4j.appender.D.Append = true
    12. log4j.appender.D.Threshold = DEBUG
    13. log4j.appender.D.layout = org.apache.log4j.PatternLayout
    14. log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
    15. ### 输出ERROR 级别以上的日志到=E://logs/error.log ###
    16. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    17. log4j.appender.E.File =E://logs/error.log
    18. log4j.appender.E.Append = true
    19. log4j.appender.E.Threshold = ERROR
    20. log4j.appender.E.layout = org.apache.log4j.PatternLayout
    21. log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

    2.9测试类

    1. import com.haohao.dao.UserDao;
    2. import com.haohao.domain.User;
    3. import org.apache.ibatis.io.Resources;
    4. import org.apache.ibatis.session.SqlSession;
    5. import org.apache.ibatis.session.SqlSessionFactory;
    6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    7. import java.io.IOException;
    8. import java.io.InputStream;
    9. import java.util.List;
    10. public class MyBatisTest {
    11. public static void main(String[] args) throws IOException {
    12. //1.读取配置文件
    13. InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
    14. //2.创建SqlSessionFactory的构建者对象
    15. SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
    16. //3.使用构建者创建工厂对象SqlSessionFactory
    17. SqlSessionFactory factory=builder.build(in);
    18. //4.使用SqlSessionFactory生产SqlSession对象
    19. SqlSession session=factory.openSession();
    20. //5.使用SqlSession创建dao接口的代理对象
    21. UserDao userDao=session.getMapper(UserDao.class);
    22. //6.使用代理对象执行查询所有方法
    23. List users=userDao.findAll();
    24. for (User u:users) {
    25. System.out.println(u);
    26. }
    27. session.close();
    28. }
    29. }

    补充:使用注解配置mybatis

     1.添加注解

    1.   /**
    2.   *查询所有用户
    3.   *@return
    4.   */
    5. @Select("select * fromuser")  
    6. ListfindAll();

    2.修改SqlMapConfig.xml中mapper属性class为添加注解的类

    1. <mappers>
    2. <mapper class="com.sixstar.dao.UserDao"/>
    3. mappers>

    总结:

            通过快速入门示例,我们发现使用 mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 jdbc 方便多了。(我们使用注解 之后,将变得更为简单,只需要编写一个 mybatis 配置文件就够了。) 但是,这里面包含了许多细节,比如为什么会有工厂对象( SqlSessionFactory , 为什么有了工厂之后还 要有构建者对象(SqlSessionFactoryBuilder),为什么 IUserDao.xml 在创建时有位置和文件名的要 求等等。这些问题我们在自定义 mybatis 框架的章节,通过层层剥离的方式,给大家讲解。
    请注意:我们讲解自定义 Mybatis 框架,不是让大家回去自己去写个 mybatis ,而是让我们能更好的了解 mybatis 内部是怎么执行的,在以后的开发中能更好的使用 mybatis 框架,同时对它的设计理念(设计模式)有 一个认识。
  • 相关阅读:
    Rust中的返回值与错误处理
    Java编写图片转base64
    带你了解一下PHP搭建的电商商城系统
    Day16:冒泡排序详解
    Java基础算法---使用双重循环输出九九乘法表
    如何让元素垂直居中?
    Python中静态方法与类方法
    UE AI里的感知实现流程解析
    新版TCGAbiolinks包学习:批量下载数据新版TCGA数据
    0097 弗洛伊德算法,马踏棋盘算法
  • 原文地址:https://blog.csdn.net/m0_46623754/article/details/126178775