Mybatis第一天
1、什么是框架:Framework 模板. 简化开发的工具。
2、框架学习难度
2.1 应用 =>简单,编写代码简单。
2.2 理解 =>了解框架的开发模式,底层实现,源代码解读。
2.3 开发 =>编写框架,架构师难度。
3、MyBatis框架
3.1 历史
Apache开源组织的开源框架. iBatis. 版本有1.x和2.x.
2010年,迁移到google code平台下,更名为MyBatis,版本为3.x
2014年,迁移到github平台下,沿用命名MyBatis,版本为3.x.
3.2 框架由来
3.2.1 快速开发方式 JSP+Servlet+JavaBean开发方式
免容器启动,可以直接影响开发结果的开发方式.
结构不完整,维护成本高昂,可复用能力几乎为零.
3.2.2 MVC架构 JSP+Control开发方式
技术:JSP+Servlet+JDBC
优点:结构清晰. 代码部分复用
缺点:代码结构繁琐, 每次开发有大量重复代码
重复代码:处理请求参数(getParameter / getParameterValues / getParameterNames),处理文件上传(FileItem),处理文件下载(设置响应类型[application/octet-stream],设置响应头[content-dispositon;attchement;filename=xxxx]),处理AJAX数据返回(java对象->JSON字符串, response.getWriter().print(xxx) response.getWriter().flush())等.
3.2.3 框架开发(Spring+SpringMVC+MyBatis)
struts1,hibernate2.x,spring2.x,struts2,iBatis2.x, MyBatis,SpringMVC…….
优点:使用框架代替基础技术,实现针对性开发(只编写有效的业务代码,减少或杜绝编写重复的逻辑代码). 易于维护,易于升级,扩展
缺点:学习框架技术,XML配置文件大量出现。
4、MyBatis框架简介
mybatis是ORM框架,也可以称为OXM框架。
MyBatis框架对ORM做了小幅度改动,映射的结果集.不是数据库表和数据,半封装的数据访问层框架。
所有操作都是针对查询结果集实现的映射机制,就是JDBC中的ResultSet。
优点:灵活
缺点:自定义SQL语法
4.1 什么是ORM?
Object Relational Mapping 对象,关系型数据库映射。
将java中的类和数据库的表做映射,将java中的对象和数据库中的行记录做映射,将java对象中的属性和数据库中的字段做映射。
5、Mybatis入门案例(数据库表user的全局查询)
1.定义数据库表格
1 CREATE TABLE `user` ( 2 `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户名ID', 3 `username` varchar(20) DEFAULT NULL COMMENT '用户姓名', 4 `userage` int(5) DEFAULT NULL COMMENT '用户年龄', 5 PRIMARY KEY (`userid`) 6 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.提供测试数据
3.mybatis的环境的搭建
3.1 资源介绍
mybatis-x.x.x.jar 框架的核心jar包.
mybatis-x.x.x.pdf 官方提供的帮助文档, 英文版.
lib目录 MyBatis框架开发需要的依赖jar包.
3.2创建简单的Java工程项目并导入相应的jar
mybatis-3.2.7.jar mybatis核心包
lib/*.jar mybatis所有的依赖包
数据库驱动包
3.3 提供核心配置文件
为了提供数据库访问基础信息的配置文件.
数据库位置(URL), 登录名(username), 密码(password), 驱动类名(driver)
模板内容,核心配置文件的头信息从官方帮助文档中摘取.
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 </configuration>
导入离线dtd文件:mybatis-3-config.dtd(提示相应的根标签,快捷开发)
核心配置文件详情
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="development"> 8 <environment id="development"> 9 <!-- 配置Mybatis中的事物管理器 10 JDBC:使用jdbc的事物来处理 11 MANAGED:不做任何事物处理 12 --> 13 <transactionManager type="JDBC" /> 14 <!--数据库连接信息 15 type: 16 UNPOOLED:直连 17 POOLED:池连 18 JNDI:使用容器的池连。需要依赖jndi获取连接对象 19 --> 20 <dataSource type="UNPOOLED"> 21 <!-- 配置连接的具体参数 --> 22 <property name="driver" value="com.mysql.jdbc.Driver" /> 23 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> 24 <property name="username" value="root" /> 25 <property name="password" value="123456" /> 26 </dataSource> 27 </environment> 28 </environments> 29 <!-- 引用映射配置文件 --> 30 <mappers> 31 <!-- resource:相对路径查询资源的属性,相当于当前核心配置文件的位置开始查找 --> 32 <mapper resource="com/boom/pojo/User.xml"/> 33 </mappers> 34 </configuration>
3.4 编写pojo实体类和创建mapper配置映射文件
1 package com.boom.pojo; 2 3 import java.io.Serializable; 4 5 /** 6 * 实体对应的数据库表 7 * @project_name mybatis-01 8 * @class_name User 9 * @author Dilraba 10 */ 11 public class User implements Serializable { 12 13 private Integer userid;//用户名ID 14 private String username;//用户姓名 15 private Integer userage;//用户年龄 16 17 public Integer getUserid() { 18 return userid; 19 } 20 public void setUserid(Integer userid) { 21 this.userid = userid; 22 } 23 public String getUsername() { 24 return username; 25 } 26 public void setUsername(String username) { 27 this.username = username; 28 } 29 public Integer getUserage() { 30 return userage; 31 } 32 public void setUserage(Integer userage) { 33 this.userage = userage; 34 } 35 public User(Integer userid, String username, Integer userage) { 36 super(); 37 this.userid = userid; 38 this.username = username; 39 this.userage = userage; 40 } 41 42 public User() { 43 super(); 44 } 45 46 @Override 47 public String toString() { 48 return "User [userid=" + userid + ", username=" + username + ", userage=" + userage + "]"; 49 } 50 51 }
mapper映射配置文件的头信息
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 <mapper> 6 7 </mapper>
mapper配置信息的详情(简单的SQL语句的编写)
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 <mapper namespace="suibian"> 6 <select id="selectUserAll" resultType="com.boom.pojo.User"> 7 select * from user; 8 </select> 9 </mapper>
3.5 MyBatis工厂工具类 MyBatisUtils
1 package com.boom.util; 2 3 import java.io.InputStream; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 public class MybatisUtil { 11 private static SqlSessionFactory factory = null; 12 static{ 13 try { 14 if(factory == null){ 15 //通过工具类加载配置文件,返回读取配置文件的IO流 16 InputStream is = Resources.getResourceAsStream("suibian.xml"); 17 //SqlSessionFactoryBuilder创建SqlSessionFactory对象的构建器 18 factory = new SqlSessionFactoryBuilder().build(is); 19 } 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 //获取mybatis上下文对象 25 public static SqlSessionFactory getSqlSessionFactory(){ 26 return factory; 27 } 28 //获取SqlSession 29 public static SqlSession openSession(){ 30 return factory.openSession(); 31 } 32 }
3.6 定义DAO层的接口和接口的实现类
1 package com.boom.dao; 2 3 import java.util.List; 4 5 import com.boom.pojo.User; 6 7 public interface IUserDao { 8 //查询user表所有的数据 9 List<User> selectUserAll(); 10 11 }
1 package com.boom.dao.impl; 2 3 import java.util.List; 4 5 import org.apache.ibatis.session.SqlSession; 6 7 import com.boom.dao.IUserDao; 8 import com.boom.pojo.User; 9 import com.boom.util.MybatisUtil; 10 11 public class UserDaoImpl implements IUserDao { 12 13 /** 14 * 查询user表所有的数据 15 */ 16 @Override 17 public List<User> selectUserAll() { 18 SqlSession session = MybatisUtil.openSession(); 19 return session.selectList("selectUserAll"); 20 } 21 22 }
3.7 编写测试类测试代码
1 package com.boom.test; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.List; 6 7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory; 10 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 11 12 import com.boom.dao.IUserDao; 13 import com.boom.dao.impl.UserDaoImpl; 14 import com.boom.pojo.User; 15 16 public class MybatisTest { 17 18 public static void main(String[] args) { 19 20 /* 21 //1.指定配置文件的名称与路径 22 String resource = "suibian.xml"; 23 try { 24 //2.通过工具类加载配置文件,返回读取配置文件的IO流 25 InputStream is = Resources.getResourceAsStream(resource); 26 //3 1.SqlSessionFactoryBuilder创建SqlSessionFactory对象的构建器 27 // 2.SqlSessionFactory:mybatis上下文对象, 28 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); 29 SqlSession session = factory.openSession(); 30 List<User> list = session.selectList("selectUserAll"); 31 for (User user : list) { 32 System.out.println(user); 33 } 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 */ 38 39 IUserDao ud = new UserDaoImpl(); 40 List<User> list = ud.selectUserAll(); 41 for (User user : list) { 42 System.out.println(user); 43 } 44 } 45 46 }
测试结果
查询单条数据mapper写法:
1 <select id="selectById" parameterType="int" resultType="com.boom.pojo.User"> 2 select * from user where userid = #{userid} 3 </select>
dao接口和实现类
1 //根据id查询数据 2 User selectById(Integer userid);
1 /** 2 * 根据id查询数据 3 */ 4 @Override 5 public User selectById(Integer userid) { 6 SqlSession session = MybatisUtil.openSession(); 7 return session.selectOne("selectById", userid); 8 }
测试类及结果:
1 //根据id查询数据 2 IUserDao ud = new UserDaoImpl(); 3 User selectById = ud.selectById(new Integer(1)); 4 System.out.println(selectById);
4、MyBatis框架中的常用查询方法
selectList
查询多数据的方法.
方法定义: <T> List<T> selectList(String statement);
参数:statement - 映射文件中SQL语法对应的标签的ID属性值.
返回值:查询结果
有查询结果,返回对应长度的集合.
无查询结果,返回长度为0的集合对象.
selectOne
查询单一数据的方法.
方法定义:<T> T selectOne(String statement);
参数:statement - 映射文件中SQL语法对应标签的ID
返回值:查询结果
无查询结果,返回null
唯一查询结果,返回对象
多查询结果数据,抛出异常.
5、初试查询结果的映射
MyBatis的映射是针对ResultSet实现的映射关系.
MyBatis(所有的数据访问层框架)底层使用的技术都是JDBC.
可以通过分析ResultSet内容数据,实现映射.
MyBatis框架的默认映射规则是:
根据ResultSet中的字段名作为标准, 查询resultType类型中的property,或field,做数据的设置.
MyBatis忽略property/field的字母大小写.