01.mybatis使用引导与准备
1.ssm框架
指: sping+springMVC+mybatis
2.学习mybatis前准备web标准项目结构
model中的Ticket代码如下:
1 package com.day01.ssm.mybatisDemo.model; 2 3 /** 4 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 5 * 疑问咨询wx:851298348 6 */ 7 public class Ticket { 8 private Integer id; 9 private String startStation; 10 private String stopStation; 11 private String startTime; 12 private Integer ticketPrice; 13 14 public Integer getId() { 15 return id; 16 } 17 18 public void setId(Integer id) { 19 this.id = id; 20 } 21 22 public String getStartStation() { 23 return startStation; 24 } 25 26 public void setStartStation(String startStation) { 27 this.startStation = startStation; 28 } 29 30 public String getStopStation() { 31 return stopStation; 32 } 33 34 public void setStopStation(String stopStation) { 35 this.stopStation = stopStation; 36 } 37 38 public String getStartTime() { 39 return startTime; 40 } 41 42 public void setStartTime(String startTime) { 43 this.startTime = startTime; 44 } 45 46 public Integer getTicketPrice() { 47 return ticketPrice; 48 } 49 50 public void setTicketPrice(Integer ticketPrice) { 51 this.ticketPrice = ticketPrice; 52 } 53 }
dao层接口代码:
1 package com.day01.ssm.mybatisDemo.dao; 2 3 import com.day01.ssm.mybatisDemo.model.Ticket; 4 5 import java.util.List; 6 7 /** 8 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 9 * 疑问咨询wx:851298348 10 */ 11 public interface ITicketDao { 12 //增加 13 public void save(Ticket ticket); 14 //删除 15 public void deleteById(Integer id); 16 //修改 17 public void update(Ticket ticket); 18 //查找单个 19 public Ticket queryById(Integer id); 20 //查找所有 21 public List<Ticket> queryAll(); 22 }
dao实现代码结构
1 package com.day01.ssm.mybatisDemo.dao.impl; 2 3 import com.day01.ssm.mybatisDemo.dao.ITicketDao; 4 import com.day01.ssm.mybatisDemo.model.Ticket; 5 6 import java.util.List; 7 8 /** 9 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 10 * 疑问咨询wx:851298348 11 */ 12 13 /** 14 * 使用mybatis完成CRUD 15 */ 16 public class TicketDao implements ITicketDao { 17 @Override 18 public void save(Ticket ticket) { 19 //以前 加 链 预 执 释 20 //现在 mybatis 21 22 } 23 24 @Override 25 public void deleteById(Integer id) { 26 27 } 28 29 @Override 30 public void update(Ticket ticket) { 31 32 } 33 34 @Override 35 public Ticket queryById(Integer id) { 36 return null; 37 } 38 39 @Override 40 public List<Ticket> queryAll() { 41 return null; 42 } 43 }
到此准备工作完成.
02.03.04.05.mybatis实现增删改查
项目结构图先看为快:
1.框架和最佳实践
框架(Framework):
什么是框架,框架从何而来,为什么使用框架?
框架:
1.是一系列jar包,其本质是对JDK功能的拓展.
2.框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某一个领域的问题.
不同框架的目的就是解决不同领域的问题.
最佳实践(Best Practice):实际上是无数程序员经历过无数次尝试之后,总结出来的处理特定问题的特定方法.
如果把程序员的自由发挥看作是一条通往成功的途径,最佳实践就是其中的最短路径,能极大的解放生产力.
最佳实践三要素:可读性,可维护性,可拓展性.
消除重复
化繁为简
简单必须可读,简单必须可拓展
减少依赖,消除耦合
Web开发中的最佳实践:分层开发模式,即分工合作
JavaEE开发根据职责的纵向划分:表现层,业务层,持久层:
表现层(Predentation Layer):web/mvc:负责处理与界面交互的相关操作 (Struts2/Spring MVC)
业务层(Business Layer):service: 负责复杂的业务逻辑计算和判断 (Spring)
持久层(Persistent Layer):dao: 负责将业务逻辑数据进行持久化存储 (Hibernate/MyBatis)
2.ORM 与 MyBatis
对象关系映射(Object Relational Mapping,简称ORM/OR Mapping):
是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。
避免直接使用SQL语句对关系型数据库中的数据进行操作.
减少代码编写量,提高产品质量.
ORM 主要解决对象-关系的映射:
面向对象概念 面向关系概念
类 表
对象 表的行(记录)
属性 表的列(字段)
ORM的实现思想:
将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
ORM 采用元数据来描述对象-关系映射细节:
元数据通常采用 XML 格式,并且存放在专门的对象-关系映射文件中。
目前流行的ORM框架:
1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现.
2.Hibernate:目前最流行的ORM框架.设计灵巧,性能优秀,文档丰富.
3.MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps和DAO,允许开发人员直接编写SQL.
等
3.MyBatis历史
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的优势:
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。
MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis 使用简单的XML或注解用于配置和映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
4.MyBatis完成CRUD步骤
1.使用框架第一步:拷贝jar包.
a:MySQL驱动:mysql-connector-java-5.1.22-bin.jar
b:MyBatis的核心jar:mybatis-3.2.1.jar
c:MyBatis的依赖jar:MyBatis目录lib中所有jar.
ps:commons-logging-1.1.1.jar其实可以不需要
2.MyBatis的主配置文件:
MyBatis-config.xml--->从PDF中去找.
3.映射文件(写sql语句的文件)
4.创建链接
备注:
操作步骤:
无论是用过的Hibernate,MyBatis通用的操作步骤:
1. 从配置文件(通常是XML配置文件中)得到 sqlsessionfactory(相当于DataSource)。
2. 由sqlSessionfactory 产生 sqlSession(相当于Connection)。
3. 在session 中完成对数据的增删改查和事务提交等。
4. 在用完之后关闭session 。
具体实现步骤:
1.jar包
2. MyBatis-config.xml主配置文件
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <!--作用:配置链接数据库相关的信息--> 5 <configuration> 6 <!-- 环境配置--> 7 <environments default="development"> 8 <!--具体的数据库配置--> 9 <environment id="development"> 10 <!-- 事务管理--> 11 <transactionManager type="JDBC"/> 12 <!--dataSource连接池--> 13 <dataSource type="POOLED"> 14 <property name="driver" value="com.mysql.jdbc.Driver"/> 15 <property name="url" value="jdbc:mysql://localhost:3306/station_data"/> 16 <property name="username" value="root"/> 17 <property name="password" value="admin"/> 18 </dataSource> 19 </environment> 20 </environments> 21 22 <mappers> 23 <!--映射文件 关联sql 语句的文件--> 24 <mapper resource="mapper/ticketMapper.xml"/> 25 </mappers> 26 </configuration>
主配置文件模板来源于中文官方文档第5页.
3.映射文件(写sql语句的文件)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <!-- 5 namespace:该映射文件的名字,理论上可以任意取 6 --> 7 <mapper namespace="org.mybatis.example.BlogMapper"> 8 <select id="yy" parameterType="int" resultType="com.day01.ssm.mybatisDemo.model.Ticket"> 9 SELECT id,start_station startStation,stop_station stopStation,start_time startTime,ticket_price ticketPrice FROM ticket WHERE id=#{id} 10 </select> 11 12 <insert id="tt" parameterType="com.day01.ssm.mybatisDemo.model.Ticket" > 13 INSERT INTO ticket (start_station,stop_station) VALUES (#{startStation},#{stopStation}) 14 </insert> 15 16 <delete id="dd" parameterType="int"> 17 DELETE FROM ticket WHERE id=#{id} 18 </delete> 19 20 <update id="uu" parameterType="com.day01.ssm.mybatisDemo.model.Ticket"> 21 UPDATE ticket SET start_station=#{startStation},stop_station=#{stopStation} WHERE id=#{id} 22 </update> 23 24 <select id="ss" resultType="com.day01.ssm.mybatisDemo.model.Ticket"> 25 SELECT id,start_station startStation,stop_station stopStation,start_time startTime,ticket_price ticketPrice FROM ticket 26 27 </select> 28 </mapper>
该映射文件来源于中文官方文档第7页.
4.创建链接
CRUD具体实现代码:
1 package com.day01.ssm.mybatisDemo.dao.impl; 2 3 import com.day01.ssm.mybatisDemo.dao.ITicketDao; 4 import com.day01.ssm.mybatisDemo.model.Ticket; 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 import java.io.IOException; 11 import java.io.Reader; 12 import java.util.List; 13 14 /** 15 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 16 * 疑问咨询wx:851298348 17 */ 18 19 /** 20 * 使用mybatis完成CRUD 21 */ 22 public class TicketDao implements ITicketDao { 23 @Override 24 public void save(Ticket ticket) { 25 //以前 加 链 预 执 释 26 //现在 mybatis 27 try { 28 //指定mybatis主配置文件地址 29 String resource = "myBatis-config.xml"; 30 //读取配置文件内容 31 Reader reader = Resources.getResourceAsReader(resource); 32 //从配置文件(通常是XML配置文件中)得到 sqlSessionfactory 33 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 34 // 由sqlSessionfactory 产生 sqlSession(相当于Connection)。 35 SqlSession sqlSession = sqlSessionFactory.openSession(); 36 //开启事物 37 sqlSession.insert("org.mybatis.example.BlogMapper.tt",ticket); 38 //提交事物 39 sqlSession.commit(); 40 sqlSession.close(); 41 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } 45 46 47 } 48 49 @Override 50 public void deleteById(Integer id) { 51 //以前 加 链 预 执 释 52 //现在 mybatis 53 try { 54 //指定mybatis主配置文件地址 55 String resource = "myBatis-config.xml"; 56 //读取配置文件内容 57 Reader reader = Resources.getResourceAsReader(resource); 58 //从配置文件(通常是XML配置文件中)得到 sqlSessionfactory 59 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 60 // 由sqlSessionfactory 产生 sqlSession(相当于Connection)。 61 SqlSession sqlSession = sqlSessionFactory.openSession(); 62 //开启事物 63 sqlSession.delete("org.mybatis.example.BlogMapper.dd",id); 64 //提交事物 65 sqlSession.commit(); 66 sqlSession.close(); 67 68 } catch (IOException e) { 69 e.printStackTrace(); 70 } 71 72 } 73 74 @Override 75 public void update(Ticket ticket) { 76 77 //以前 加 链 预 执 释 78 //现在 mybatis 79 try { 80 //指定mybatis主配置文件地址 81 String resource = "myBatis-config.xml"; 82 //读取配置文件内容 83 Reader reader = Resources.getResourceAsReader(resource); 84 //从配置文件(通常是XML配置文件中)得到 sqlSessionfactory 85 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 86 // 由sqlSessionfactory 产生 sqlSession(相当于Connection)。 87 SqlSession sqlSession = sqlSessionFactory.openSession(); 88 89 sqlSession.update("org.mybatis.example.BlogMapper.uu",ticket); 90 //提交事物 91 sqlSession.commit(); 92 sqlSession.close(); 93 94 } catch (IOException e) { 95 e.printStackTrace(); 96 } 97 } 98 99 @Override 100 public Ticket queryById(Integer id) { 101 try { 102 //指定mybatis主配置文件地址 103 String resource = "myBatis-config.xml"; 104 //读取配置文件内容 105 Reader reader = Resources.getResourceAsReader(resource); 106 //从配置文件(通常是XML配置文件中)得到 sqlSessionfactory 107 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 108 // 由sqlSessionfactory 产生 sqlSession(相当于Connection)。 109 SqlSession sqlSession = sqlSessionFactory.openSession(); 110 //sqlSession 中完成对数据的增删改查和事务提交等 111 Ticket ticket= (Ticket)sqlSession.selectOne("org.mybatis.example.BlogMapper.yy", id); 112 sqlSession.close(); 113 return ticket; 114 } catch (IOException e) { 115 e.printStackTrace(); 116 } 117 return null; 118 } 119 120 @Override 121 public List<Ticket> queryAll() { 122 123 try { 124 //指定mybatis主配置文件地址 125 String resource = "myBatis-config.xml"; 126 //读取配置文件内容 127 Reader reader = Resources.getResourceAsReader(resource); 128 //从配置文件(通常是XML配置文件中)得到 sqlSessionfactory 129 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 130 // 由sqlSessionfactory 产生 sqlSession(相当于Connection)。 131 SqlSession sqlSession = sqlSessionFactory.openSession(); 132 //sqlSession 中完成对数据的增删改查和事务提交等 133 List<Ticket> list = sqlSession.selectList("org.mybatis.example.BlogMapper.ss"); 134 sqlSession.close(); 135 return list; 136 } catch (IOException e) { 137 e.printStackTrace(); 138 } 139 return null; 140 141 142 } 143 }
测试代码:
1 package com.day01.ssm.mybatisDemo.testDao; 2 3 import com.day01.ssm.mybatisDemo.dao.impl.TicketDao; 4 import com.day01.ssm.mybatisDemo.model.Ticket; 5 import org.junit.Test; 6 7 import java.util.List; 8 9 /** 10 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 11 * 疑问咨询wx:851298348 12 */ 13 public class TestTicketDao { 14 private TicketDao ticketDao=new TicketDao(); 15 /** 16 * 17 */ 18 @Test 19 public void testQueryById(){ 20 Ticket ticket = ticketDao.queryById(2); 21 System.out.println("ticket="+ticket); 22 } 23 24 @Test 25 public void testSave(){ 26 Ticket ticket = new Ticket(); 27 ticket.setStartStation("上海"); 28 ticket.setStopStation("北京"); 29 ticketDao.save(ticket); 30 } 31 32 /** 33 * 测试删除 34 */ 35 @Test 36 public void testDelete(){ 37 ticketDao.deleteById(6); 38 39 } 40 41 /** 42 * 更新车票 43 */ 44 @Test 45 public void testUpdate(){ 46 Ticket ticket = new Ticket(); 47 ticket.setId(2); 48 ticket.setStartStation("北京-改"); 49 ticket.setStopStation("成都"); 50 51 ticketDao.update(ticket); 52 } 53 @Test 54 public void test(){ 55 List<Ticket> tickets = ticketDao.queryAll(); 56 System.out.println(" tickets= "+tickets); 57 58 } 59 }