MyBatis(上)

1、概述:

        MyBatis(以前称为iBATIS)是一个Java持久性框架,用于简化数据库访问和与关系数据库的交互。它提供了一种将数据库操作与Java应用程序的业务逻辑分离的方式,使开发人员能够更轻松地编写数据库访问代码。MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD。

        MyBatis作为持久层的一个框架,使用到的一个思想就是ORM,用于将对象模型(通常是面向对象编程语言中的类和对象)映射到关系数据库中的数据模型(表、列等)。ORM框架允许开发人员以面向对象的方式进行数据库操作,而不必直接编写SQL查询。通过这个可以使Java中的对象转化为数据库表的一个记录,这种转化的关系就叫做映射。

        之前也注意到啦,什么domain、bean、pojo,只不过一开始没注意其中的含义,大概意思就是,pojo是普通的java类,bean(Spring框架的时候使用的比较多),domain(领域模型------封装数据的),不同的开发的团队可能叫法不一样。

        MyBatis是一个半自动化的ORM框架,就是需要我们手动去书写SQL语句,Hibernate是一个全自动的ORM框架。

  1. SQL映射:MyBatis通过XML或注解方式定义SQL查询,将Java对象与数据库表之间的映射关系。这使得开发人员可以在SQL中编写原生SQL查询,而不需要使用对象关系映射(ORM)框架。

  2. 简化数据访问:MyBatis处理了许多数据库访问的底层细节,如连接管理、事务处理和结果集映射,从而使开发人员能够专注于业务逻辑而不必关心这些细节。

  3. 动态SQL:MyBatis允许在SQL查询中使用动态SQL,根据条件动态生成SQL查询,这在构建复杂查询时非常有用。

  4. 参数映射:MyBatis支持将Java对象作为参数传递给SQL查询,参数映射工作非常灵活,可以轻松地传递单个参数、多个参数、参数对象等。

  5. 结果集映射:MyBatis支持将SQL查询的结果集映射到Java对象,开发人员可以使用XML或注解来定义映射规则。

  6. 事务管理:MyBatis支持事务管理,可以通过编程方式管理事务,也可以配置自动提交或手动提交事务。

  7. 插件支持:MyBatis提供了插件机制,允许开发人员编写自定义插件来扩展其功能,例如添加日志、性能监控等。

  8. 集成性:MyBatis可以与Spring、Spring Boot等常见的Java框架和应用服务器集成,使其更容易在现有项目中使用。

  9. 易于学习和使用:MyBatis的学习曲线相对较低,它的配置和使用都相对简单明了。

        总之,MyBatis是一个轻量级的Java持久性框架,适用于需要直接访问数据库的应用程序。它提供了丰富的功能,包括SQL映射、参数映射、结果集映射等,使得数据库访问变得更加简单和灵活。

2、MyBatis的配置:

1、第一个是: mybatis-config.xml:

        当然这配置文件的名字不是固定死的,只是大家都这么叫就随大流好吧,然后是这配置文件的存放位置,这边也是大家默认的存入放在资源路径下也就是Resource路径下,(该路径就是类的根路径)。




    
    
    
        
            
            
                
                
                
                
            
        
    
    
        
        
        
        
    
1、environments:

        代表环境可以是多个,以“s”结尾表示复数,也就是说mybatis的环境可以配置多个数据源。其中default属性表示默认使用的是哪个环境,default后面填写的是environment的id。default的值只需要和environment的id值一致即可。

        environment作为子标签,具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)i其中id表示给当前环境一个唯一标识,该标识用在environments的default后面,用来指定默认环境的选择。

2、transactionManager:

        配置事务管理器,type属性指定事务管理器具体使用什么方式,可选值包括:

  1. JDBC:使用JDBC原生的事务管理机制。
  2. MANAGED:交给其它容器来管理事务,比如WebLogic、JBOSS等。如果没有管理事务的容器,则没有事务。没有事务的含义:只要执行一条DML语句,则提交一次
3、dataSource:

        用于指定数据源(给程序提供连接对象),type属性用来指定具体使用的数据库连接池的策略,可选值包括三个:

UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用数据库连接池的思想。所以使用sqlsessionFactory创建sqlsesion会话的时候,每一次创建都是一个新的会话对象,这样效率低而其不安全。

POOLED:采用传统的javax.sql.DataSource规范中的连接池,每一次创建连接都是从连接池中获取连接,可以限制连接的个数。一般使用连接池的话,需要配置参数。

 
                
                
                
                
                
                
                

 

JNDI:使用其他第三方的数据库连接池

mappers:在mappers标签中可以配置多个sql映射文件的路径。

  • mapper:配置某个sql映射文件的路径
    • resource属性:使用相对于类路径的资源引用方式
    • url属性:使用完全限定资源定位符(URL)方式

2、第二个是:XXXMpaper.xml

        当然这个也是不确定的,一样的性质!操作数据库的文件,按照自己的需求进行修改。




    
        insert into  t_car (id,car_num,brand,guide_price,produce_time,car_type)
        values (null,'1220','BYD秦',20,'2020-1-1','电动车')
        

3、MyBatis完成CRUD:

1、Create(增):


        insert into  t_car (id,car_num,brand,guide_price,produce_time,car_type)
        values (null,#{carNum},#{brand},#{guidingPrice},#{produceTime},#{carType})
        /*类的属性名*/
        

 Car类:

public class Car {
    private  Long id;
    private  String brand;
    private  String carNum;
    private  Double guidingPrice;
    private  String produceTime;
    private String carType;}

主要是根据get和set方法。

测试类:

 //插入数据
    @Test
    public void test4(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        Car car=new Car(null,"仰望U8","2222",90.0,"2022-2-2","混动");

        sqlSession.insert("insertCar",car);//sql语句的id,对象
        sqlSession.commit();
        sqlSession.close();
    }

2、delete(删):


        delete from  t_car where id =#{id}
    
   //删除数据
    @Test
    public void test5(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        sqlSession.delete("deleteByID",176);
        sqlSession.commit();
        sqlSession.close();
    }

3、update(改)


        update t_car set  car_num=#{carNum}, brand=#{brand}, guide_price=#{guidingPrice},car_type=#{carType} ,produce_time=#{produceTime} where id=#{id}
    
//修改数据
    @Test
    public void test6(){
        SqlSession sqlSession = SqlSessionUtil.openSession();

        Car car = new Car(177L,"雪铁龙","3457",12.1,"2019-6-9","燃油");
        sqlSession.update("updateCar",car);
        sqlSession.commit();
        sqlSession.close();
    }

4、select(查): 

 查一个:

其中查询的配置文件中resultType指定啦查询结果封装的对象。这里有一个问题,查询的结果集的列名,有时候会和我们的定义类的属性不一致,就会导致数据封装的时候,会出现有的属性的值没有被封装上。所以面对不一致的时候我们要进行重命名

//查找数据 一条
    @Test
    public void test4(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        Object car = sqlSession.selectOne("selectById", 179);
        System.out.println(car);
        sqlSession.close();
    }

查全部:

//查找数据 一条
    @Test
    public void test5(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        List selectAll = sqlSession.selectList("selectAll");
        for (Object o : selectAll) {
            System.out.println(o);
        }
        sqlSession.close();
    } 
  

 4、javassist:

        JavaAssist(也称为Javassist)是一个用于Java编程语言的开源库,用于在运行时操作Java字节码。它提供了一种方便的方法来动态生成、修改、检查和操作Java类,而不需要直接编辑源代码。

以下是JavaAssist的一些关键特点和用途:

  1. 字节码操作:JavaAssist允许开发人员以编程方式操作Java字节码,包括创建新的类、方法、字段,以及修改现有的类的字节码。

  2. 动态代理:开发人员可以使用JavaAssist轻松创建动态代理类,这对于实现AOP(面向切面编程)和代理模式非常有用。

  3. 类加载器:JavaAssist支持使用自定义类加载器加载动态生成的类,这对于隔离不同类的定义非常有用。

  4. 运行时代码生成:JavaAssist允许在运行时生成新的类和方法,这对于一些特定的应用程序需求非常有用,如动态代码生成。

  5. 安全性:JavaAssist通常用于系统开发和调试,因此需要小心使用,以确保不会引入安全漏洞。

  6. 性能:虽然JavaAssist提供了强大的动态代码生成功能,但在某些情况下,由于动态生成的代码需要在运行时被解释,可能会对性能产生一定的影响。

  7. 开发框架支持:JavaAssist常常用于支持许多Java框架,如ORM(Object-Relational Mapping)框架,Web框架,以及一些测试框架。

JavaAssist的使用场景包括但不限于:

  • 动态代理:创建动态代理以实现横切关注点,如日志记录、性能监测等。

  • ORM框架:许多ORM框架使用JavaAssist来创建和修改实体类的字节码,以实现持久性。

  • AOP框架:AOP框架使用JavaAssist来注入切面逻辑。

  • 动态生成代码:某些应用程序需要在运行时生成和加载Java代码,JavaAssist提供了一种便捷的方式来实现这一需求

5、MyBatis的参数处理:

你可能感兴趣的:(Mybatis,mybatis)