mybatis —— ORM框架

一、什么是框架

        框架是一种经过校验、具有一定功能的半成品软件品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度。        

二、什么是ORM

        ORM,即 Object-Relational Mapping (对象关系映射),它的作用是在关系型数据库和业务实体 对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的 SQL 语句打交 道,只需简单的操作对象的属性和方法。

三、什么是mybatis框架? 

        MyBatis 是支持普通 SQL 查询存储过程高级映射的优秀==ORM框架==。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录. 半自动化框架。必须写sql语句。

        mybatis可以向PreparedStatement中输入参数自动进行输入映射,将查询结果集灵活的映射成Java对象(输出映射),输入映射和输出映射这是mybatis的核心

        用一句话来说, mybatis就是封装与数据库交互的半成品。

1、如何使用mybatis

        准备条件就是需要先建一个数据

                create database mybatis;
                use mybatis;
                CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME
                VARCHAR(20), age INT);
                INSERT INTO users(NAME, age) VALUES('Tom', 12);
                INSERT INTO users(NAME, age) VALUES('Jack', 11);

        (1)创建一个maven的java工程

mybatis —— ORM框架_第1张图片

         (2)引入mybatis的jar包和 mysql的驱动jar包

mybatis —— ORM框架_第2张图片

         (3)创建相应的实体类

mybatis —— ORM框架_第3张图片

         (4)配置mybatis的配置文件---mybatis会读取该文件的内容完成连接数据库的功能

mybatis —— ORM框架_第4张图片

        (5)编写相应的映射(mapper)文件  -----sql语句 实体类与表的映射

mybatis —— ORM框架_第5张图片

        (6)把映射文件引入到mybatis配置文件中

mybatis —— ORM框架_第6张图片

         (7)测试是否成功

mybatis —— ORM框架_第7张图片

        (8)CRUD操作 (增删改查)测试

mybatis —— ORM框架_第8张图片

2、实际开发中使用Dao

        (1)定义一个相关的Dao接口

mybatis —— ORM框架_第9张图片

         (2)映射文件(mapper)

mybatis —— ORM框架_第10张图片

 注意: namespace必须和接口所在的路径对应。id必须和方法名一致

        (3)测试

mybatis —— ORM框架_第11张图片

         (4)注意红框位置(mybatis03)mybatis —— ORM框架_第12张图片

mybatis —— ORM框架_第13张图片

3、传递多个参数

        图中非注释区域对应的是自定义参数名 @Param("参数名")mybatis —— ORM框架_第14张图片

4、特殊字符

        (1)常见的特殊字符

mybatis —— ORM框架_第15张图片

         (2)解决方式有两种

                        ①是转义字符,如上图所示                  

                       ②是使用

mybatis —— ORM框架_第16张图片

5、mybatis的优化

        (1)引入db属性文件。

                ①定义一个数据库属性文件   . properties

mybatis —— ORM框架_第17张图片

                ②在mybatis配置文件中引入属性文件并使用相应的key

mybatis —— ORM框架_第18张图片

         (2)引入日志文件 ——更好的显示sql语句

                        ①引入日志jar包

mybatis —— ORM框架_第19张图片

                         ②引入日志的配置文件 log4j.properties

mybatis —— ORM框架_第20张图片

               输出到日志文件

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

        (3)解决列名和属性名不一致

                        ①为查询的列起别名;让别名和属性名一致

                        ②使用resultMap标签 来完成属性和列的映射关系


    
        
        
        
        
        
        
    
    

        追加:事务

        什么是事务:事务是由一系列动作组成,这些动作要么都完成,要么都不完成。

                              jdbc默认事务是自动提交。现在mybatis事务需要手动提交。      

//转账问题
Connection connection=null;
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    connection= DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai",
            "root","root");
    connection.setAutoCommit(false);
    PreparedStatement ps=connection.prepareStatement("update users set age=age-10 where name='张天龙'");
    ps.executeUpdate();

    ps=connection.prepareStatement("update users set age=age+10 where name='汪伟宁'");
    ps.executeUpdate();
    //connection.commit();//提交
}catch (Exception e){
    try {
        connection.rollback();//回滚
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    e.printStackTrace();
}finally {

}

6、链表查询

          (1)多对一  ①链表查询  ②嵌套查询



        
        
        
        
             
        
        
            
            
        
    
    

    
        
    

    


    
        
        
        
        
        
        
    column="depton" select="com.ljm.dao.DeptDao.selectById"                                                  
            

        
    
    

         (2)一对多

<--链表查询-->

        
        
        
        
            
        
    
    

 7、动态sql语句

sql语句根据条件而发生改变
元素 作用 描述
if 条件判断 单条件判断
choose(when、otherwise) 条件选择,相当于java when 多条件分支判断
where、set 辅助 处理sql拼接语句
foreach 循环 循环

        
        
        
        
        
    

                (1)if和where一起用


    
    


<--测试-->
@Test
    public void test(){
        BookDao bookDao = session.getMapper(BookDao.class);
        HashMap map = new HashMap();
        map.put("bookname","西游记");
        map.put("author","吴承恩");
        List list = bookDao.findByCondition(map);
        //System.out.println(list);
    }

                 (2)[choose when otherwise] 和where


    

<--测试-->
@Test
    public void test1(){
        BookDao bookDao = session.getMapper(BookDao.class);
        HashMap map = new HashMap();
        map.put("bookname","西游记");
        map.put("author","吴承恩");
        List list = bookDao.findByCondition(map);
        //System.out.println(list);
    }

                (3)set标签    修改部分字段


    
        update book_info
        
            
                book_name=#{name},
            
            
                book_author=#{author},
            
            
                book_pub=#{pub},
            
            
                book_price=#{price},
            

        
        where book_id=#{id}
    

<--测试-->
@Test
    public void testUpdate(){
        BookDao bookDao = session.getMapper(BookDao.class);
        Book book = new Book();
        book.setAuthor("罗贯中");
        book.setName("三国");
        book.setId(1010);
        bookDao.update(book);
        session.commit();
    }

                (4)foreach 批量删除


    
        delete from book_info where book_id in
        
            #{id}
        
    

<--测试-->
@Test
    public void batchDelete(){
        BookDao bookDao = session.getMapper(BookDao.class);
        int[] ids = {1001,1002,1003};
        bookDao.batchDelete(ids);
        session.commit();
    }

8、模糊查询


    

<--测试-->
//模糊查询
    @Test
    public void testFindAll(){
        EmpDao empDao = session.getMapper(EmpDao.class);
        List list = empDao.findAll01("老");
        System.out.println(list);
        //session.commit();
    }

9、分页插件

        (1) 引入相关的pageHelper依赖 pom


        
            com.github.pagehelper
            pagehelper
            5.1.11
        

        (2) 加入拦截  mybatis


    
        
        
            
            
        
    

        (3)测试

//测试分页
    @Test
    public void testFindAll1(){
        EmpDao empDao = session.getMapper(EmpDao.class);
        //使用分页功能
        PageHelper.startPage(2,8);
        List list = empDao.findAll01("老");
        //可以把查询的结果封装到PageInfo类中,包含总条数
        //PageInfo pageInfo = new PageInfo(list);
        //System.out.println("总数:"+pageInfo.getTotal());
        System.out.println(list);
    }

你可能感兴趣的:(java,maven,intellij-idea)