一、入门程序:
1、mybatis的配置文件SqlMapConfig.xml
配置mybatis的运行环境,数据源、事务等。

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 和spring整合后 environments配置将废除--> 7 <environments default="development"> 8 <environment id="development"> 9 <!-- 使用jdbc事务管理--> 10 <transactionManager type="JDBC" /> 11 <!-- 数据库连接池--> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.jdbc.Driver" /> 14 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> 15 <property name="username" value="root" /> 16 <property name="password" value="123" /> 17 </dataSource> 18 </environment> 19 </environments> 20 21 <mappers> 22 <mapper resource="sqlmap/User.xml"/> 23 </mappers> 24 </configuration>
2、创建对应的映射文件User.xml

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用--> 7 <mapper namespace="test"> 8 <!-- 9 parameterType:指定输入 参数的类型 10 #{}表示一个占位符号 11 #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 12 resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 13 --> 14 <select id="findUserById" parameterType="int" resultType="com.zhang.domain.User"> 15 SELECT * FROM USER WHERE id=#{value} 16 </select> 17 18 <!-- 根据用户名称模糊查询用户信息,可能返回多条 19 resultType:指定就是单条记录所映射的java对象类型 20 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 21 使用${}拼接sql,引起 sql注入 22 ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value 23 --> 24 <select id="findUserByName" parameterType="java.lang.String" resultType="com.zhang.domain.User"> 25 SELECT * FROM USER WHERE username LIKE '%${value}%' 26 </select> 27 28 <!-- 添加用户 --> 29 <insert id="insertUser" parameterType="com.zhang.domain.User"> 30 <!-- 31 将插入数据的主键返回,返回到user对象中 32 SELECT LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用与自增主键 33 keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 34 order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 35 resultType:指定SELECT LAST_INSERT_ID()的结果类型 36 --> 37 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> 38 SELECT LAST_INSERT_ID() 39 </selectKey> 40 insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) 41 42 <!-- 43 使用mysql的uuid()生成主键,首先通过uuid()得到主键,将主键设置到user对象的id属性中。其次在insert执行时,从user对象中取出id属性值 44 --> 45 <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> 46 SELECT uuid() 47 </selectKey> 48 insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) --> 49 </insert> 50 51 <!-- 删除 用户--> 52 <delete id="deleteUser" parameterType="java.lang.Integer"> 53 delete from user where id=#{id} 54 </delete> 55 56 <!-- 根据id更新用户--> 57 <update id="updateUser" parameterType="com.zhang.domain.User"> 58 update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 59 where id=#{id} 60 </update> 61 62 </mapper>
3、创建User类

1 package com.zhang.domain; 2 3 import java.util.Date; 4 public class User { 5 6 //属性名和数据库表的字段对应 7 private int id; 8 private String username;// 用户姓名 9 private String sex;// 性别 10 private Date birthday;// 生日 11 private String address;// 地址 12 public int getId() { 13 return id; 14 } 15 public void setId(int id) { 16 this.id = id; 17 } 18 public String getUsername() { 19 return username; 20 } 21 public void setUsername(String username) { 22 this.username = username; 23 } 24 public String getSex() { 25 return sex; 26 } 27 public void setSex(String sex) { 28 this.sex = sex; 29 } 30 public Date getBirthday() { 31 return birthday; 32 } 33 public void setBirthday(Date birthday) { 34 this.birthday = birthday; 35 } 36 public String getAddress() { 37 return address; 38 } 39 public void setAddress(String address) { 40 this.address = address; 41 } 42 @Override 43 public String toString() { 44 return "User [id=" + id + ", username=" + username + ", sex=" + sex 45 + ", birthday=" + birthday + ", address=" + address + "]"; 46 } 47 48 49 }
4创建测试类

1 package com.zhang.test; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.Date; 6 import java.util.List; 7 8 import org.apache.ibatis.io.Resources; 9 import org.apache.ibatis.session.SqlSession; 10 import org.apache.ibatis.session.SqlSessionFactory; 11 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 12 import org.junit.Before; 13 import org.junit.Test; 14 15 import com.zhang.domain.User; 16 17 public class TestMy { 18 19 //会话工厂 20 private SqlSessionFactory sqlSessionFactory; 21 @Before 22 public void createSqlSessionFactory() throws IOException { 23 // 配置文件 24 String resource = "SqlMapConfig.xml"; 25 InputStream inputStream = Resources.getResourceAsStream(resource); 26 // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory 27 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 28 } 29 30 // 根据 id查询用户信息 31 @Test 32 public void testFindUserById() { 33 // 数据库会话实例 34 SqlSession sqlSession = null; 35 try { 36 // 创建数据库会话实例sqlSession 37 sqlSession = sqlSessionFactory.openSession(); 38 // 查询单个记录,根据用户id查询用户信息 39 User user = sqlSession.selectOne("test.findUserById", 10); 40 // 输出用户信息 41 System.out.println(user); 42 } catch (Exception e) { 43 e.printStackTrace(); 44 } finally { 45 if (sqlSession != null) { 46 sqlSession.close(); 47 } 48 } 49 50 } 51 52 // 根据用户名称模糊查询用户信息 53 @Test 54 public void testFindUserByUsername() { 55 // 数据库会话实例 56 SqlSession sqlSession = null; 57 try { 58 // 创建数据库会话实例sqlSession 59 sqlSession = sqlSessionFactory.openSession(); 60 // 查询单个记录,根据用户id查询用户信息 61 List<User> list = sqlSession.selectList("test.findUserByName", ""); 62 System.out.println(list.size()); 63 } catch (Exception e) { 64 e.printStackTrace(); 65 } finally { 66 if (sqlSession != null) { 67 sqlSession.close(); 68 } 69 } 70 71 } 72 73 // 添加用户信息 74 @Test 75 public void testInsert() { 76 // 数据库会话实例 77 SqlSession sqlSession = null; 78 try { 79 // 创建数据库会话实例sqlSession 80 sqlSession = sqlSessionFactory.openSession(); 81 // 添加用户信息 82 User user = new User(); 83 user.setUsername("张小明"); 84 user.setAddress("河南郑州"); 85 user.setSex("1"); 86 user.setBirthday(new Date()); 87 sqlSession.insert("test.insertUser", user); 88 //提交事务 89 sqlSession.commit(); 90 } catch (Exception e) { 91 e.printStackTrace(); 92 } finally { 93 if (sqlSession != null) { 94 sqlSession.close(); 95 } 96 } 97 } 98 99 // 根据id删除用户 100 @Test 101 public void testDelete() { 102 // 数据库会话实例 103 SqlSession sqlSession = null; 104 try { 105 // 创建数据库会话实例sqlSession 106 sqlSession = sqlSessionFactory.openSession(); 107 // 删除用户 108 sqlSession.delete("test.deleteUser",26); 109 // 提交事务 110 sqlSession.commit(); 111 } catch (Exception e) { 112 e.printStackTrace(); 113 } finally { 114 if (sqlSession != null) { 115 sqlSession.close(); 116 } 117 } 118 } 119 120 // 更新用户信息 121 @Test 122 public void testUpdate() { 123 // 数据库会话实例 124 SqlSession sqlSession = null; 125 try { 126 // 创建数据库会话实例sqlSession 127 sqlSession = sqlSessionFactory.openSession(); 128 // 添加用户信息 129 User user = new User(); 130 user.setId(16); 131 user.setUsername("小明"); 132 user.setAddress("河南郑州"); 133 user.setSex("1"); 134 user.setBirthday(new Date()); 135 sqlSession.update("test.updateUser", user); 136 // 提交事务 137 sqlSession.commit(); 138 } catch (Exception e) { 139 e.printStackTrace(); 140 } finally { 141 if (sqlSession != null) { 142 sqlSession.close(); 143 } 144 } 145 } 146 }
5、整个工程目录结构
二、相关知识点:
1、#{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值
2、parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
3、selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:

selectList可以查询一条或多条记录。
4、Mybatis解决jdbc编程的问题
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决:将Sql语句配置在XXXX.xml文件中与java代码分离。
向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
5、与hibernate不同
hibernate是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。
应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。
mybatis专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:适用与需求变化较多的项目,比如:互联网项目。
资源下载链接:http://download.csdn.net/detail/u013865056/9906989