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 -->
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 }
时间: 2024-10-22 21:26:36

MyBatis详解的相关文章

mybatis 详解(三)------入门实例(基于注解)

1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如下 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 3.在 MyBatisTest 工程中添加数据库配置文件 mybatis-configuration.xml 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 4.定义表所对应的实体类 详情

mybatis 详解(七)------一对一、一对多、多对多

前面几篇博客我们用mybatis能对单表进行增删改查操作了,也能用动态SQL书写比较复杂的sql语句.但是在实际开发中,我们做项目不可能只是单表操作,往往会涉及到多张表之间的关联操作.那么我们如何用 mybatis 处理多表之间的关联操作呢?请看本篇博客详解. 本篇详细代码:http://pan.baidu.com/s/1eSzmst8 密码:3n3o 1.一对一 我们以用户表 user 和订单表 orders 为例.设定一个订单只能由一个 用户创建,那么由订单到用户就是一对一的关系. ①.创建

MyBatis详解 一篇就够啦

第1章MyBatis框架配置文件详解 1.1 typeHandlers类型转换器 每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用TypeHandler 来处理数据库类型与java 类型之间转换.下表描述了默认 TypeHandlers 1.1.1 自定义类型转换器 假设表中字段是int类型,而实体类与之对应的属性是boolean类型,此时可以采用自定义类型转换器进行对应 (1)实体类 1 package com.chenya

Mybatis详解二

SqlSession(SqlSessionDaoSupport类) SqlSessionDaoSupportSqlSessionDaoSupport是一个抽象的支持类,用来为你提供SqlSession.调用getSqlSession()方法你会得到一个SqlSessionTemplate,这然后可以用于执行SQL方法,就像下面这样:Java代码 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{ pu

MyBatis详解目录

对原生态JDBC程序中的问题进行总结 MyBatis框架原理 MyBatis入门程序 增删改查 MyBatis开发DAO 原始Dao开发方法,程序员需要编写Dao接口和Dao实现类 MyBatis的Mapper代理开发,Mapper相当于接口 MyBatis核心 MyBatis输入映射 MyBatis输出映射 动态SQL 高级结果集映射 一对一 一对多 多对多 MyBatis延迟加载 MyBatis查询缓存 一级缓存 二级缓存 MyBatis和Spring整合 MyBatis逆向工程

MyBatis详解 与配置MyBatis+Spring+MySql

MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型.Map 接口和POJO 到数据库记录.相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现.需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包).mybatis-spring-1.0.0.jar

mybatis 详解(五)------动态SQL

前面几篇博客我们通过实例讲解了用mybatis对一张表进行的CRUD操作,但是我们发现写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误. 那么怎么去解决这个问题呢?这就是本篇所讲的使用 mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL

mybatis 详解(二)------入门实例(基于XML)

通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一个入门实例来对mybatis有更近一步的了解. 我们用 mybatis 来对 user 表进行增删改查操作. ps:本篇博客源代码链接:http://pan.baidu.com/s/1eSEfc8i密码:j480 1.创建MySQL数据库:mybatisDemo和表:user 这里我们就不写脚本创建

mybatis 详解(一)------JDBC

1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO). MyBatis 是支持普通 SQL查