• 售前

  • 售后

热门帖子
入门百科

Mybatis【适用于初学者】

[复制链接]
Mionsterv 显示全部楼层 发表于 2022-1-13 11:59:38 |阅读模式 打印 上一主题 下一主题
MyBatis

什么是MyBatis框架

   MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 JDBC,开发者只需要关注 sql 语句本身,
  而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。
  MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,
  并通过 java 对象和 sql 的动态参数进行映射生成最终执行的 sql 语句,
  最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
  框架是什么

   框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;
  另一种认为,框架是可被应用开发者定制的应用骨架、模板。
  简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。
  从另一个角度来说框架是一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。
  框架安全的,可复用的,不断升级的软件。
  框架解决的问题

   框架要解决的最重要的一个问题是技术整合。
  框架把相关的技术融合在一起,企业开发可以集中在业务领
  域方面。
  另一个方面可以提供开发的效率。
  JDBC编程的回顾

   可以看之前总结的这篇博客
  使用JDBC编程的缺点



  • 代码比较多,开发效率低
  • 需要关注 Connection ,Statement, ResultSet 对象的创建和销毁
  • 对 ResultSet 查询的结果,需要自己封装为 List
  • 重复的代码比较多
  • 业务代码和数据库的操作混在一起
MyBatis解决的主要问题

   减轻使用 JDBC 的复杂性,不用编写重复的代码创建 Connetion , Statement ;
  不用编写关闭资源代码。
  直接使用 java 对象,表示结果数据。让开发者专注 SQL 的处理。 其他分心的工作由 MyBatis 代劳。
  MyBatis 可以完成:

  • 注册数据库的驱动,例如
  1. Class.forName(“com.mysql.jdbc.Driver”))
复制代码

  • 创建 JDBC 中必须使用的 Connection , Statement, ResultSet 对象
  • 从 xml 中获取 sql,并执行 sql 语句,把 ResultSet 结果转换 java 对象
  1. List<Student> list = new ArrayLsit<>();
  2. ResultSet rs = state.executeQuery(“select * from student”);
  3. while(rs.next){
  4. Student student = new Student();
  5. student.setName(rs.getString(“name”));
  6. student.setAge(rs.getInt(“age”));
  7. list.add(student);
  8. }
复制代码

  • 关闭资源
  1. ResultSet.close() , Statement.close() , Conenection.close()
复制代码
搭建MyBatis开发环境


  • 建表
  • 引入依赖【MyBatis依赖,Mysql驱动】
  • 创建实体类【类的属性名要与表的列名一致】【表的每一行,都可以封装为一个对象】【面向对象的思想】
  • 创建持久层的DAO接口
  • 创建sql映射文件【写sql语句的,MyBatis会执行这些sql语句】,是一个xml文件。
    一般一个表一个sql映射文件。
  • 创建MyBatis主配置文件,主配置文件提供了数据库的连接信息和slq映射文件的位置信息。
    一个项目就一个主配置文件。
具体搭建过程


    1. CREATE TABLE `student` (
    2. `id` int(11) NOT NULL ,
    3. `name` varchar(255) DEFAULT NULL,
    4. `email` varchar(255) DEFAULT NULL,
    5. `age` int(11) DEFAULT NULL,
    6. PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    复制代码
    1. <dependencies>
    2. <dependency>
    3. <groupId>junit</groupId>
    4. <artifactId>junit</artifactId>
    5. <version>4.11</version>
    6. <scope>test</scope>
    7. </dependency>
    8.    
    9. <dependency>
    10. <groupId>org.mybatis</groupId>
    11. <artifactId>mybatis</artifactId>
    12. <version>3.5.1</version>
    13. </dependency>
    14.    
    15. <dependency>
    16. <groupId>mysql</groupId>
    17. <artifactId>mysql-connector-java</artifactId>
    18. <version>5.1.9</version>
    19. </dependency>
    20. </dependencies>
    21. <build>
    22. <resources>
    23. <resource>
    24. <directory>src/main/java</directory><!--所在的目录-->
    25. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
    26. <include>**/*.properties</include>
    27. <include>**/*.xml</include>
    28. </includes>
    29. <filtering>false</filtering>
    30. </resource>
    31. </resources>
    32. </build>
    复制代码
    1. public class Student {
    2.      //属性名和列名一样
    3.      private Integer id;
    4.      private String name;
    5.      private String email;
    6.      private Integer age;
    7.      // set , get , toString
    8. }
    复制代码
    1. public interface StudentDao {
    2.      /*查询所有数据*/
    3.      List<Student> selectStudents();
    4. }
    复制代码
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <!--
    6. namespace:必须有值,自定义的唯一字符串
    7. 推荐使用:dao 接口的全限定名称
    8. --> <mapper namespace="com.xxx.dao.StudentDao">
    9. <!--
    10. <select>: 查询数据, 标签中必须是 select 语句
    11. id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称,
    12. 使用名称表示要执行的 sql 语句
    13. resultType: 查询语句的返回结果数据类型,使用全限定类名
    14. -->
    15. <select id="selectStudents" resultType="com.xxx.entity.Student">
    16. <!--要执行的 sql 语句-->
    17.      select id,name,email,age from student
    18. </select>
    19. </mapper>
    复制代码
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
    5. <!--配置 mybatis 环境-->
    6. <environments default="mysql">
    7. <!--id:数据源的名称-->
    8. <environment id="mysql">
    9. <!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
    10. <transactionManager type="JDBC"/>
    11. <!--数据源 dataSource:创建数据库 Connection 对象
    12. type: POOLED 使用数据库的连接池
    13. -->
    14. <dataSource type="POOLED">
    15. <!--连接数据库的四个要素-->
    16.      <property name="driver" value="com.mysql.jdbc.Driver"/>
    17.      <property name="url" value="jdbc:mysql://localhost:3306/student"/>
    18.      <property name="username" value="root"/>
    19.      <property name="password" value="123456"/>
    20. </dataSource>
    21. </environment>
    22. </environments>
    23.      
    24. <mappers>
    25. <!--告诉 mybatis 要执行的 sql 语句的位置-->
    26.      <mapper resource="com/xxx/dao/StudentDao.xml"/>
    27. </mappers>
    28. </configuration>
    复制代码
    1. @Test
    2. public void testMyBatis() throws IOException {
    3.      //1.mybatis 主配置文件
    4.      String config = "mybatis-config.xml";
    5.      //2.读取配置文件
    6.      InputStream in = Resources.getResourceAsStream(config);
    7.      //3.创建 SqlSessionFactory 对象,目的是获取 SqlSession
    8.      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    9.      //4.获取 SqlSession,SqlSession 能执行 sql 语句
    10.      SqlSession session = factory.openSession();
    11.      //5.执行 SqlSession 的 selectList()
    12.      List<Student> studentList =
    13.      session.selectList("com.xxx.dao.StudentDao.selectStudents");//namespace + id
    14.      //6.循环输出查询结果
    15.      studentList.forEach( student -> System.out.println(student));
    16.      //7.关闭 SqlSession,释放资源
    17.      session.close();
    18. }
    复制代码
MyBatis配置文件



  • dataSource 标签

    • dataSource 类型

      • UNPOOLED: 不使用连接池的数据源
      • POOLED: 使用连接池的数据源
      • JNDI: 使用 JNDI 实现的数据源
      <?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>
          <--!使用properties标签--/>
          <properties resource="jdbc.properties" />  其中 UNPOOLED ,POOLED 数据源实现了 javax.sq.DataSource 接口,
            JNDI 和前面两个实现方式不同,了解就可以。
            
    • dataSource 配置
      1. <dataSource type="POOLED">
      2.      <!--连接数据库的四个要素-->
      3.      <property name="driver" value="com.mysql.jdbc.Driver"/>
      4.      <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
      5.      <property name="username" value="root"/>
      6.      <property name="password" value="123456"/>
      7. </dataSource>
      复制代码

  • 事务

    • 默认需要手动提交事务

      • <?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>
            <--!使用properties标签--/>
            <properties resource="jdbc.properties" />      Mybatis 框架是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的 Connection对象的 commit(), rollback()
                Connection 对象的 setAutoCommit()方法来设置事务提交方式的。自动提交和手工提交。 -
        1. [/code]
        2. [*]<?xml version="1.0" encoding="UTF-8" ?>
        3. <!DOCTYPE configuration
        4. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        5. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        6. <configuration>
        7.     <--!使用properties标签--/>
        8.     <properties resource="jdbc.properties" />      JDBC:使用 JDBC 的事务管理机制。即通过 Connection 的 commit()方法提交,通过 rollback()方法回滚。
        9.         但默认情况下,MyBatis 将自动提交功能关闭了,改为了手动提交。即程序中需要显式的对事务进行提交或回滚。
        10. [*]<?xml version="1.0" encoding="UTF-8" ?>
        11. <!DOCTYPE configuration
        12. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        13. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        14. <configuration>
        15.     <--!使用properties标签--/>
        16.     <properties resource="jdbc.properties" />      MANAGED:由容器来管理事务的整个生命周期(如 Spring 容器)
        17. [/list]
        18. [*] 自动提交事务
        19. [list]
        20. [*]<?xml version="1.0" encoding="UTF-8" ?>
        21. <!DOCTYPE configuration
        22. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        23. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        24. <configuration>
        25.     <--!使用properties标签--/>
        26.     <properties resource="jdbc.properties" />      设置自动提交的方式,factory 的 openSession() 分为有参数和无参数的。
        27.         有参数为 true,使用自动提交 session = [i]factory[/i].openSession([b]true[/b])
        28. [/list]
        29. [/list]
        30. [*] 使用数据库属性配置文件【properties文件】([b]解耦合[/b])
        31. [list]
        32. [*]<?xml version="1.0" encoding="UTF-8" ?>
        33. <!DOCTYPE configuration
        34. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        35. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        36. <configuration>
        37.     <--!使用properties标签--/>
        38.     <properties resource="jdbc.properties" />  为了方便对数据库连接的管理,DB 连接四要素数据一般都是存放在一个专门的属性文件中的。MyBatis主配置文件需要从这个属性文件中读取这些数据。
        39. [list]
        40. [*] [b]在[/b] [b]classpath[/b] [b]路径下,创建[/b] [b]properties[/b] [b]文件[/b]
        41. [list]
        42. [*] 在 resources 目录创建 jdbc.properties 文件,文件名称自定义。
        43. [*] [code]jdbc.driver=com.mysql.jdbc.Driver
        44. jdbc.url=jdbc:mysql://localhost:3306/ssm?charset=utf-8
        45. jdbc.username=root
        46. jdbc.password=root
        复制代码

    • 使用 properties 标签

        1. <?xml version="1.0" encoding="UTF-8" ?>
        2. <!DOCTYPE configuration
        3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        5. <configuration>
        6.     <--!使用properties标签--/>
        7.     <properties resource="jdbc.properties" />
        复制代码

    • 使用 key 指定值

        1. <?xml version="1.0" encoding="UTF-8" ?>
        2. <!DOCTYPE configuration
        3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        5. <configuration>
        6.     <--!使用properties标签--/>
        7.     <properties resource="jdbc.properties" /><?xml version="1.0" encoding="UTF-8" ?>
        8. <!DOCTYPE configuration
        9. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        10. "http://mybatis.org/dtd/mybatis-3-config.dtd">
        11. <configuration>
        12.     <--!使用properties标签--/>
        13.     <properties resource="jdbc.properties" />  
        复制代码



  • mappers【映射器】

    • < mapper resource=" " />

      • <?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>
            <--!使用properties标签--/>
            <properties resource="jdbc.properties" />      使用相对于类路径的资源,从 classpath 路径查找文件

    • < package name=""/>

      • <?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>
            <--!使用properties标签--/>
            <properties resource="jdbc.properties" />      指定包下的所有 Dao 接口
      • <?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>
            <--!使用properties标签--/>
            <properties resource="jdbc.properties" />      注意:此种方法要求 Dao 接口名称和 mapper 映射文件名称相同,且在同一个目录中。


    MyBatis 使用传统 Dao 开发方式

    创建工具类

    1. public class MyBatisUtil {
    2.         //定义 SqlSessionFactory
    3.         private static SqlSessionFactory factory = null;
    4.         static {
    5.         //使用 静态块 创建一次 SqlSessionFactory
    6.         try{
    7.                 String config = "mybatis-config.xml";
    8.         //读取配置文件
    9.                 InputStream in = Resources.getResourceAsStream(config);
    10.          //创建 SqlSessionFactory 对象
    11.                 factory = new SqlSessionFactoryBuilder().build(in);
    12.         } catch (Exception e){
    13.                 factory = null;
    14.                 e.printStackTrace();
    15.         }
    16. }
    17.          /* 获取 SqlSession 对象 */
    18.         public static SqlSession getSqlSession(){
    19.                 SqlSession session = null;
    20.                 if( factory != null){
    21.                         session = factory.openSession();
    22.                 }
    23.                 return session;
    24.         }
    25. }
    复制代码
    DAO开发

    1. (1)创建 Dao 接口实现类
    2. public class StudentDaoImpl implements StudentDao
    3. (2)实现接口中 select 方法
    4. public List<Student> selectStudents() {
    5.     SqlSession session = MyBatisUtil.getSqlSession();
    6.     List<Student> studentList = session.selectList(
    7.         "com.xxx.dao.StudentDao.selectStudents");
    8.     session.close();
    9.     return studentList;
    10. }
    11. 测试查询操作:
    12. // MyBatisTest 类中创建 StudentDaoImpl 对象
    13. public class MyBatisTest {
    14. @Test
    15. public void testSelect() throws IOException {
    16.     StudentDao studentDao = new StudentDaoImpl();
    17.     List<Student> studentList = studentDao.selectStudents();
    18.     studentList.forEach( stu -> System.out.println(stu));
    19. }
    复制代码
    传统 Dao 开发方式的分析

       在前面例子中自定义 Dao 接口实现类时发现一个问题:
      Dao 的实现类其实并没有干什么实质性的工作,
      它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id 的 SQL 语句,
      真正对 DB 进行操作的工作其实是由框架通过 mapper 中的 SQL 完成的。
      所以,MyBatis 框架就抛开了 Dao 的实现类,直接定位到映射文件 mapper 中的相应 SQL 语句,
      对DB 进行操作。
    这种对 Dao 的实现方式称为 Mapper 的动态代理方式。
      Mapper 动态代理方式无需程序员实现 Dao 接口。
      接口是由 MyBatis 结合映射文件自动生成的动态代理实现的。
      MyBatis动态代理

       我们不再需要编写DAO接口的实现类,只需调用 SqlSession 的 getMapper()方法,即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值。
    1. StudentDao studentDao = MyBatisUtil.getSqlSession().getMapper(StudentDao.class);
    复制代码
    使用DAO代理对象执行sql语句

    1. select 方法:
    2. @Test
    3. public void testSelect() throws IOException {
    4.      List<Student> studentList = studentDao.selectStudents();
    5.      studentList.forEach( stu -> System.out.println(stu));
    6. }
    7. insert 方法:
    8. @Test
    9. public void testInsert() throws IOException {
    10.      Student student = new Student();
    11.      student.setId(1006);
    12.      student.setName("林浩");
    13.      student.setEmail("linhao@163.com");
    14.      student.setAge(26);
    15.      int nums = studentDao.insertStudent(student);
    16.      System.out.println("使用 Dao 添加数据:"+nums);
    17. }
    18. update 方法
    19. @Test
    20. public void testUpdate() throws IOException {
    21.      Student student = new Student();
    22.      student.setId(1006);
    23.      student.setAge(28);
    24.      int nums = studentDao.updateStudent(student);
    25.      System.out.println("使用 Dao 修改数据:"+nums);
    26. }
    27. delete 方法
    28. @Test
    29. public void testDelete() throws IOException {
    30.      int nums = studentDao.deleteStudent(1006);
    31.      System.out.println("使用 Dao 修改数据:"+nums);
    32. }
    复制代码
    原理

       这里解释了上面为什么要推荐namespace的值写为: dao接口的全限定名称
      id的值写为:dao 接口中方法名称
      只有这样MyBatis才能准确的知道你要执行的sql语句是什么
        JDK的动态代理
      深入理解参数

    parameterType

       接口中的方法参数的类型, Java的数据类型的全限定名称或MyBatis定义的别名。
      这个属性是可选的,因为 MyBatis通过反射机制能够发现接口方法参数的类型。
      MyBatis 传递参数

    一个简单类型的参数:

       简单类型:MyBatis把基本数据类型和String都叫做简单类型。
        使用:#{任意字符},和方法的参数无关。
      使用#{}之后,MyBatis执行sql语句使用的是PreparedStatement对象。
      关于PreparedStatement对象的使用,可以看这篇博客
      多个参数:



    • 使用@param
       在方法形参前面加入@Param(“自定义参数名”),mapper 文件使用#{自定义参数名}。
    1. 接口方法:
    2. List<Student> selectMultiParam(@Param("personName") String name,
    3. @Param("personAge") int age);
    4. mapper 文件:
    5. <select id="selectMultiParam" resultType="com.xxx.domain.Student">
    6.      select id,name,email,age from student where name= #{personName} or
    7.      age= #{personAge}
    8. </select>
    复制代码


    • 使用对象
       使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。
      语法格式: #{ property, javaType=java 中数据类型名, jdbcType=数据类型名称 }
      javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property 【对象的属性名】}
      

    • 按位置(了解)
       参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是#{arg0}, 第二个是#{arg1}
      注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。
      

    • 使用Map(了解)
       Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数。Map 集合使用 String的 key,
      Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值。
    1. 例如:
    2. Map<String,Object> data = new HashMap<String,Object>();
    3. data.put(“myname”,”xxx");
    4. data.put(“myage”,20);
    5. 接口方法:
    6. List<Student> selectMultiMap(Map<String,Object> map);
    7. mapper 文件:
    8. <select id="selectMultiMap" resultType="com.xxx.domain.Student">
    9.      select id,name,email,age from student where name=#{myname} or age =#{myage}
    10. </select>
    复制代码
    **#**和$

       #:占位符,告诉 mybatis 使用实际的参数值代替。并使用PrepareStatement对象执行 sql 语句,
      #{…}代替sql 语句的“?”。这样做更安全【能避免sql注入】,更迅速,效率高,通常也是首选做法。
        **<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource><?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>
        <--!使用properties标签--/>
        <properties resource="jdbc.properties" /> ∗<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>∗<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>【<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>∗<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>∗<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>字<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>符<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>串<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>替<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>换<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>∗<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>∗<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>】<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>:<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>告<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>诉<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>m<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>y<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>b<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>a<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>t<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>i<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>s<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>使<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>用<dataSource type="POOLED">
         <!--连接数据库的四个要素-->
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
    </dataSource>     ** 【**字符串替换**】:告诉 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>
        <--!使用properties标签--/>
        <properties resource="jdbc.properties" /><?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>
        <--!使用properties标签--/>
        <properties resource="jdbc.properties" />∗∗【∗∗字符串替换∗∗】:告诉mybatis使用包含的"字符串"替换所在位置。使用Statement把sql语句
      和${}的内容连接起来。主要用在替换表名,列名,不同列排序等操作。
      但是具有sql注入的风险。详见这篇博客
      封装 MyBatis 输出结果

    定义别名

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6.     <--!使用properties标签--/>
    7.     <properties resource="jdbc.properties" /><?xml version="1.0" encoding="UTF-8" ?>
    8. <!DOCTYPE configuration
    9. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    10. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    11. <configuration>
    12.     <--!使用properties标签--/>
    13.     <properties resource="jdbc.properties" />
    复制代码
    resultType

       执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集合,
      那应该设置为集合中的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。
      

    • 简单类型
    1. // 接口方法:
    2. int countStudent();
    3. mapper 文件:
    4. <select id="countStudent" resultType="int">
    5.      select count(*) from student
    6. </select>
    7. // 测试方法:
    8. @Test
    9. public void testRetunInt(){
    10.      int count = studentDao.countStudent();
    11.      System.out.println("学生总人数:"+ count);
    12. }
    复制代码


    • 对象类型

      • 处理方法:

        • MyBatis执行sql语句,然后调用类的无参构造方法,创建对象。
        • MyBatis把ResultSet指定的列值赋值给同名的属性名。


    • Map
       sql 的查询结果作为 Map 的 key 和 value。推荐使用 Map。
      注意:Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录是错误。
      resultMap

       resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。
      常用在列名和 java 对象属性名不一样的情况。
      使用方式:
      1.先定义 resultMap,指定列名和属性的对应关系。
      2.在中把 resultType 替换为 resultMap。
      列名和属性名不一样的解决方案

    第一 种方式:使用resultMap

    1. public class PrimaryStudent {
    2.      private Integer stuId;
    3.      private String stuName;
    4.      private Integer stuAge;
    5.      // set , get 方法
    6. }
    复制代码
    1. <dataSource type="POOLED">
    2.      <!--连接数据库的四个要素-->
    3.      <property name="driver" value="com.mysql.jdbc.Driver"/>
    4.      <property name="url"  value="jdbc:mysql://localhost:3306/ssm?charset=utf-8"/>
    5.      <property name="username" value="root"/>
    6.      <property name="password" value="123456"/>
    7. </dataSource>       select id,name,email,age from student
    复制代码
    第二种方式:使用列别名

    1. <select id="selectUseFieldAlias" resultType="com.bjpowernode.domain.PrimaryStudent">
    2.      select id as stuId, name as stuName,age as stuAge from student
    3. </select>
    复制代码
    模糊查询like

       模糊查询的实现有两种方式, 一是 java 代码中给查询数据加上“%” ; 推荐
      二是在 mapper 文件 sql 语句的条件位置加上“%”
      方法一:
    1. // 需求:查询姓名有“力”的
    2. // 接口方法:
    3. List<Student> selectLikeFirst(String name);
    4. mapper文件:
    5. <select id="selectLikeFirst" resultType="com.bjpowernode.domain.Student">
    6.      select id,name,email,age from student
    7.      where name like #{studentName}
    8. </select>
    9. // 测试方法:
    10. @Test
    11. public void testSelectLikeOne(){
    12.      String name="%力%";
    13.      List<Student> stuList = studentDao.selectLikeFirst(name);
    14.      stuList.forEach( stu -> System.out.println(stu));
    15. }
    复制代码
    方法二:
    1. // 接口方法:
    2. List<Student> selectLikeSecond(String name);
    3. mapper 文件:
    4. <select id="selectLikeSecond" resultType="com.bjpowernode.domain.Student">
    5.      select id,name,email,age from student
    6.      where name like "%" #{studentName} "%"
    7. </select>
    8. // 测试方法:
    9. @Test
    10. public void testSelectLikeSecond(){
    11.      String name="力";
    12.      List<Student> stuList = studentDao.selectLikeSecond(name);
    13.      stuList.forEach( stu -> System.out.println(stu));
    14. }
    复制代码
    动态sql

       动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查询条件进行查询。
      提交的查询条件不同,执行的 SQL 语句不同。若将每种可能的情况均逐一列出,对所有条件进行排列组合,
      将会出现大量的 SQL 语句。此时,可使用动态 SQL 来解决这样的问题
      动态 SQL 之< if >

       对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片断拼接到其所在的 SQL 语句中。
    语法:< if test=“条件” > sql 语句的部分 < /if >
    1.      select id,name,email,age from student     where 1=1<?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6.     <--!使用properties标签--/>
    7.     <properties resource="jdbc.properties" /> and name = #{name}<?xml version="1.0" encoding="UTF-8" ?>
    8. <!DOCTYPE configuration
    9. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    10. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    11. <configuration>
    12.     <--!使用properties标签--/>
    13.     <properties resource="jdbc.properties" />      and age > #{age}     
    复制代码
    动态 SQL < where >

       < if/ >标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 1=1 的子句。
      因为,若 where 后的所有< if/ >条件均为 false,而 where 后若又没有 1=1 子句,则 SQL 中就会只剩下一个空的 where,SQL出错。
      所以,在 where 后,需要添加永为真子句 1=1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。
      使用< where/ >标签,在有查询条件时,可以自动添加上 where 子句;
      没有查询条件时,不会添加where 子句。需要注意的是,第一个< if/ >标签中的 SQL 片断,可以不包含 and。不过,写上 and 也不错,
      系统会将多出的 and 去掉。但其它< if/ >中 SQL 片断的 and,必须要求写上。否则 SQL 语句将拼接出错
      语法:< where > 其他动态 sql < /where >
    1.      select id,name,email,age from student<?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6.     <--!使用properties标签--/>
    7.     <properties resource="jdbc.properties" />  and name = #{name}<?xml version="1.0" encoding="UTF-8" ?>
    8. <!DOCTYPE configuration
    9. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    10. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    11. <configuration>
    12.     <--!使用properties标签--/>
    13.     <properties resource="jdbc.properties" />      and age > #{age}      [/size]
    14.    < foreach/>标签用于实现对于数组与集合的遍历。对其使用,需要注意:
    15.   ➢ collection 表示要遍历的集合类型, list ,array 等。
    16.   ➢ open、close、separator 对遍历内容的 SQL 拼接。
    17.   [code]语法:     #{item 的值}
    复制代码
    遍历 **List

    1. // 需求:查询学生 id 是 1002,1005,1006 // 接口方法:List selectStudentForList(List idList);// mapper 文件:         select id,name,email,age from student          where id in<?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6.     <--!使用properties标签--/>
    7.     <properties resource="jdbc.properties" />    #{stuid}      // 测试方法:@Testpublic void testSelectForList() {     List list = new ArrayList();     list.add(1002);     list.add(1005);     list.add(1006);     List studentList = studentDao.selectStudentForList(list);     studentList.forEach( stu -> System.out.println(stu));}
    复制代码
    遍历 **List

    1. // 接口方法:List selectStudentForList2(List stuList);// mapper 文件:         select id,name,email,age from student          where id in<?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6.     <--!使用properties标签--/>
    7.     <properties resource="jdbc.properties" />         #{stuobject.id}      // 测试方法:@Testpublic void testSelectForList2() {     List list = new ArrayList();     Student s1 = new Student();     s1.setId(1002);     list.add(s1);     s1 = new Student();     s1.setId(1005);     list.add(s1);     List studentList = studentDao.selectStudentForList2(list);     studentList.forEach( stu -> System.out.println(stu));}
    复制代码
    动态 SQL 之代码片段

       < sql/ >标签用于定义 SQL 片段,以便其它 SQL 标签复用。
      而其它标签使用该 SQL 片断,需要使用< include/ >子标签。
      该< sql/ >标签可以定义 SQL 语句中的任何部分,所以< include/ >子标签可以放在动态 SQL的任何位置。
    1.   select id,name,email,age from student             where id in<?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6.     <--!使用properties标签--/>
    7.     <properties resource="jdbc.properties" />         #{stuobject.id}      
    复制代码
    PageHelper

    基于 PageHelper 分页:
    实现步骤:
    1)Maven坐标:
    1. <!--创建 sql 片段 id:片段的自定义名称-->
    2. <sql id="studentSql">
    3. select id,name,email,age from student
    4. </sql>
    5. <select id="selectStudentSqlFragment" resultType="com.xxx.domain.Student">
    6. <!-- 引用 sql 片段 -->
    7. <include refid="studentSql"/>
    8. <if test="list !=null and list.size > 0 ">
    9.         where id in
    10.      <foreach collection="list" open="(" close=")" item="stuobject" separator=",">
    11.              #{stuobject.id}
    12.      </foreach>
    13. </if>
    14. </select>
    复制代码
    2)加入plugin配置
    1. <dependency>
    2. <groupId>com.github.pagehelper</groupId>
    3. <artifactId>pagehelper</artifactId>
    4. <version>5.1.10</version>
    5. </dependency>
    复制代码
    3)PageHelper 对象
       查询语句之前调用 PageHelper.startPage 静态方法。
      除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。
      在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个
      方法后的第一个 MyBatis 查询方法会被进行分页。
    1. 在<environments>之前加入
    2. <plugins>
    3. <plugin interceptor="com.github.pagehelper.PageInterceptor" />
    4. </plugins>
    复制代码
    来源:https://blog.caogenba.net/Sherlook_Holmes/article/details/122461391
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
  • 帖子地址: 

    回复

    使用道具 举报

    分享
    推广
    火星云矿 | 预约S19Pro,享500抵1000!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
    • 官方手机版

    • 微信公众号

    • 商务合作