什么是MyBatis
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
ibatis=mybatis
和Hibernate对比
搭建MyBatis开发环境的步骤
搭建MyBatis环境时,我们一般需要做以下几个步骤的工作:
1》创建java工程
2》找到开发MyBatis应用需要使用到的jar文件.
3》创建数据库表.
4》创建pojo文件.
5》创建针对表操作的xml文件
6》创建MyBatis的xml配置文件
7》编写测试类
1、创建java工程
2、导入java包
核心包
mybatis-3.1.1.jar
依赖包
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
log4j-1.2.16.jar
slf4j-api-1.6.2.jar
slf4j-log4j12-1.6.2.jar
数据库驱动包
mysql-connector-java-5.0.6-bin.jar
测试包
junit-4.4.jar
3、创建数据库表
创建数据库:
1 create database mybatis; 2 3 use mybatis;
创建表:
1 create table user(id int primary key not null auto_increment,name varchar(50),age int,address varchar(150)); 2 3 desc user;
插入一条记录:
1 insert user values(‘1001’,’zhangsan’,25,’beijing’)
4.创建pojo
1 public class User { 2 private Integer id; 3 private String name; 4 private Integer age; 5 private String address; 6 public Integer getId() { 7 return id; 8 } 9 public void setId(Integer id) { 10 this.id = id; 11 } 12 public String getName() { 13 return name; 14 } 15 public void setName(String name) { 16 this.name = name; 17 } 18 public Integer getAge() { 19 return age; 20 } 21 public void setAge(Integer age) { 22 this.age = age; 23 } 24 public String getAddress() { 25 return address; 26 } 27 public void setAddress(String address) { 28 this.address = address; 29 } 30 @Override 31 public String toString() { 32 return "User [id=" + id + ", name=" + name + ", age=" + age 33 + ", address=" + address + "]"; 34 } 35 }
5.创建针对表操作的xml文件UserMapper.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:必需保证唯一,一般是当前文件的全名 --> 7 <mapper namespace="cn.itcast.dao.UserMapper"> 8 9 <!-- <select>:查询时使用 10 id:相当 于方法名,在同一文件中不能有相同的id名 11 parameterType:指定方法传入的参数类型,integer=java.lang.Integer 12 resultType:指定方法的返回类型 13 --> 14 <select id="loadUserById" parameterType="integer" resultType="cn.itcast.pojo.User"> 15 select * from user where id=#{id} 16 </select> 17 18 <!-- <insert>:插入记录 19 #{id}:=getId() 20 --> 21 <insert id="insertUser" parameterType="cn.itcast.pojo.User" > 22 insert into user values(#{id},#{name},#{age},#{address}) 23 </insert> 24 25 <!-- <update>:更新记录--> 26 <update id="updataUser" parameterType="cn.itcast.pojo.User"> 27 update user set name=#{name},age=#{age},address=#{address} where id=#{id} 28 </update> 29 30 <delete id="deleteUser" parameterType="integer"> 31 delete from user where id=#{id} 32 </delete> 33 <!-- ==================================================================== --> 34 <!-- 动态SQL 查询 --> 35 <select id="findUser" parameterType="cn.itcast.pojo.User" resultType="cn.itcast.pojo.User"> 36 select * from user 37 <where> 38 <if test="name != null"> 39 name like '%${name}%' 40 </if> 41 <if test="age !=null"> 42 and age=#{age} 43 </if> 44 <if test="address != null"> 45 and address like '%${address}%' 46 </if> 47 </where> 48 49 </select> 50 51 <!-- 公共查询条件 --> 52 <sql id="query_where"> 53 <where> 54 <if test="name != null"> 55 name like '%${name}%' 56 </if> 57 <if test="age !=null"> 58 and age=#{age} 59 </if> 60 <if test="address != null"> 61 and address like '%${address}%' 62 </if> 63 </where> 64 </sql> 65 66 <select id="countUser" parameterType="cn.itcast.pojo.User" resultType="int"> 67 select count(*) from user 68 <include refid="query_where"></include> 69 70 </select> 71 72 <!-- 动态更新 --> 73 <update id="updateUser2" parameterType="cn.itcast.pojo.User"> 74 update user 75 <set> 76 <if test="name != null">name=#{name},</if> 77 <if test="age != null">age=#{age},</if> 78 <if test="address != null">address=#{address}</if> 79 </set> where id=#{id} 80 </update> 81 82 <sql id="update_set"> 83 <set> 84 <if test="name != null">name=#{name},</if> 85 <if test="age != null">age=#{age},</if> 86 <if test="address != null">address=#{address}</if> 87 </set> 88 </sql> 89 90 <!-- 动态更新 .公共条件--> 91 <update id="updateUser3" parameterType="cn.itcast.pojo.User"> 92 update user 93 <include refid="update_set"/> where id=#{id} 94 </update> 95 96 </mapper>
6.创建MyBatis配置文件mybatis-config.xml
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 7 <!-- <environments>:它里边能指定多个数据库配置 default:默认加载的数据库配置 --> 8 <environments default="dev"> 9 <!-- 10 <environment>:相应数据库配置 11 id:在当前配置文件中必需保证唯一 12 --> 13 <environment id="dev"> 14 <!-- <transactionManager>:指定数据库事务的管理,一般由jdbc管理 --> 15 <transactionManager type="jdbc"></transactionManager> 16 <!-- <dataSource>:指定数据库相关连接--> 17 <dataSource type="pooled"> 18 <property name="driver" value="com.mysql.jdbc.Driver" /> 19 <property name="url" value="jdbc:mysql://localhost:3306/mybatis1023" /> 20 <property name="username" value="root" /> 21 <property name="password" value="root" /> 22 </dataSource> 23 </environment> 24 </environments> 25 26 27 <!-- <mappers>:配置所有的表的配置文件 --> 28 <mappers> 29 <!-- 30 <mapper>:引入相关表的配置文件 31 resource:指定表配置文件的所在位置 32 --> 33 <mapper resource="cn/itcast/dao/UserMapper.xml"/> 34 </mappers> 35 </configuration>
7.编写测试类TestUser.java
1 public class TestUser { 2 3 private SqlSession sqlSession = null; 4 @Before 5 public void init(){ 6 try { 7 // 读取mybatis配置文件 8 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); 9 // 获取SqlSessionFactory 10 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder() 11 .build(reader); 12 13 //获取SqlSession 14 sqlSession = sessionFactory.openSession(); 15 16 } catch (IOException e) { 17 e.printStackTrace(); 18 } 19 20 } 21 22 23 @Test 24 /** 25 * 更新一条数据 26 */ 27 public void testUpdataUser(){ 28 User user = new User(); 29 user.setId(1); 30 user.setName("wang"); 31 user.setAge(23); 32 user.setAddress("shanghai"); 33 int i = sqlSession.update("cn.itcast.dao.UserMapper.updataUser",user); 34 System.out.println(i); 35 sqlSession.commit(); 36 37 } 38 39 @Test 40 /** 41 * 插入一条数据 42 */ 43 public void testInserUser(){ 44 User user = new User(); 45 user.setId(1); 46 user.setName("wangwu"); 47 user.setAge(23); 48 user.setAddress("tianjin"); 49 int i = sqlSession.insert("cn.itcast.dao.UserMapper.insertUser",user); 50 System.out.println(i); 51 sqlSession.commit(); 52 53 } 54 @Test 55 /** 56 * 根据ID查询 57 */ 58 public void testLoadUserById() { 59 // 通过id查询user 60 User user = sqlSession.selectOne( 61 "cn.itcast.dao.UserMapper.loadUserById", 1); 62 System.out.println(user.toString()); 63 64 } 65 66 @Test 67 /** 68 * 根据ID删除一条数据 69 */ 70 public void testDeleteUserById() { 71 // 通过id查询user 72 int i = sqlSession.delete( 73 "cn.itcast.dao.UserMapper.deleteUser", 1); 74 System.out.println(i); 75 sqlSession.commit(); 76 77 } 78 79 @Test 80 /** 81 * 动态查询 82 */ 83 public void findUser(){ 84 85 User u = new User(); 86 //u.setName("zhao"); 87 u.setName("wang"); 88 List<User> list = sqlSession.selectList("cn.itcast.dao.UserMapper.findUser", u); 89 for (User user : list) { 90 System.out.println(user.toString()); 91 } 92 } 93 94 @Test 95 /** 96 * 动态查询.公共条件查询 97 */ 98 public void countUser(){ 99 100 User u = new User(); 101 //u.setName("zhao"); 102 u.setAge(23); 103 int i = sqlSession.selectOne("cn.itcast.dao.UserMapper.countUser", u); 104 System.out.println(i); 105 } 106 107 /** 108 * 动态更新 109 */ 110 @Test 111 public void updateUser2(){ 112 User user = new User(); 113 user.setId(1); 114 //user.setName("zhaowu2"); 115 user.setAge(26); 116 //user.setAddress("henan"); 117 int i = sqlSession.update("cn.itcast.dao.UserMapper.updateUser2", user); 118 System.out.println(i); 119 sqlSession.commit(); 120 } 121 122 /** 123 * 动态更新 124 */ 125 @Test 126 public void updateUser3(){ 127 User user = new User(); 128 user.setId(1); 129 //user.setName("zhaowu2"); 130 user.setAge(18); 131 //user.setAddress("henan"); 132 int i = sqlSession.update("cn.itcast.dao.UserMapper.updateUser3", user); 133 System.out.println(i); 134 sqlSession.commit(); 135 } 136 137 }
总结:
1 parameterType
在映射文件中通过parameterType指定输入 参数的类型。
2 resultType
在映射文件中通过resultType指定输出结果的类型。
3 #{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
4 selectOne和selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
如果使用selectOne报错:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
2 mybatis和hibernate本质区别和应用场景
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:
适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。