MyBatis框架总结

–1、介绍
-1、框架(Framwork)是一个提供了可重要的公共结构的半成品
-2、mybatis介绍:mybatis前身是ibatis,是Apache旗下的一个开源项目 之前学的Apache旗下的tomcat
-3、mybatis作用:对jdbc进行封装,简化了jdbc的代码,实现通过ROM来完成对数据库的操作
-4、ORM:对象关系映射 对象指的是java实体类创建的对 关系指的是关系型数据库 映射指的是实体类中的属性和数据库表中的字段的映射
查询功能:不需要用ResultSet来处理结果集 而且mybatis框架帮我们做好他们之间对应关系
-5、官网:
1.mybatis官网:http://mybatis.org
2.Gutgyb官网:https://github.com/mybatis

–2、MyBatis的优缺点

-1、优点:
	与jdbc相比,减少了50%以上的代码量
	最简单的持久化框架,小巧并简单易学
	SQL代码从程序代码中彻底分离,可重用
	通过XML标签,支持编写动态SQL
	通过映射标签,支持对象与数据库的ORM字段映射
	
-2、缺点: M
	SQL语句编写工作量大,对开发人员有一定要求
	数据库移植性差(不同数据库之间的切换,因为不同的接口,他们的SQL语法有些不同)

MyBatis专注于SQL本身,是一个只够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目

–3、mybatis开发环境搭建 连接数据库,对数据进行操作 对jdbc进行进行封装

 -1、创建web项目

-2、在 WebRoot——>WEB-INF——>lib 中导入mybatis的依赖jar包和mysql的驱动依赖jar包,并build path一下
	mybatis-3.2.2.jar
	mysql-connector-java-5.1.0-bin.jar

-3、创建一个util工具包	来创建连接数据库使用的SqlSession会话
	代码:
		//创建sqlsessionfactory   在创建sqlsession
		public static SqlSessionFactory factory;//跟application作用范围一样 整个程序
			//静态代码块 只执行一次
			static{
				System.out.println("===== static factory ======");
				try {
					//读取全局配置文件 
					Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
					//创建session工厂
					factory = new SqlSessionFactoryBuilder().build(reader);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			/**
			 * 获取session
			 * @return
			 */
			public static SqlSession createSqlSession(){
				return factory.openSession();
			}
			/**
			 * 关闭session
			 * @param session
			 */
			public static void closeSqlSession(SqlSession session){
				if (null!=session) {
					session.close();
				}
			}
		

-4、在src中创建mybatis的全局配置文件mybatis-config.xml
	配置连接数据库的信息
	代码:
		
		
		
			
			
				
					
					
					
					
						
						
						
						
					
				
			
			
			
				
			
		

-5、创建entity包来存放实体类	来创建一张表写入属性并生成setter/getter方法和tostring方法

-6、dao层接口及实现类  sql映射文件
	UserMapper.java接口
	
		代码:
			public List findAll();
	UserMapper.xml创建
	
		代码:
			
			
			
			
				
				
			
			
	UserMapperImpl.java创建
	如果是增加要写提交事假  把数据保存到数据库 在异常里写入回滚
		//提交事务
		session.commit();
		//回滚
		session.rollback();
	
		代码:
			SqlSession session;//相当于jdbc中的connection
			@Override
			public List findAll() {
				// TODO Auto-generated method stub
				//获取session对象
				try {
					session = MybatisUtil.createSqlSession();
					List list = session.getMapper(UserMapper.class).findAll();
					return list;
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					return null;
				}finally{
					MybatisUtil.closeSqlSession(session);
				}
			}

-7、把sql映射文件配置到mybatis的全局配置文件

-8、编写测试类进行测试

–4、mybatis工作原理
1、先读取全局配置文件mybatis-config.xml
2、由SqlSessionFactoryBuilder类的build方法来创建SqlSessionFactory(session工厂)
3、有SqlSessionFactory来创建SqlSession(sql会话 来执行sql语句)
4、session会话会根据Mapper.xml(sql映射文件)调用相应的sql语句

–5、介绍
-1、MyBatis真正强大之处就在于SQL映射文件,也是它的魅力所在。

–6、SQL映射文件的几个顶级元素配置:
-1、mapper:映射文件的更元素节点,只有一个属性namespace(命名空间),其作用如下:
1.用于区分不同的mapper,全局唯一
2.绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,mybatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句。因此namespace的命名必须要跟接口同名。
-2、cache:配置给定命名空间的缓存。
-3、cache-ref:从其他命名空间引用缓存配置
-4、resultMap:用来描述数据库结果集和对象的对应关系
-5、sql:可以重用的SQL块,也可以被其他语句引用。
-6、insert:映射插入语句
-7、update:映射更新语句
-8、delete:映射删除语句
-9、select:映射查询语句

–7、resultMap应用场景:
1.实体类中的属性和数据库表字段名不一致 使用resultMap自己去写映射关系
2.复杂联合查询

–8、select标签中的resultMap和resultType两个属性只能用一个
-1、什么时候使用resultType:
1.当查询结果符合值是基本数据类型 比如 int String Date等
2.当返回数据类型是跟实体类进行映射 然后字段名和属性名一致, 前提mybatis全局配置文件开启自动映射
-2、什么时候使用resultMap:
1.mybatis全局配置文件关闭了自动映射
2.字段名和属性名不一致
3.需要在resultMap标签来自映射关系

–9、在mybatis映射文件中书写sql where语句经常会用到大于小于号,如果直接用大于小于号就会报错

-1、解决办法1:
xml特殊字符可以适用转义字符代替
  <     <     小于号                                          

  >     >     大于号

  &    &     和

  '   ’     单引号

  "   "     双引号

 
-2、解决办法2:
   适用 节,将sql包括起来,在两者之间嵌入不想被解析程序解析的原始数据,解析器不对CDATA区中的内容进行解析,而是将这些数据原封不动地交给下游程序处理。

	例如:	SELECT * FROM studentinfo WHERE 
			 #{startAge} and sage < #{endAge}  ]]>

–10、使用@Param注解实现多参数入参
例:
public int updatePwd(@Param(“id”)Integer id,@Param(“pwd”)String pwd);

–11、${参数名} #{参数名} 区别:
$:字符串替换 一般用来传递表名或者字段名 直接拼接到sql语句当中
#:参数值替换 用来传递参数值 通过?占位符来进行参数替换

你可能感兴趣的:(java)