MyBatis来源~:
MyBatis本是apache的一个开源的项目,原来称为iBatis,2010年这个项目由apache softwarefoundation迁移到了google code,并改名为MyBatis。MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久性框架,是一个SQL映射框架。MyBatis消除了几乎所有的JDBC代码。MyBatis使用简单的XML或注解用于配置和映射,将接口和JavaPOJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。简单地说,MyBatis将SQL语句从程序里剥离出来,放到配置文件,并将查询结果和持久化类的属性通过配置文件做了映射,相对于HibernateORM框架,它属于一种“半自动化”的ORM实现!
MyBatis的优点以及使用场合!!
MyBatis小巧,简单易学,通过文档和源代码可以比较轻松掌握它的设计思路以及实现。其优点如下:
(1)简单且功能强大!通过SQL映射文件和SqlSession能够实现数据持久层的功能,与JDBC相比减少很多代码量!!
(2)开发猿能够完全为所欲为的控制所执行的SQL语句,尤其适用多表复杂查询!
(3)容易维护和修改。SQL语句写在了配置文件中,只要修改配置文件即可!
其缺点如下:
MyBatis属于半自动化框架的ORM,需要开发人员掌握SQL语句的编写。由于要写SQL语句,不同的数据库要重新修改SQL,因此MyBatis的数据库移植性不好。
MyBatis的适用场合:
如果不需要太多复杂的功能,而需要一个足够灵活的DAO层解决方案,或者对性能的要求很高,那么我介意使用MyBatis!
那么既然我们了解了它的适用场合也就应该了解一下它的不适用哪些场合:
(1)当希望对象的持久化对应用程序完全透明时,可以使用对象/映射方案,如hibernate。
(2)当数据库有移植需求,或者需要支持多种数据库时不要使用MyBatis。
(3)当应用程序需要完全动态的SQL时,如查询的字段都需要动态生成时不要使用MyBatis。
(4)当没有使用关系数据库时,或者使用的不是真正的关系数据库时不要使用MyBatis。
**************************************************************************************************************************
原理性的东西我们就介绍到这里吧,下面我们来使用MyBatis实现对数据库中的部门表进行增, 删, 改, 查;
第一步准备如下jar包!(jar 包下载地址我们可以去MyBatis的官网下载http://code.goole.com/p/mybatis这里我们推荐下载mybatis-3.2.2.zip)
第二步我们来编写与数据库交互的配置文件(名称可以取任意值,因为我们是专业的所以这里我们将其命名为mybatis-config.xml):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <!-- 事务策略是JDBC --> <transactionManager type="JDBC" /> <!-- 数据源的方式 POOLED --> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="orcl" /> <property name="password" value="orcl" /> </dataSource> </environment> </environments> <!--映射文件:描述某个实体和数据库表的对应关系 --> <mappers> <mapper resource="cn/happy/entity/Dept.xml" /> </mappers> </configuration>
注意!这里要讲一下其中的集合常用的元素作用:
(1)environments元素:用于配置多个数据环境,这样可以映射多个数据库信息。采用default来指定默认使用哪个数据库环境。environment则是每个数据库环境的具体配置,包括连接信息和事务管理信息。
在MyBatis中有两种事务管理器类型(type="[JDBC|MANAGED]"):
JDBC:直接使用了JDBC控制事务。它依赖于从数据源得到的连接来管理事务范围。
MANAGED:MyBatis自己不负责控制事务,它会让容器来管理事务的整个生命周期(如通过Spring或JavaEE应用服务器)。
数据源类型有三种:UNPOOLED, POOLED, JNDI。
UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好选择,因为它不需要及时的连接。
POOLED:采用连接池以避免创建新的连接实例时必要的初始连接和认证时间。这是一种当前Web应用程序快速响应请求的很流行的方法。
JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器。容器可以集中或在外部配置数据源,MyBatis通过JNDI获取数据源。
(2)mappers元素:包含所有mapper的列表,告诉MyBatis到哪里去找SQL语句。Mapper主要是定义SQL映射文件。
第三步我们需要配置SQL映射文件,命名规范建议实体类名加Mapper.xml后缀这里我将其命名为DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.happy.entity.Dept"> <!-- 1.1 查询所有部门信息 --> <select id="selectAllDept" resultType="cn.happy.entity.Dept"> <!-- 这里写的SQL,而不是HQL,SQL中的表名是不区分大小写的 --> select * from dept </select> <!-- 1.1 添加部门信息 --> <insert id="insertDept" parameterType="cn.happy.entity.Dept"> insert into dept values(SEQ_Num.nextval,#{deptName}) </insert> <!-- 1.2删除信息 --> <delete id="deleteDept" parameterType="cn.happy.entity.Dept"> delete from dept where deptNo=#{deptNo} </delete> <!-- 1.3修改信息 --> <update id="updateDept" parameterType="cn.happy.entity.Dept"> update dept set deptName=#{deptName} where deptNo=#{deptNo} </update> <!-- 1.4 模糊查询 含有市场的部门信息 --> <select id="likeDept" parameterType="cn.happy.entity.Dept" resultType="cn.happy.entity.Dept"> select * from dept where deptName like ‘%${deptName}%‘ </select> </mapper>
这样就配置完毕了,最后我们只需创建测试类测试即可
public class Mybatis_Test { SqlSession session; @Before //将开启session的方法提出 public void mybefore() throws IOException{ Reader reader = Resources.getResourceAsReader("MyBatis-config.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory sql = builder.build(reader); session = sql.openSession(); } @Test //查询所有部门的信息 public void selectAllDeptTest() throws IOException { List<Dept> selectList = session.selectList("selectAllDept"); for (Dept dept : selectList) { System.out.println(dept); } } @Test //根据编号修改部门信息 public void updateDeptTest(){ Dept dept=new Dept(); dept.setDeptNo(1); dept.setDeptName("市场部"); int count = session.update("cn.happy.entity.Dept.updateDept",dept); session.commit(); System.out.println(count+"update ok!"); session.close(); } @Test //删除一个部门 public void deleteDeptTest(){ Dept dept=new Dept(); dept.setDeptNo(1); int count=session.delete("cn.happy.entity.Dept.deleteDept",dept); session.commit(); System.out.println(count+"del ok!"); session.close(); } @Test //模糊查询部门信息 关键词为“财” public void likeDeptTest(){ Dept dept=new Dept(); dept.setDeptName("财"); List<Dept> selectList=session.selectList("cn.happy.entity.Dept.likeDept",dept); for (Dept dept2 : selectList) { System.out.println(dept2); } } @Test //添加一个部门 public void insertDeptTest(){ Dept dept = new Dept(); dept.setDeptName("女神部"); int count = session.insert("cn.happy.entity.Dept.insertDept",dept); session.commit(); System.out.println(count+"添加成功"); } }
感兴趣的可以根据如上四个步骤去玩一把,下面内容会逐步更新!!!需要以上素材的可以私聊我 下期再见~~