• Java EE学习笔记(六)


    初识MyBatis

    1、MyBatis的定义

    1)、MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。 

    2)、MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。

    3)、ORM框架的工作原理:

    4)、Hibernate与MyBatis的区别:

    2、MyBatis的工作原理

    3、MyBatis入门程序

    1)、查询客户:在实际开发中,查询操作通常都会涉及到单条数据的精确查询,以及多条数据的模糊查询

    2)、根据客户编号查询客户信息;根据客户名模糊查询客户信息。

    a)、创建mybatis数据库,并且插入3条数据:

    b)、由于MyBatis默认使用log4j输出日志信息,所以如果要查看控制台的输出SQL语句,那么就需要在classpath路径下配置其日志文件。在项目的src目录下创建log4j.properties文件。

    # Global logging configuration,全局的日志配置,Mybatis的日志配置和控制台输出,其中Mybatis的日志配置用于将com.itheima包下所有类的日志记录级别设置为DEBUG
    log4j.rootLogger=ERROR, stdout


    # MyBatis logging configuration...
    log4j.logger.com.itheima=DEBUG


    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    c)、src->com.itheima.po

    ①客户持久化类:Customer.java(属性字段与数据库中的表字段相对应)

     1 package com.itheima.po;
     2 /**
     3  * 客户持久化类
     4  */
     5 public class Customer { // 一个POJO(普通java对象)
     6     
     7     private Integer id;       // 主键id
     8     private String username; // 客户名称
     9     private String jobs;      // 职业
    10     private String phone;     // 电话
    11     
    12     public Integer getId() {
    13         return id;
    14     }
    15     
    16     public void setId(Integer id) {
    17         this.id = id;
    18     }
    19     
    20     public String getUsername() {
    21         return username;
    22     }
    23     
    24     public void setUsername(String username) {
    25         this.username = username;
    26     }
    27     
    28     public String getJobs() {
    29         return jobs;
    30     }
    31     
    32     public void setJobs(String jobs) {
    33         this.jobs = jobs;
    34     }
    35     
    36     public String getPhone() {
    37         return phone;
    38     }
    39     
    40     public void setPhone(String phone) {
    41         this.phone = phone;
    42     }
    43     
    44     @Override
    45     public String toString() {
    46         return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
    47     }
    48 }

    d)、src->com.itheima.mapper

    ①映射文件:CustomerMapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3                  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <!-- 以上是Mybatis映射文件的约束信息 -->                 
     5    
     6 <!-- <mapper>是根元素,包括一个属性namespace表示命名空间,通常会设置成“包名+SQL映射文件名”的形式 -->
     7 <mapper namespace="com.itheima.mapper.CustomerMapper">
     8 
     9     <!--子元素<select>中的信息是用于执行查询操作的配置,根据客户编号获取客户信息 -->
    10     <select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
    11         <!-- 其id属性是<select>元素在映射文件中的唯一标识
    12             属性parameterType:用于指定传入参数的类型
    13             属性resultType:用于指定返回结果的类型,这里表示返回的数据是Customer对象类型
    14             "#{}"用于表示一个占位符,相当于"?",而"#{id}"表示该占位符待接收参数的名称为id
    15          -->
    16         select * from t_customer where id = #{id}
    17     </select>
    18     
    19     <!--根据客户名模糊查询客户信息列表-->
    20     <select id="findCustomerByName" parameterType="String" resultType="com.itheima.po.Customer">
    21         <!-- select * from t_customer where username like '%${value}%' -->
    22         <!-- "${}"用来表示拼接SQL的字符串,即不加解释的原样输出,
    23             "${value}"表示要拼接的是简单类型参数
    24             注意:使用"${}"无法防止SQL注入问题,但可以做如下修改:使用concat()函数进行字符串拼接,这点需要注意
    25          -->
    26         select * from t_customer where username like concat('%',#{value},'%')
    27     </select>
    28     
    29     <!-- 添加客户信息,<insert>元素来实现 -->
    30     <insert id="addCustomer" parameterType="com.itheima.po.Customer">
    31         insert into t_customer(username,jobs,phone) 
    32         values(#{username},#{jobs},#{phone})
    33     </insert>
    34     
    35     <!-- 更新客户信息,<update>元素来实现 -->
    36     <update id="updateCustomer" parameterType="com.itheima.po.Customer">
    37         update t_customer set
    38         username=#{username},jobs=#{jobs},phone=#{phone}
    39         where id=#{id}
    40     </update>
    41     
    42     <!-- 删除客户信息,<delete>元素来实现 -->
    43     <delete id="deleteCustomer" parameterType="Integer">
    44         delete from t_customer where id=#{id}
    45     </delete>
    46 </mapper>

    e)、src->mybatis-config.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3                         "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4     <!-- 以上是Mybatis映射文件的约束信息 -->  
     5     
     6     <!-- 以下是开发人员需要配置的信息,都放在<configuration>元素中进行配置 -->
     7     
     8 <configuration>
     9     
    10     <!--1、配置环境 ,默认的环境id为mysql-->
    11     <environments default="mysql">
    12     
    13         <!--1.2、配置id为mysql的数据库环境 -->
    14         <environment id="mysql">
    15         
    16             <!-- 使用JDBC的事务管理 -->
    17             <transactionManager type="JDBC" />
    18             
    19             <!--数据库连接池 -->
    20             <dataSource type="POOLED">
    21             
    22               <property name="driver" value="com.mysql.jdbc.Driver" />
    23               <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
    24               <property name="username" value="root" />
    25               <property name="password" value="******" />
    26               
    27             </dataSource>
    28         </environment>
    29     </environments>
    30     
    31     <!--2、配置Mapper的位置 -->
    32     <mappers>
    33         <mapper resource="com/itheima/mapper/CustomerMapper.xml" />
    34     </mappers>
    35     
    36 </configuration>

    f)、src->com.itheima.test

    ①测试类:MybatisTest.java

      1 package com.itheima.test;
      2 import java.io.InputStream;
      3 import java.util.List;
      4 import org.apache.ibatis.io.Resources;
      5 import org.apache.ibatis.session.SqlSession;
      6 import org.apache.ibatis.session.SqlSessionFactory;
      7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      8 import org.junit.Test;
      9 import com.itheima.po.Customer;
     10 /**
     11  * 入门程序测试类
     12  */
     13 public class MybatisTest {
     14     /**
     15      * 根据客户编号查询客户信息
     16      */
     17     @Test
     18     public void findCustomerByIdTest() throws Exception {
     19         
     20         // 1、通过输入流读取配置文件
     21         String resource = "mybatis-config.xml";
     22         InputStream inputStream = Resources.getResourceAsStream(resource); 
     23         
     24         // 2、根据配置文件构建SqlSessionFactory工厂
     25         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     26         
     27         // 3、通过SqlSessionFactory工厂创建SqlSession对象
     28         SqlSession sqlSession = sqlSessionFactory.openSession();
     29         
     30         // 4、SqlSession执行映射文件中定义的SQL,并返回映射结果(执行查询操作)
     31         // 参数1:表示映射SQL的标识字符串,它由CustomerMapper.xml中<mapper>元素的namespace属性值+<select>元素的id属性值组成
     32         // 参数2:表示查询所需要的参数
     33         Customer customer = sqlSession.selectOne("com.itheima.mapper.CustomerMapper.findCustomerById", 1);
     34         
     35         // 5、打印输出结果
     36         System.out.println(customer.toString());
     37         
     38         // 6、关闭SqlSession
     39         sqlSession.close();
     40     }
     41     
     42     
     43     /**
     44      * 根据用户名称来模糊查询用户信息列表
     45      */
     46     @Test
     47     public void findCustomerByNameTest() throws Exception{    
     48         
     49         // 1、通过输入流读取配置文件
     50         String resource = "mybatis-config.xml";
     51         InputStream inputStream = Resources.getResourceAsStream(resource);
     52         
     53         // 2、根据配置文件构建SqlSessionFactory工厂
     54         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     55        
     56         // 3、通过SqlSessionFactory创建SqlSession对象
     57         SqlSession sqlSession = sqlSessionFactory.openSession();
     58         
     59         // 4、SqlSession执行映射文件中定义的SQL,并返回映射结果(返回集合对象,查询的结果为多条语句)
     60         List<Customer> customers = sqlSession.selectList("com.itheima.mapper.CustomerMapper.findCustomerByName", "j");
     61         
     62         for (Customer customer : customers) {
     63             //打印输出结果集
     64             System.out.println(customer);
     65         }
     66         // 5、关闭SqlSession
     67         sqlSession.close();
     68     }
     69     
     70     
     71     /**
     72      * 添加客户
     73      */
     74     @Test
     75     public void addCustomerTest() throws Exception{        
     76         
     77         // 1、读取配置文件
     78         String resource = "mybatis-config.xml";
     79         InputStream inputStream = Resources.getResourceAsStream(resource);
     80         
     81         // 2、根据配置文件构建SqlSessionFactory工厂
     82         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     83         
     84         // 3、通过SqlSessionFactory创建SqlSession对象
     85         SqlSession sqlSession = sqlSessionFactory.openSession();
     86         
     87         // 4、SqlSession执行添加操作
     88         // 4.1先创建Customer对象,并向对象中添加数据
     89         Customer customer = new Customer();
     90         customer.setUsername("rose");
     91         customer.setJobs("student");
     92         customer.setPhone("13333533092");
     93         
     94         // 4.2执行SqlSession的插入方法,返回的是SQL语句影响的行数
     95         int rows = sqlSession.insert("com.itheima.mapper.CustomerMapper.addCustomer", customer);
     96         
     97         // 4.3通过返回结果判断插入操作是否执行成功
     98         if(rows > 0){
     99             System.out.println("您成功插入了"+rows+"条数据!");
    100         }else{
    101             System.out.println("执行插入操作失败!!!");
    102         }
    103         
    104         // 4.4提交事务
    105         sqlSession.commit();
    106         
    107         // 5、关闭SqlSession
    108         sqlSession.close();
    109     }
    110 
    111     /**
    112      * 更新客户
    113      */
    114     @Test
    115     public void updateCustomerTest() throws Exception{        
    116         
    117         // 1、读取配置文件
    118         String resource = "mybatis-config.xml";
    119         InputStream inputStream = Resources.getResourceAsStream(resource);
    120         
    121         // 2、根据配置文件构建SqlSessionFactory工厂
    122         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    123         
    124         // 3、通过SqlSessionFactory创建SqlSession对象
    125         SqlSession sqlSession = sqlSessionFactory.openSession();
    126         
    127         // 4、SqlSession执行更新操作
    128         // 4.1创建Customer对象,对对象中的数据进行模拟更新
    129         Customer customer = new Customer();
    130         customer.setId(1);
    131         customer.setUsername("rose");
    132         customer.setJobs("programmer");
    133         customer.setPhone("13311111111");
    134         
    135         // 4.2执行SqlSession的更新方法,返回的是SQL语句影响的行数
    136         int rows = sqlSession.update("com.itheima.mapper.CustomerMapper.updateCustomer", customer);
    137         
    138         // 4.3通过返回结果判断更新操作是否执行成功
    139         if(rows > 0){
    140             System.out.println("您成功修改了"+rows+"条数据!");
    141         }else{
    142             System.out.println("执行修改操作失败!!!");
    143         }
    144         
    145         // 4.4、提交事务
    146         sqlSession.commit();
    147         
    148         // 5、关闭SqlSession
    149         sqlSession.close();
    150     }
    151 
    152     /**
    153      * 删除客户
    154      */
    155     @Test
    156     public void deleteCustomerTest() throws Exception{        
    157         
    158         // 1、读取配置文件
    159         String resource = "mybatis-config.xml";
    160         InputStream inputStream = Resources.getResourceAsStream(resource);
    161        
    162         // 2、根据配置文件构建SqlSessionFactory工厂
    163         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    164         
    165         // 3、通过SqlSessionFactory创建SqlSession对象
    166         SqlSession sqlSession = sqlSessionFactory.openSession();
    167         
    168         // 4、SqlSession执行删除操作
    169         // 4.1执行SqlSession的删除方法,返回的是SQL语句影响的行数
    170         int rows = sqlSession.delete("com.itheima.mapper.CustomerMapper.deleteCustomer", 5);
    171         
    172         // 4.2通过返回结果判断删除操作是否执行成功
    173         if(rows > 0){
    174             System.out.println("您成功删除了"+rows+"条数据!");
    175         }else{
    176             System.out.println("执行删除操作失败!!!");
    177         }
    178         
    179         // 4.3、提交事务,表示已经完成了对数据库的操作
    180         sqlSession.commit();
    181         
    182         // 5、关闭SqlSession(会话对象)
    183         sqlSession.close();
    184     }
    185 
    186 }

    ②运行结果:

    根据客户编号查询用户id为1的信息:

    根据客户名模糊查询客户表中客户名称带有"j"的两条信息。

    添加一条客户(id为4)信息:

    更新用户id为4的信息:

    删除用户id为4的一条记录:

    个人总结:

    Mybatis操作大致可以分为以下几个步骤:

    1)、用输入流读取配置(mybatis-config)文件;

    2)、通过配置文件创建SqlSessionFactory会话工厂;

    3)、通过SqlSessionFactory创建SqlSession会话对象;

    a)、可以创建用户实现类(作为sql方法的参数)对用户数据的“增改”操作,然后通过创建出来的SqlSession对象去执行sql方法。

    4)、使用SqlSession对象(mybatis底层通过Executor接口,其会根据SqlSession传递的参数动态生成执行的SQL语句,同时负责查询缓存的维护)操作数据库。

    5)、关闭SqlSession会话对象。

  • 相关阅读:
    C语言利用fgetc复制拷贝文件内容
    linux 安装gcc 和 g++
    C宏定义和使用
    C的realloc的动态分配扩展和缩小内存
    C用malloc 向系统申请一个大小为n*4个字节的内存块
    GDB core命令的使用调试段错误
    GDB的安装
    C字符指针数组的使用
    C二维字符数组的使用及如何获取二维数组的总行数和总列数!
    C二维数组用指针地址遍历
  • 原文地址:https://www.cnblogs.com/acgoto/p/10612682.html
Copyright © 2020-2023  润新知