本文用例下载地址
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&useSSL=true&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