【MyBatis】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 *MyBatis, FROM attence
      <include refid=”demo”
/>
    </select>

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

网站地图xml地图