欢迎来到小房子杂记 返回顶部

JavaEE之MyBatis框架

MyBatis 学习笔记

一、MyBatis 简介

二、MyBatis 核心对象

三、MyBatis XML配置

四、MyBatis XML映射文件

五、MyBatis 动态SQL

六、MyBatis 逆向工程

七、MyBatis 表关系的处理

八、MyBatis mapper接口开发

 

一、MyBatis 简介

  1. 简介

    MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

     

  1. mybatis的功能架构

    我们把Mybatis的功能架构分为三层:

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

 

二、MyBatis 核心对象

  1. SqlSession

    使用 MyBatis 的主要 Java 接口就是 SqlSession。尽管你可以使用这个接口执行命令,获 取映射器和管理事务。我们会讨论 SqlSession 本身更多,但是首先我们还是要了解如果获取 一个 SqlSession 实例。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对 象 包 含 创 建 SqlSession 实 例 的 所 有 方 法 。 而 SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。

     

  1. SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder 有五个 build()方法,每一种都允许你从不同的资源中创建一个 SqlSession 实例。

    • SqlSessionFactory build(InputStream inputStream)

    • SqlSessionFactory build(InputStream inputStream, String environment)

    • SqlSessionFactory build(InputStream inputStream, Properties properties)

    • SqlSessionFactory build(InputStream inputStream, String env, Properties props)

    • SqlSessionFactory build(Configuration config)

     

  1. SqlSessionFactory

    SqlSessionFactory 有六个方法可以用来创建 SqlSession 实例。默认的 openSession()方法没有参数,它会创建有如下特性的 SqlSession:

  • 会开启一个事务(也就是不自动提交)

  • 连接对象会从由活动环境配置的数据源实例中得到。

  • 事务隔离级别将会使用驱动或数据源的默认设置。

  • 预处理语句不会被复用,也不会批量处理更新。

 

三、MyBatis XML配置

  1. mybatis相关jar包

 

  1. mybatisXML核心配置文件(mybatis-config.xml)

    <?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>
       <!--读取 db.properties-->
       <properties resource="db.properties"></properties>

       <!--配置 实体类的别名处理-->
       <typeAliases>
           <!--单独给实体类的起别名-->
           <!-- <typeAlias type="cn.edu.dgut.pojo.User" alias="User"></typeAlias>-->
           <!--直接扫描包-->
           <package name="cn.edu.dgut.pojo"/>
       </typeAliases>

       <!--环境配置 -->
       <environments default="dev">
           <environment id="dev">
               <transactionManager type="JDBC"></transactionManager>
               <dataSource type="POOLED">
                   <!--配置链接数据库的信息-->
                   <property name="driver" value="${jdbc.driver}"/>
                   <property name="url" value="${jdbc.url}"/>
                   <property name="username" value="${jdbc.username}"/>
                   <property name="password" value="${jdbc.password}"/>
               </dataSource>
           </environment>
       </environments>
       <!--将UserMapper.xml 和主配置文件关联-->
       <mappers>
           <mapper resource="cn/edu/dgut/pojo/UserMapper.xml"></mapper>
       </mappers>
    </configuration>

     

  2. 数据库配置文件(db.properties)

    #数据库驱动
    jdbc.driver=com.mysql.jdbc.Driver
    #数据库链接
    jdbc.url=jdbc:mysql://localhost:3306/mybatisdemo?characterEncoding=utf8
    #数据库账号
    jdbc.username=root
    #数据库密码
    jdbc.password=123456
    #jdbc.maxTotal=30
    #jdbc.maxIdle=10
    #jdbc.initialSize=5

     

  3. 日志配置文件(log4j.properties)

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # 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

 

四、MyBatis XML映射文件

  1. mybatis mapper映射文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
           PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="curdUser">
       <!--根据用户id查询,返回一个用户
         SELECT * from tb_user  -> List<User>
       -->
       <select id="selectUserById" parameterType="int" resultType="cn.edu.dgut.pojo.User">
           select * from tb_user where userid=#{id}
       </select>
       <!--查询返回list 集合
             SELECT * from tb_user  -> List<User>
           -->
       <select id="selectUserList" resultType="User">
           select * from tb_user
       </select>
       <!-- 模糊查询 根据用户名,返回list 集合 -->
       <select id="selectUserByName" parameterType="String" resultType="User">
           select * from tb_user where username like '%${value}%'
       </select>

       <!-- 插入数据 -->
       <insert id="insertUser" parameterType="User">
           insert into tb_user values (null,#{username},#{password})
       </insert>

       <!-- 更新数据 -->
       <update id="updateUser" parameterType="User">
           update tb_user set username=#{username},password=#{password} where userid=#{userid}
       </update>

       <!-- 删除数据 -->
       <delete id="deleteUserById" parameterType="int">
           delete from tb_user where userid=#{userid};
       </delete>
    </mapper>

 

  1. 获取SqlSession的工具类

    public class MybatisUtil {
       // 定义SessionFactory
       private static SqlSessionFactory sessionFactory = null;
       // 定义SqlSession
       private static SqlSession sqlSession = null;

       static {
           InputStream is = null;
           try {
               // 读取核心mybatis配置文件(在内存中只是流的方式)
               is = Resources.getResourceAsStream("mybatis-config.xml");
               // 创建SqlSessionFactory对象,此对象可以完成对配置文件的读取
               sessionFactory = new SqlSessionFactoryBuilder().build(is);
          } catch (IOException e) {
               e.printStackTrace();
          }
      }

       // 通过SqlSessionFactory获得一个SqlSession对象
       public static SqlSession getSqlSession() {
           // 返回SqlSession对象,该对象的作用是调用mapper文件进行数据操作(一定要先引mapper)
           return sessionFactory.openSession();
      }

       // 如果SqlSession对象不为空,关闭它
       public static void closeSession(SqlSession sqlSession) {
           if (sqlSession != null) {
               sqlSession.close();
          }
      }

    }

 

  1. 实体类

    public class User {
       private int userid;
       private String username;
       private String password;

       public int getUserid() {
           return userid;
      }

       public void setUserid(int userid) {
           this.userid = userid;
      }

       public String getUsername() {
           return username;
      }

       public void setUsername(String username) {
           this.username = username;
      }

       public String getPassword() {
           return password;
      }

       public void setPassword(String password) {
           this.password = password;
      }

       @Override
       public String toString() {
           return "User{" +
                   "userid=" + userid +
                   ", username='" + username + '\'' +
                   ", password='" + password + '\'' +
                   '}';
      }
    }

 

  1. 测试类

    public class MybatisDemo01 {
       @Test
       public void fun1() throws IOException {
           /*// 读取核心mybatis配置文件(在内存中只是流的方式)
           InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

           // 创建SqlSessionFactory对象,此对象可以完成对配置文件的读取
           SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

           // 创建SqlSession对象,该对象的作用是调用mapper文件进行数据操作(一定要先引mapper)
           SqlSession session = sessionFactory.openSession();*/
           SqlSession session = MybatisUtil.getSqlSession();

           // 使用sql会话对象进行增删改查
           User user = session.selectOne("curdUser.selectUserById", 1);
           System.out.println(user);

           // 关闭sqlsession对象
           session.close();
           // MybatisUtil.closeSession(session);
      }

       @Test
       public void fun2() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();

           // 使用sql会话对象进行增删改查
           List<User> users = session.selectList("curdUser.selectUserList");
           for (User user : users) {
               System.out.println(user);
          }

           // 关闭sqlsession对象
           session.close();
      }

       @Test
       public void fun3() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();

           // 使用sql会话对象进行增删改查
           List<User> users = session.selectList("curdUser.selectUserByName", "白");
           for (User user : users) {
               System.out.println(user);
          }

           // 关闭sqlsession对象
           session.close();
      }
    }

 

五、MyBatis 动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

  • if

  • choose (when, otherwise)

  • trim (where, set)

  • foreach

if

动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。

<select id="findActiveBlogLike"
    resultType="Blog">
 SELECT * FROM BLOG WHERE state = ‘ACTIVE’
 <if test="title != null">
   AND title like #{title}
 </if>
 <if test="author != null and author.name != null">
   AND author_name like #{author.name}
 </if>
</select>

 

choose, when, otherwise

有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

<select id="findActiveBlogLike"
    resultType="Blog">
 SELECT * FROM BLOG WHERE state = ‘ACTIVE’
 <choose>
   <when test="title != null">
     AND title like #{title}
   </when>
   <when test="author != null and author.name != null">
     AND author_name like #{author.name}
   </when>
   <otherwise>
     AND featured = 1
   </otherwise>
 </choose>
</select>

 

trim, where, set

trim 元素的prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。

set 元素会动态前置 SET 关键字,同时也会消除无关的逗号,因为用了条件语句之后很可能就会在生成的赋值语句的后面留下这些逗号。

<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
<select id="findActiveBlogLike"
    resultType="Blog">
 SELECT * FROM BLOG
 <where>
   <if test="state != null">
        state = #{state}
   </if>
   <if test="title != null">
       AND title like #{title}
   </if>
   <if test="author != null and author.name != null">
       AND author_name like #{author.name}
   </if>
 </where>
</select>
<update id="updateAuthorIfNecessary">
 update Author
   <set>
     <if test="username != null">username=#{username},</if>
     <if test="password != null">password=#{password},</if>
     <if test="email != null">email=#{email},</if>
     <if test="bio != null">bio=#{bio}</if>
   </set>
 where id=#{id}
</update>

 

foreach

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。

<select id="selectPostIn" resultType="domain.blog.Post">
 SELECT *
 FROM POST P
 WHERE ID in
 <foreach item="item" index="index" collection="list"
     open="(" separator="," close=")">
       #{item}
 </foreach>
</select>

 

六、MyBatis 逆向工程

mybatis需要程序员自己编写sql语句,而mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上。

  1. mybatis逆向工程所需jar包

 

  1. mybatis逆向工程配置文件(generator.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
           PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
           "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

    <generatorConfiguration>
       <context id="testTables" targetRuntime="MyBatis3">
           <commentGenerator>
               <!-- 是否去除自动生成的注释 true:是 false: -->
               <property name="suppressAllComments" value="true" />
           </commentGenerator>
           <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
           <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                           connectionURL="jdbc:mysql://localhost:3306/mybatisdemo?characterEncoding=utf8"
                           userId="root"
                           password="fzp666xfz888">
           </jdbcConnection>
           <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
               connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
               userId="yycg"
               password="yycg">
           </jdbcConnection> -->

           <!-- 默认false,把JDBC DECIMAL NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
               NUMERIC 类型解析为java.math.BigDecimal -->
           <javaTypeResolver>
               <property name="forceBigDecimals" value="false" />
           </javaTypeResolver>

           <!-- targetProject:生成实体类的位置 -->
           <javaModelGenerator targetPackage="cn.edu.dgut.pojo"
                               targetProject=".\src">
               <!-- enableSubPackages:是否让schema作为包的后缀 -->
               <property name="enableSubPackages" value="false" />
               <!-- 从数据库返回的值被清理前后的空格 -->
               <property name="trimStrings" value="true" />
           </javaModelGenerator>
           <!-- targetProject:mapper映射文件生成的位置 -->
           <sqlMapGenerator targetPackage="cn.edu.dgut.mapper"
                            targetProject=".\src">
               <!-- enableSubPackages:是否让schema作为包的后缀 -->
               <property name="enableSubPackages" value="false" />
           </sqlMapGenerator>
           <!-- targetPackage:mapper接口生成的位置 -->
           <javaClientGenerator type="XMLMAPPER"
                                targetPackage="cn.edu.dgut.mapper"
                                targetProject=".\src">
               <!-- enableSubPackages:是否让schema作为包的后缀 -->
               <property name="enableSubPackages" value="false" />
           </javaClientGenerator>
           <!-- 指定数据库表 -->
           <!-- <table tableName="orderdetail"></table> -->
           <table tableName="tb_user" domainObjectName="User"></table>
           <!-- <table schema="" tableName="sys_user"></table>
           <table schema="" tableName="sys_role"></table>
           <table schema="" tableName="sys_permission"></table>
           <table schema="" tableName="sys_user_role"></table>
           <table schema="" tableName="sys_role_permission"></table> -->

           <!--有些表的字段需要指定java类型
            <tableschema=""tableName="">
               <columnOverridecolumn=""javaType=""/>
           </table>-->
       </context>
    </generatorConfiguration>

     

  1. mybatis逆向工程生成代码

    public class GeneratorDemo {
       // 逆向工程代码,和generator.xml配合生成pojo和mapper
       @Test
       public void generator() throws Exception {
           List<String> warnings = new ArrayList<String>();
           boolean overwrite = true;
           File configFile = new File("src/generator.xml");
           ConfigurationParser cp = new ConfigurationParser(warnings);
           Configuration config = cp.parseConfiguration(configFile);
           DefaultShellCallback callback = new DefaultShellCallback(overwrite);
           MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
           myBatisGenerator.generate(null);
      }
    }

 

  1. 准备好需要生成mybatis代码对应的数据库(单表)

    准备好以上工作后,运行第三小点说的逆向工程生成代码即可生成对应mybatis代码。

 

七、MyBatis 表关系的处理

  1. 一对一的表关系

    • OrderMapper

      public interface OrderMapper {

         List<Orders> selectOrderListAndUser();
      }
    • OrderMapper.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
             PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="cn.edu.dgut.mapper.OrderMapper">

         <resultMap id="OrderMap" type="Orders">
             <id property="id" column="id"></id>
             <result property="userId" column="user_id"></result>
             <result property="number" column="number"></result>
             <result property="createtime" column="createtime"></result>
             <result property="note" column="note"></result>

             <!--配置一对一关系-->
             <association property="user" javaType="User">
                 <id property="id" column="id"></id>
                 <result property="username" column="username"></result>
                 <result property="birthday" column="birthday"></result>
                 <result property="sex" column="sex"></result>
                 <result property="address" column="address"></result>
             </association>
         </resultMap>

         <!--查询-->
         <select id="selectOrderListAndUser" resultMap="OrderMap">
              SELECT a.*,b.id uid,b.username,b.birthday,b.sex,b.address from `order` a
              INNER JOIN `user` b on a.user_id = b.id
         </select>

      </mapper>
    • Orders

      public class Orders {
         private Integer id;
         private Integer userId;
         private String number;
         private Date createtime;
         private String note;
         private User user;

         public Integer getId() {
             return id;
        }

         public void setId(Integer id) {
             this.id = id;
        }

         public Integer getUserId() {
             return userId;
        }

         public void setUserId(Integer userId) {
             this.userId = userId;
        }

         public String getNumber() {
             return number;
        }

         public void setNumber(String number) {
             this.number = number == null ? null : number.trim();
        }

         public Date getCreatetime() {
             return createtime;
        }

         public void setCreatetime(Date createtime) {
             this.createtime = createtime;
        }

         public String getNote() {
             return note;
        }

         public void setNote(String note) {
             this.note = note == null ? null : note.trim();
        }

         public User getUser() {
             return user;
        }

         public void setUser(User user) {
             this.user = user;
        }

         @Override
         public String toString() {
             return "Orders{" +
                     "id=" + id +
                     ", userId=" + userId +
                     ", number='" + number + '\'' +
                     ", createtime=" + createtime +
                     ", note='" + note + '\'' +
                     '}';
        }
      }
    • 测试方法

      @Test
      public void fun1() throws IOException {
         SqlSession session = MybatisUtil.getSqlSession();

         // 一对一关系,联表查询
         CustomerOrderMapper customerOrderMapper = session.getMapper(CustomerOrderMapper.class);
         List<CustomerOrder> customerOrders = customerOrderMapper.selectOrderAndUser();
         for (CustomerOrder customerOrder : customerOrders) {
             System.out.println(customerOrder);
        }

         // 提交事务
         session.commit();
         // 关闭sqlsession对象
         session.close();
      }

 

  1. 一对多的表关系

    • UserMapper

      public interface UserMapper {

         List<User> selectUserAndOrderList();

      }
    • UserMapper.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
             PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="cn.edu.dgut.mapper.UserMapper">
         <!-- 结果映射 -->
         <resultMap id="UserMap" type="User">
             <id property="id" column="id"></id>
             <result property="username" column="username"></result>
             <result property="birthday" column="birthday"></result>
             <result property="sex" column="sex"></result>
             <result property="address" column="address"></result>

             <!--一对多关系-->
             <collection property="orders" ofType="Orders">
                 <id property="id" column="id"></id>
                 <result property="userId" column="userid"></result>
                 <result property="number" column="number"></result>
                 <result property="createtime" column="createtime"></result>
                 <result property="note" column="note"></result>
             </collection>
             
         </resultMap>

         <select id="selectUserAndOrderList" resultMap="UserMap">
             SELECT u.*,o.id oid,o.user_id,o.number,o.createtime,o.note from `user` u
             INNER JOIN `order` o on u.id = o.user_id
         </select>

      </mapper>
    • User

      public class User {

         private Integer id;
         private String username;
         private Date birthday;
         private char sex;
         private String address;
         private List<Orders> orders = new ArrayList<>();

         public Integer getId() {
             return id;
        }

         public void setId(Integer id) {
             this.id = id;
        }

         public String getUsername() {
             return username;
        }

         public void setUsername(String username) {
             this.username = username;
        }

         public Date getBirthday() {
             return birthday;
        }

         public void setBirthday(Date birthday) {
             this.birthday = birthday;
        }

         public char getSex() {
             return sex;
        }

         public void setSex(char sex) {
             this.sex = sex;
        }

         public String getAddress() {
             return address;
        }

         public void setAddress(String address) {
             this.address = address;
        }

         public List<Orders> getOrders() {
             return orders;
        }

         public void setOrders(List<Orders> orders) {
             this.orders = orders;
        }


         @Override
         public String toString() {
             return "User{" +
                     "id=" + id +
                     ", username='" + username + '\'' +
                     ", birthday=" + birthday +
                     ", sex=" + sex +
                     ", address='" + address + '\'' +
                     '}';
        }
      }
    • 测试方法

      @Test
      public void fun3() throws IOException {
         SqlSession session = MybatisUtil.getSqlSession();

         // 一对多关系,联表查询
         UserMapper userMapper = session.getMapper(UserMapper.class);
         List<User> users = userMapper.selectUserAndOrderList();
         for (User user : users) {
             System.out.println(user);
        }

         // 提交事务
         session.commit();
         // 关闭sqlsession对象
         session.close();
      }

       

  1. 多对多的表关系

    • RoleMapper、UserMapper

      public interface RoleMapper {

         List<Role> selectRoleAndUserList();
      }

      public interface UserMapper {

         List<User> selectUserAndRoleList();
      }
    • RoleMapper.xml、UserMapper.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
             PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="cn.edu.dgut.mapper.RoleMapper">
         <!-- 结果映射 -->
         <resultMap id="roleUserMap" type="Role">
             <id property="id" column="id"></id>
             <result property="roleName" column="role_name"></result>
             <result property="roleDesc" column="role_desc"></result>

             <!--多对多-->
             <collection property="users" ofType="User">
                 <id property="id" column="id"></id>
                 <result property="username" column="username"></result>
                 <result property="birthday" column="birthday"></result>
                 <result property="sex" column="sex"></result>
                 <result property="address" column="address"></result>
             </collection>
         </resultMap>

         <select id="selectRoleAndUserList" resultMap="roleUserMap">
             SELECT r.*,u.`id` uid,u.`username`,u.`birthday`,u.`sex`,u.`address` FROM role r
             LEFT JOIN user_role ur ON r.`id`=ur.`rid` LEFT JOIN `user` u ON ur.`uid`=u.`id`
         </select>
      </mapper>
      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
             PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="cn.edu.dgut.mapper.UserMapper">
         <!-- 结果映射 -->
         <resultMap id="UserMap" type="User">
             <id property="id" column="id"></id>
             <result property="username" column="username"></result>
             <result property="birthday" column="birthday"></result>
             <result property="sex" column="sex"></result>
             <result property="address" column="address"></result>

             <!--多对多关系-->
             <collection property="roles" ofType="Role">
                 <id property="id" column="id"></id>
                 <result property="roleName" column="role_name"></result>
                 <result property="roleDesc" column="role_desc"></result>
             </collection>
         </resultMap>

         <select id="selectUserAndRoleList" resultMap="UserMap">
             SELECT u.*,r.`id` rid,r.`role_name`,r.`role_desc` FROM `user` u
             LEFT JOIN user_role ur ON u.`id`=ur.`uid` LEFT JOIN role r ON ur.`rid`=r.`id`
         </select>
      </mapper>
    • Role、User

      public class Role {
         private int id;
         private String roleName;
         private String roleDesc;
         private List<User> users = new ArrayList<>();

         public int getId() {
             return id;
        }

         public void setId(int id) {
             this.id = id;
        }

         public String getRoleName() {
             return roleName;
        }

         public void setRoleName(String roleName) {
             this.roleName = roleName;
        }

         public String getRoleDesc() {
             return roleDesc;
        }

         public void setRoleDesc(String roleDesc) {
             this.roleDesc = roleDesc;
        }

         public List<User> getUsers() {
             return users;
        }

         public void setUsers(List<User> users) {
             this.users = users;
        }

         @Override
         public String toString() {
             return "Role{" +
                     "id=" + id +
                     ", roleName='" + roleName + '\'' +
                     ", roleDesc='" + roleDesc + '\'' +
                     ", users=" + users +
                     '}';
        }
      }
      public class User {

         private Integer id;
         private String username;
         private Date birthday;
         private char sex;
         private String address;
         private List<Role> roles = new ArrayList<>();

         public Integer getId() {
             return id;
        }

         public void setId(Integer id) {
             this.id = id;
        }

         public String getUsername() {
             return username;
        }

         public void setUsername(String username) {
             this.username = username;
        }

         public Date getBirthday() {
             return birthday;
        }

         public void setBirthday(Date birthday) {
             this.birthday = birthday;
        }

         public char getSex() {
             return sex;
        }

         public void setSex(char sex) {
             this.sex = sex;
        }

         public String getAddress() {
             return address;
        }

         public void setAddress(String address) {
             this.address = address;
        }

         public List<Role> getRoles() {
             return roles;
        }

         public void setRoles(List<Role> roles) {
             this.roles = roles;
        }

         @Override
         public String toString() {
             return "User{" +
                     "id=" + id +
                     ", username='" + username + '\'' +
                     ", birthday=" + birthday +
                     ", sex=" + sex +
                     ", address='" + address + '\'' +
                     '}';
        }
      }
    • 测试方法

      @Test
      public void fun4() throws IOException {
         SqlSession session = MybatisUtil.getSqlSession();

         // 多对多关系,联表查询
         UserMapper userMapper = session.getMapper(UserMapper.class);
         List<User> users = userMapper.selectUserAndRoleList();
         for (User user : users) {
             System.out.println(user);
        }

         // 提交事务
         session.commit();
         // 关闭sqlsession对象
         session.close();
      }

      @Test
      public void fun5() throws IOException {
         SqlSession session = MybatisUtil.getSqlSession();

         // 多对多关系,联表查询
         RoleMapper roleMapper = session.getMapper(RoleMapper.class);
         List<Role> roles = roleMapper.selectRoleAndUserList();
         for (Role role : roles) {
             System.out.println(role);
        }

         // 提交事务
         session.commit();
         // 关闭sqlsession对象
         session.close();
      }

       

八、MyBatis mapper接口开发

  1. UserMapper

    public interface UserMapper {
       // 根据用户id查询,返回一个用户
       User selectUserById(@Param(value = "id") int id);

       // 查询所有用户,返回list 集合
       List<User> selectUserList();

       // 模糊查询 根据用户名,返回list 集合
       List<User> selectUserByName(String username);

       // 模糊查询 根据用户名和密码,返回list 集合
       List<User> selectUserByNameAndPwd(@Param(value = "username") String username,
                                         @Param(value = "password") String password);

       // 插入数据
       int insertUser(User user);

       // 根据用户id更新数据
       int updateUser(User user);

       // 根据用户id删除数据
       int deleteUserById(int id);

       List<User> selectUserByIds(@Param(value = "ids") List<Integer> ids);
    }

 

  1. UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
           PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.edu.dgut.mapper.UserMapper">
       <!-- 结果映射 -->
       <resultMap id="UserResultMap" type="User">
           <id property="id" column="userid"></id>
       </resultMap>

       <!-- 抽取sql -->
       <sql id="selectSql">
           select * from tb_user
       </sql>

       <!--根据用户id查询,返回一个用户
         SELECT * from tb_user  -> List<User>
       -->
       <select id="selectUserById" parameterType="int" resultMap="UserResultMap">
           <include refid="selectSql"></include>
           <where>
               <if test="id>0">
                   userid=#{id}
               </if>
           </where>
       </select>

       <!--查询返回list 集合
             SELECT * from tb_user  -> List<User>
           -->
       <select id="selectUserList" resultMap="UserResultMap">
           <include refid="selectSql"></include>
       </select>

       <!-- 模糊查询 根据用户名,返回list 集合 -->
       <select id="selectUserByName" parameterType="String" resultType="User">
           <include refid="selectSql"></include>
            where username like '%${value}%'
       </select>

       <!-- 模糊查询 根据用户名和密码,返回list 集合 -->
       <select id="selectUserByNameAndPwd" resultType="User">
           <include refid="selectSql"></include>
           <where>
               <if test="username!=null and username!=''">
                   username like #{username}
               </if>
               <if test="password!=null and password!=''">
                   and password=#{password}
               </if>
           </where>
       </select>

       <!-- 查询 根据用户id查询,返回list 集合 -->
       <select id="selectUserByIds" parameterType="java.util.List" resultMap="UserResultMap">
           <include refid="selectSql"></include>
           <where>
               <foreach collection="ids" open="userid in(" item="id" separator="," close=")">
                   #{id}
               </foreach>
           </where>
       </select>

       <!-- 插入数据 -->
       <insert id="insertUser" parameterType="User">
           insert into tb_user values (null,#{username},#{password})
       </insert>

       <!-- 更新数据 -->
       <update id="updateUser" parameterType="User">
           update tb_user
           <set>
               <if test="username!=null and username!=''">username=#{username},</if>
               <if test="password!=null and password!=''">password=#{password}</if>
           </set>
           where userid=#{id}
       </update>

       <!-- 删除数据 -->
       <delete id="deleteUserById" parameterType="int">
           delete from tb_user where userid=#{userid};
       </delete>
    </mapper>

     

  1. 测试类

    public class MybatisDemo01 {
       @Test
       public void fun1() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();

           // 根据id查询用户信息
           UserMapper userMapper = session.getMapper(UserMapper.class);
           User user = userMapper.selectUserById(6);
           System.out.println(user);

           // 关闭sqlsession对象
           session.close();
      }

       @Test
       public void fun2() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();
           // 同时查询出多个id对应的用户信息
           UserMapper mapper = session.getMapper(UserMapper.class);
           List<Integer> ids = new ArrayList<>();
           ids.add(1);
           ids.add(2);
           ids.add(3);
           ids.add(7);
           List<User> users = mapper.selectUserByIds(ids);
           for (User user : users) {
               System.out.println(user);
          }

           // 关闭sqlsession对象
           session.close();
      }

       @Test
       public void fun5() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();

           // 修改用户信息
           UserMapper mapper = session.getMapper(UserMapper.class);
           User user = new User();
           user.setId(8);
           user.setPassword("666789");
           int i = mapper.updateUser(user);
           if (i > 0) {
               System.out.println("用户数据修改成功!");
          } else {
               System.out.println("用户数据修改失败!");
          }

           // 提交事务
           session.commit();
           // 关闭sqlsession对象
           session.close();
      }

       @Test
       public void fun6() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();

           // 删除用户信息
           UserMapper mapper = session.getMapper(UserMapper.class);
           int i = mapper.deleteUserById(9);
           if (i > 0) {
               System.out.println("用户数据删除成功!");
          } else {
               System.out.println("用户数据删除失败!");
          }

           // 提交事务
           session.commit();
           // 关闭sqlsession对象
           session.close();
      }

       @Test
       public void fun7() throws IOException {
           SqlSession session = MybatisUtil.getSqlSession();

           // 根据用户名模糊查询用户信息
           UserMapper mapper = session.getMapper(UserMapper.class);
           List<User> users = mapper.selectUserByNameAndPwd("%剑士%", "666666");
           for (User user : users) {
               System.out.println(user);
          }

           // 提交事务
           session.commit();
           // 关闭sqlsession对象
           session.close();
      }
    }

     

 

本文是学习mybatis的笔记总结,欢迎大家批评指正,有什么问题可以评论区交流。

参考链接:https://www.w3cschool.cn/mybatis/7zy61ilv.html

 

posted @ 2020-08-08 16:36  小房子杂记  阅读(185)  评论(0)    收藏  举报