MyBatis(一)--环境搭建
一 什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。(官方解释)
二 为什么使用MyBatis?
1. MyBatis简单实用
MyBatis使用难度相对简单,仅仅需要导入jar包,配置Config的xml文件,以及实现mapper映射文件的编写,就可以使用。
2. MyBatis简化了JDBC代码的实现
在Web开发中,大量冗余复杂的持久层方法的实现大大提高了编程时的工作量,采用MyBatis时仅仅需要使用编写dao接口方法,已经在Mapper.XML中配置编写SQL语句即可
3. MyBatis实现了数据持久层的松耦合
MyBatis中,第二点减少代码开发倒并非重要,因为C3P0等线程池的使用,已经足够降低代码量了,而框架的使用重点在于第三点,实现了数据持久层与业务层的分离,我们可以在不改变Java代码的前提下,对持久层的很多东西进行改变,至于那些东西可以改变,即不需要改动dao层的所有持久层操作都可以改变。如: environment(MySQL,Oracle)的切换,SQL语句的改写(表明,操作等,但是不可以修改参数,返回值等dao层固定的内容,如果修改则需要修改dao)等。。。
三 MyBatis的环境配置
1.Jar包的使用
Jar包主要分为四类(由于直接导入的是新版本,所以有些包不认识,也没用到)
必须使用的包是:
动态代理的jar包:asm,cglib,javassist等
日志包:log4j相关 commons-logging包
mybatis核心包:mybatis包
sql连接包:mysql-connector- java
2.MyBatis配置文件
(1)MyBatis配置文件没有固定位置,因为会使用流的形式手动读取该XML文件,所以不固定位置,不过建议放在src目录下,另外同理配置文件名同样不需要固定。
(2)DTD的使用,DTD本身只是一种语法规则检测器,用于检测你的语法是否合理,以及为你做一些语法补充,这是必要的,无论是Config文件还是mapper文件都是必要的,至于怎么添加
http://www.mybatis.org/mybatis-3/zh/index.html 在中文官方网页中有示例,直接复制就好,不过config应该复制config的,mapper复制mapper的,两者语法不通
配置文件DTD:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
映射文件DTD:
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
(3)文件的配置
所有配置都放在configuration中
必须具备的是:
(1)<environments></>:用于配置环境,内部每种环境都使用<environment></>来构成,至少有一个, default属性用于选择当前环境,不过我这里只有一个MySQL的环境,必须。
(2)<environment>中使用JDBC的方式配置属性,不过每种属性的名称早已定义好,且必须使用driver,url,username,password。value值可以直接手动输入,不过我使用的是使用properties文件来松耦合,
使用properties的话,需要使用<properties>标签,声明properties文件位置。
(3)<setting>用于设置Mybatis的相关配置,不过开始不需要使用,不是必须。
(4)<mappers>标签,内部使用<mapper>标签来声明映射文件的位置,确保能够找到,不是必须,但是如果要使用映射文件,必须。
3.在Java中使用MyBaties
这里是一个封装工具类,用于完成一个SqlSession的创建
而SqlSession的实例就是我们SQL语句的执行者
创建步骤为:
(1)使用Resources的getResourceAsStream方法将配置文件读取成Input流,注意的是,这里的Resources应该是ibaties的类
(2)使用SqlSessionFactoryBuilder来创建SqlSession工厂,此处使用工厂模式,不懂自行百度。
(3)再使用工程,执行openSession方法来创建SqlSession,这里就得到了我们想要的sql执行者
(4)另外,由于流的产生,所以需要异常处理,且工具包的使用,不建议讲异常抛出(题外话)
(5)由于SqlSession是一个重型资源,所以不建议使用单例模式一直保存一个SqlSession,且在每次使用结束后建议关闭sqlSession
四 映射文件的配置与使用
1.映射文件的配置
(1)映射文件可以单独完成数据持久层操作,不需要dao与daoImpl的实现就可以完成操作,但是使用不便以及可读性差等原因不在spring中使用,不过这里就当个例子。
(2)映射文件可以看做一个类,mapper中的namespace(命名空间)可以看做一个类的完整路径,前者代表包usermapper看做类名,每一个select或则update等操作都可以看做是一个方法,id是方法名,parameterType则是参数值(不过值得注意的时,再不使用dao的情况下,仅仅只能使用一个参数【object】或则基本类型,多个参数是则使用map存放),resultType则代表返回值类型。
(3)update,insert以及delete等操作,返回值为01的boolean星,不需要定义,但是select必须定义返回值,另外,如果返回值为一个list时,并不是返回一个list,因为mysql查询依旧是指针一样逐条查询,所以返回bean类型就好了。
(4)在标签内部完成SQL语句的编写,对于未知值则可以使用#{}或则${}代替,内部名称,可以是bean类的属性名,可以是,map的key值,可以是@Param定义的变量值,也可以是0等值,根据你传参内容不定,不过${}使用的是拼接sql语句的方式,不建议使用,而#{}使用的是preperedStatement的方式预编译,具有安全性。
2.SqlSession的使用
(1)delete,insert,update不用多说,直接调用就好,第一个参数为上文中namespace(包+类)+id(方法名),第二个参数为传入的参数,有且只有一个。不过MyBatis对于SQL命令是以事务的方式存在的,这三步操作,由于牵涉到数据的变更,所以需要手动调用commit方法提交,而查询不需要。
(2)select操作分为select,selectList,selectMap,这就不用多说了,返回结果不同,select仅仅只能返回一条(一个对象),而list,map则可以返回多条。
(3)list时,需要的resultType必须是bean类,但是map既可以是bean类,也可以是map类型