zoukankan      html  css  js  c++  java
  • MyBatis详解

    本文用例下载地址,里面还有一个MyBatis实现分页的例子

    http://files.cnblogs.com/files/gaofei-1/MyBatisDemo.rar 


    本文使用的是MySQL数据库,所需SQL脚本如下

     1 CREATE DATABASE demo;
     2 USE demo;
     3 CREATE TABLE `user`(
     4     `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号',
     5     `name` VARCHAR(20) NOT NULL COMMENT '名称',
     6     `password` VARCHAR(20) NOT NULL COMMENT '密码',
     7     `phone` VARCHAR(11) COMMENT '联系电话',
     8     `address` VARCHAR(100) COMMENT '住址'
     9 );
    10 
    11 INSERT INTO `user` VALUES(DEFAULT,'admin','admin',NULL,NULL),(DEFAULT,'ttt','ttt',NULL,NULL),(DEFAULT,'aaa','aaa',NULL,NULL)
    12     ,(DEFAULT,'ddd','ddd',NULL,NULL),(DEFAULT,'xxx','xxx',NULL,NULL);

    MyBatis核心配置文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "//UNKNOWN/" "mybatis-3-config.dtd">
     3 <!-- 1:配置文件根节点 -->
     4 <configuration>
     5     <!-- 2:设置mybatis运行行为 -->
     6     <settings>
     7         <!-- 2.1:设置mybatis日志实现为log4j -->
     8         <setting name="logImpl" value="LOG4J"/>
     9         <!-- 2.2:MyBatis对于resultMap自动映射的匹配级别 -->
    10         <setting name="autoMappingBehavior" value="FULL"/>
    11         <!-- 2.3:设置全局懒加载 -->
    12         <setting name="lazyLoadingEnabled" value="false"/>
    13     </settings>
    14     <!-- 3:设置自定义类型别名,这样就不用写全限定名了 -->
    15     <typeAliases>
    16         <!-- 3.1:将src/pojo文件夹下的所有类都自动设置别名    自动设置的别名格式:src/pojo/User.java     别名:User -->
    17         <package name="pojo" />
    18         <!-- 3.2:单独设置某个类的别名 -->
    19         <!-- <typeAlias type="pojo.User" alias="User" /> -->
    20     </typeAliases>
    21     <!-- 4:设置mybatis的环境,默认为demo,必须设置默认环境,可以有多个环境 -->
    22     <environments default="demo">
    23         <!-- 4.1:设置单个环境 -->
    24         <environment id="demo">
    25             <!-- 4.1.1:设置事务管理器为jdbc -->
    26             <transactionManager type="JDBC" />
    27             <!-- 4.1.2:设置数据源,POOLED:mybatis自带的数据源、JNDI:基于Tomcat的数据源 -->
    28             <dataSource type="POOLED">
    29                 <!-- 配置驱动类,数据库连接语句,用户名和密码,name属性的值不能写错,特殊字符需要转义 -->
    30                 <property name="driver" value="com.mysql.jdbc.Driver"/>
    31                 <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;useSSL=true&amp;usecharacterEncoding=utf-8"/>
    32                 <property name="username" value="root"/>
    33                 <property name="password" value="111111"/>
    34             </dataSource>
    35         </environment>
    36     </environments>
    37     <!-- 5:配置映射器,映射sql语句 -->
    38     <mappers>
    39         <!-- 5.1:逐个配置 -->
    40             <!-- 方式1,指定引用文件 -->
    41             <mapper resource="mapper/UserMapper.xml" />
    42             <!-- 方式2,指定类 -->
    43             <!-- <mapper class="mapper.UserMapper"/> -->
    44             <!-- 方式3,指定磁盘下的文件路径 -->
    45             <!-- <mapper url="file///...文件绝对路径..."/> -->
    46         <!-- 5.2:自动扫描,但必须保证   mapper文件和与之对应的接口   名称相同并在同一文件夹下 -->
    47             <!-- <package name="dao"/> -->
    48     </mappers>
    49 </configuration>

      注:mybatis核心配置文件中的各个节点的顺序不能乱写。详细信息可以去dtd文件中查看。dtd文件位置:mybatis的jar包下的org/apache/ibatis/builder/xml


    MyBatis映射器用法(mapper文件,映射sql语句)

      常用语法,在任何语句中都可以灵活使用及嵌套使用

    1 <trim prefix="前缀" suffix="后缀" suffixOverrides="每个短句的后缀">这个标签几乎是全能的</trim>   
    2 <if test="条件"></if>
    3 <foreach collection="迭代的类型,可为array|list|map" item="指代当前项" open="前缀" close="后缀" separator="每个短句之间的分隔符"></foreach>
    4 <choose>
    5     <when test="条件"></when>        <!-- 满足任意when则退出,不执行其他when -->
    6     <otherwise></otherwise>            <!-- 如果所有when都没有执行,则执行otherwise -->
    7 </choose>

      外部resultMap用法,如果查询结果返回多行并且类包含引用类型属性的话,则resultMap内的所有属性都必须手动指定。

     1 <resultMap type="User" id="userMap">
     2     <!-- 指定id -->
     3     <id column="列名" property="与实体类中的属性名对应"/>
     4     <!-- 指定与列名对应的属性名 -->
     5     <result column="列名" property="与实体类中的属性名对应"/>
     6     <!-- 指定实体类中类型为引用类型的属性 -->
     7     <association property="与实体类中的属性名对应" javaType="自定义类型" resultMap="引用另外自定义的resultMap">
     8         <result column="列名" property="与实体类中的属性名对应"/>
     9         ...        
    10     </association>
    11     <!-- 指定实体类中类型为集合的属性 -->
    12     <collection property="与实体类中的属性名对应" javaType="自定义类型" resultMap="引用另外自定义的resultMap">
    13         <result column="列名" property="与实体类中的属性名对应"/>
    14         ...
    15     </collection>
    16 </resultMap>

      SQL语句用法

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "//UNKNOWN/" "mybatis-3-mapper.dtd">
     3 
     4 <!-- 映射文件根节点      如果调用时使用接口方式的话,命名空间需为对应接口的命名空间-->
     5 <mapper namespace="dao.UserDao">
     6     <!-- 1:添加语句 -->
     7         <insert id="addUser" parameterType="User">
     8             <!-- 方式1:直接写添加语句 -->
     9             <!-- INSERT INTO `user` VALUES(DEFAULT,#{name},#{password},#{phone},#{address}) -->
    10             <!-- 方式2:使用if+trim -->
    11             INSERT INTO `user`
    12             <trim prefix="(" suffix=")" suffixOverrides=",">
    13                 <if test="name!=null and name!=''">name,</if>
    14                 <if test="password!=null and password!=''">password,</if>
    15                 <if test="phone!=null and phone!=''">phone,</if>
    16                 <if test="address!=null and address!=''">address,</if>
    17             </trim> 
    18             VALUES
    19             <trim prefix="(" suffix=")" suffixOverrides=",">
    20                 <if test="name!=null and name!=''">#{name},</if>
    21                 <if test="password!=null and password!=''">#{password},</if>
    22                 <if test="phone!=null and phone!=''">#{phone},</if>
    23                 <if test="address!=null and address!=''">#{address},</if>
    24             </trim>
    25         </insert>
    26     <!-- 2:修改语句 -->
    27         <update id="updUserById" parameterType="User">
    28             <!-- 方式1:直接写修改语句,如果只有一个参数并且参数为基本数据类型的话,则不用写parameterType -->
    29             <!-- UPDATE `user` SET `name`='abc' WHERE id=#{id} -->
    30             <!-- 方式2:使用set+if -->
    31             UPDATE `user`
    32             <set>
    33                 <if test="name!=null and name!=''">name=#{name}</if>
    34             </set>
    35             WHERE id=#{id}
    36         </update>
    37     <!-- 3:删除语句 -->
    38         <delete id="delUserById">
    39             delete from `user` where `id`=#{id}
    40         </delete>
    41     <!-- 4:查询语句 -->
    42         <!-- 1:根据单个基本数据类型参数查询,如果只有一个参数并且参数为基本数据类型的话,则不用写parameterType,如果返回类型是集合的话,resultType中填写集合中元素的类型 -->
    43         <select id="getUserById" resultType="User">
    44             SELECT * FROM `user` WHERE `id`=#{id}
    45         </select>
    46         <!-- 2:使用foreach查询 -->
    47         <select id="getUserByIds_foreach" resultType="User">
    48             select * from `user` where `id` in
    49             <foreach collection="array" item="id" open="(" close=")" separator=",">
    50                 #{id}
    51             </foreach>
    52         </select>
    53         <!-- 3:使用choose查询 -->
    54         <select id="getUserById_choose" resultType="User">
    55             select * from `user`
    56             <choose>
    57                 <when test="name!=null and name!=''">where name like '%${name}%'</when>
    58             </choose>
    59         </select>
    60 </mapper>

     测试类

      1 package test;
      2 
      3 import java.io.IOException;
      4 import java.util.List;
      5 
      6 import org.apache.ibatis.io.Resources;
      7 import org.apache.ibatis.session.SqlSession;
      8 import org.apache.ibatis.session.SqlSessionFactory;
      9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     10 import org.junit.Test;
     11 
     12 import pojo.User;
     13 import dao.UserDao;
     14 
     15 /**
     16  * 测试类
     17  * 本类中所有方法都使用接口的方式实现的,若要使用sql映射语句实现的话,格式如下
     18  * session.selectOne("mapper文件的namespace+SQL语句的id", 参数)
     19  * session.selectList("mapper文件的namespace+SQL语句的id", 参数)
     20  * session.update("mapper文件的namespace+SQL语句的id", 参数)
     21  * session.insert("mapper文件的namespace+SQL语句的id", 参数)
     22  * session.delete("mapper文件的namespace+SQL语句的id", 参数)
     23  * @author Gawain
     24  */
     25 public class Demo {
     26     static SqlSessionFactory fac;            //sqlsession工厂
     27     static {
     28         //创建sqlsession工厂
     29         try {
     30             fac = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
     31         } catch (IOException e) {
     32             e.printStackTrace();
     33         }
     34     }
     35     @Test
     36     public void test() {
     37         //创建sqlsession会话,传true为自动提交事务
     38         SqlSession session = fac.openSession(true);
     39         
     40         //添加用户信息
     41 //        addUser(session);
     42 //        //修改用户信息
     43 //        updUser(session);
     44 //        //删除用户信息
     45 //        delUser(session);
     46 //        //根据单个基本数据类型参数查询
     47 //        getUserById(session);
     48 //        //使用foreach查询
     49 //        getUserByIds_foreach(session);
     50         //使用choose查询
     51         getUserById_choose(session);
     52         
     53         session.close();
     54     }
     55     /**
     56      * 使用choose查询
     57      * @param session
     58      */
     59     private void getUserById_choose(SqlSession session) {
     60         List<User> users = session.getMapper(UserDao.class).getUserById_choose("a");
     61         for (User item : users) {
     62             System.out.println(item);
     63         }
     64     }
     65     /**
     66      * 使用foreach查询
     67      * @param session
     68      */
     69     private void getUserByIds_foreach(SqlSession session) {
     70         int[] ids = {1,2,3};
     71         List<User> users = session.getMapper(UserDao.class).getUserByIds_foreach(ids);
     72         for (User item : users) {
     73             System.out.println(item);
     74         }
     75     }
     76     /**
     77      * 根据单个基本数据类型参数查询
     78      * @param session
     79      */
     80     private void getUserById(SqlSession session) {
     81         List<User> users = session.getMapper(UserDao.class).getUserById(2);
     82         for (User item : users) {
     83             System.out.println(item);
     84         }
     85     }
     86     /**
     87      * 删除用户信息
     88      * @param session
     89      */
     90     private void delUser(SqlSession session) {
     91         String result = session.getMapper(UserDao.class).delUserById(4) > 0?"删除成功":"删除失败";
     92         System.out.println(result);
     93     }
     94     /**
     95      * 修改用户信息
     96      * @param session
     97      */
     98     private void updUser(SqlSession session) {
     99         User user = new User();
    100         user.setId(2);
    101         user.setName("update");
    102         String result = session.getMapper(UserDao.class).updUserById(user) > 0?"修改成功":"修改失败";
    103         System.out.println(result);
    104     }
    105     /**
    106      * 添加用户信息
    107      * @param session
    108      * @return
    109      */
    110     private void addUser(SqlSession session) {
    111         User user = new User();
    112         user.setName("Gawain");
    113         user.setPassword("123456");
    114         String result = session.getMapper(UserDao.class).addUser(user) > 0?"添加成功":"添加失败";
    115         System.out.println(result);
    116     }
    117 }

    2017-07-29   17:55:34   补充

    使用MyBatis添加数据后获取新添加数据的ID

    语法:

        <insert id="addProvider" useGeneratedKeys="true" keyProperty="id" parameterType="Provider">
            插入语句......
        </insert>

    标红的是需要添加的属性,keyProperty指定将id填充到实体类中哪个属性里面

    添加完成之后可以通过      对象.getId()        来获取新添加数据的id


    2017-08-08    20:04:27    补充

    当多个SQL语句都需要使用一部分重复的SQL语句时,可以将重复的SQL语句抽离出来

    语法:

        <sql id="demo">
          where id=#{id}
        </sql>
        <select id="getAllAttences" resultType="Attence">
          SELECT * FROM attence
          <include refid="demo" />
        </select>

    <sql>标签是自己写的SQL语句,可重复使用,include 使用自己写的SQL语句,refid对应<sql>标签中的id

    欢迎提出意见或建议!!!
  • 相关阅读:
    mysql--数据库的基本操作(二)
    mysql--数据库剧本指令操作
    poj_3461 KMP算法解析
    POJ_3122 经典二分题
    LIS(最长上升子序列)的 DP 与 (贪心+二分) 两种解法
    HDU_1059 多重背包问题
    HDU-1114 完全背包+恰好装满问题
    HDU _2546 01背包问题
    POJ-1611 并查集
    HDU——Monkey and Banana 动态规划
  • 原文地址:https://www.cnblogs.com/gaofei-1/p/7247565.html
Copyright © 2011-2022 走看看