MyBatis简介
- Mybatis 开源免费框架.原名叫iBatis,2010在google code,2013年迁移到github
- 作用:数据访问层框架.
- 底层是对JDBC的封装.
- mybatis 优点之一:
- 使用mybatis时不需要编写实现类,只需要写需要执行的sql命令
MyBatis的mapper层搭建
- 主要是三个东西
- 配置的xml文件(名字随便起,包含环境,事务管理器选择,连接池选择,账号密码,连接数据库类型和映射对应连接的配置)
- 配置的映射表(写sql语句的地方)
- pojo包里面的pojo实体类
MyBatis环境搭建
-
导入jar包(仅有MyBatis核心包是必须的,其他仅仅是辅助MyBatis包顺便导入)
-
在src下新建全局配置文件(编写JDBC四个变量)
-
没有名称和地址要求
-
在全局配置文件中引入DTD或schema
- 如果导入dtd后没有提示
Window–>preference–>XML–>XMI catalog->add 按钮
- 如果导入dtd后没有提示
-
配置全局文件内容
-
-
新建以mapper 结尾的包,在包下新建:实体类名+Mapper.xml
- 文件作用:编写需要执行的SQL命令
- 把xml文件理解成实现类.
- xml文件内容
注意:
只要xml中涉及到了自己写的类,一定是全路径,因为反射机制反射类就是要全路径。
在mapper的select标签中,尽量设置pojo类和数据库列名一致,否则会出现无法取出情况,如果实在无法避免则可以通过改为,select id,name name123,price,production from flower(其中name123为pojo类中起的对应属性名
- 测试结果(只有在单独使用mybatis 时使用,最后ssm整合时下面代码不需要编写.)
实例化工厂对象(Factory)时使用的是构建者设计模式(.build())
构建sqlsessionfactory也可以不使用xml
环境搭建详解
- 全局配置文件中内容
- type属性可取值(事务管理方式)
- JDBC,事务管理使用JDBC原生事务管理方式
- MANAGED把事务管理转交给其他容器.原生JDBC事务setAutoMapping(false);(即不再自动提交,转为转交容器中控制)
- type 属性
- POOLED使用数据库连接池
- UNPOOLED不实用数据库连接池,和直接使用JDBC一样
- JNDI:java命名目录接口技术。(比较底层,如果要写其他语言对接才会用)
- type属性可取值(事务管理方式)
数据库连接池
-
在内存中开辟一块空间,存放多个数据库连接对象。
-
JDBC Tomcat Pool,直接由tomcat 产生数据库连接池.
-
图示
- active状态:当前连接对象被应用程序使用中
- ldle空闲状态:等待应用程序使用
-
使用数据库连接池的目的
- 在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率.
- 小型项目不适用数据库连接池.
- 在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率.
-
实现JDBCtomcat Pool的步骤.
-
在web项目的META-INF中存放context.xml,在context.xml编写数据库连接池相关属性(type表示在java通过name属性取到连接池对象时这个在java中类型是什么:数据源)
-
把项目发布到tomcat中,数据库连接池产生了
-
-
可以在java中使用jndi获取数据库连接池中对象
- Context:上下文接口,context.xml文件对象类型
- 代码:
- 当关闭连接对象时,把连接对象归还给数据库连接池,把状态改变成ldle
查询与映射
处理映射
-
XML
-
还有另一种方法来处理映射。 它们映射的语句可以不用 XML 来配置,而可以使用 Java 注解来配置,使用注解来映射简单语句会使代码显得更加简洁,然而对于稍微复杂一点的语句,Java 注解就力不从心了,并且会显得更加混乱。 因此,如果你需要完成很复杂的事情,那么最好使用 XML 来映射语句。
三种查询方式
-
1.selectList()返回值为List<resultType属性控制>
- 适用于查询结果都需要遍历的需求
-
2.selectOne()返回值Object,
- 适用于返回结果只是变量或一行数据时
-
3.selectMap()返回值Map
- 适用于需要在查询结果中通过某列的值取到这行数据的需求.
- Map<key,resultType 控制>
-
注意:
在数据访问层和控制器处理异常,service层异常只抛出不处理
命名解析:为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。-
完全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
-
短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用完全限定名。
-