(读者注:事实上这个应该叫作很是基础的入门一下下,假设你看过Hibernate了那这个就很是的简单)web
文章来源:http://blog.csdn.net/techbirds_bao/article/details/9233599/
spring
写在这个系列前面的话:sql
之前之前用过ibatis,这是mybatis的前身。当时在作项目时。感受很是不错,比hibernate灵活。性能也比hibernate好。数据库
而且也比較轻量级。因为当时在项目中,没来的及作很是很是多笔记。后来项目结束了,我也没写总结文档。已通过去很久了。apache
但近期忽然又对这个ORM 工具感兴趣。因为接下来本身的项目中很是有可能採用这个ORM工具。因此在此又一次温习了一下 mybatis, 所以就有了这个系列的 mybatis 教程.
什么是mybatis
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。编程
MyBatis消除了差点儿所有的JDBC代码和參数的手工设置以及结果集的检索。api
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录.
orm工具的基本思想
不论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:
1. 从配置文件(通常是XML配置文件里)获得 sessionfactory.
2. 由sessionfactory 产生 session
3. 在session 中完毕对数据的增删改查和事务提交等.
4. 在用完以后关闭session 。数组
5. 在java 对象和 数据库之间有作mapping 的配置文件。也通常是xml 文件。
2. 将 mybatis-3.2.0-SNAPSHOT.jar。mysql-connector-java-5.1.22-bin.jar 复制到 webproject的lib文件夹.
3. 建立mysql 測试数据库和用户表,注意。这里採用的是 utf-8 编码
建立用户表,并插入一条測试数据
1. 在MyBatis 里面建立两个源代码文件夹,分别为 src_user,test_src, 用例如如下方式创建,鼠标右键点击 JavaResource.
2. 设置mybatis 配置文件:Configuration.xml, 在src_user文件夹下创建此文件,内容例如如下:
>
< !DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
< configuration>
<typeAliases>
<typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/yihaomen/mybatis/model/User.xml"/>
</mappers>
< /configuration>
>
< !DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper namespace="com.yihaomen.mybatis.models.UserMapper">
<select id="selectUserByID" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
< /mapper>
要保持一致,固然这里的 resultType 还有另外单独的定义方式,后面再说。
2. Configuration.xml 里面 的<mapper resource="com/yihaomen/mybatis/model/User.xml"/>是包括要映射的类的xml配置文件。
3. 在User.xml 文件中面 主要是定义各类SQL 语句,以及这些语句的參数。以及要返回的类型等.
開始測试
在test_src 源代码文件夹下创建com.yihaomen.test这个package,并创建測试类Test:
整个project文件夹结构例如如下:
假设不一致就会出错,这一章主要在上一讲基于接口编程的基础上完毕例如如下事情:
1. 用 mybatis 查询数据,包含列表
2. 用 mybatis 添加数据
3. 用 mybatis 更新数据.
4. 用 mybatis 删除数据.
查询数据。前面已经讲过简单的。主要看查询出列表的
查询出列表。也就是返回list, 在咱们这个样例中也就是 List<User> , 这样的方式返回数据。需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所相应的应该是咱们本身配置的
假设是查询单个数据的话,用第二讲用过的方法就可以了。
用mybatis 添加数据
在 IUserOperation 接口中添加方法:public void addUser(User user);
在 User.xml 中配置
以#{name}的形式引用Student參数
的name属性,MyBatis将使用反射读取Student參数
的此属性。#{name}中name大写和小写敏感。
引用其它
的gender等属性与此一致。seGeneratedKeys设置
为"true"代表要MyBatis获取由数据库本身主动生成的主
键;keyProperty="id"指定把获取到的主键值注入
到Student的id属性-->
<insert id="addUser" parameterType="User"
useGeneratedKeys="true" keyProperty="id">
insert into user(userName,userAge,userAddress)
values(#{userName},#{userAge},#{userAddress})
</insert>
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation=session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(4);
user.setUserAddress("原来是魔都的浦东创新园区");
userOperation.updateUser(user);
session.commit();
} finally {
session.close();
}
}
到此为止,简单的单表操做,应该都会了。接下来的时间了,我会讲多表联合查询,以及结果集的选取。
多对一的实现
场景:在读取某个用户发表的所有文章。
固然仍是需要在User.xml 里面配置 select 语句, 但重点是这个 select 的resultMap 相应什么样的数据呢。这是重点。这里要引入 association 看定义例如如下:
用spring 来管理 mybatis 与管理hibernate 有很是多相似的地方。今天的重点就是数据源管理以及 bean的配置。
你可以下载源代码后,对照着看,源代码没有带jar包,太大了,空间有限. 有截图,你可以看到用到哪些jar包,源代码在本文最后.
1. 首先对前面的project结构作一点改变,在src_user源码目录下创建目录config ,并将原来的 mybatis 配置文件 Configuration.xml 移动到这个目录中, 并在config 文家夹中创建 spring 配置文件:applicationContext.xml ,这个配置文件中最基本的配置:
characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource属性指定要用到的链接池-->
<property name="dataSource" ref="dataSource"/>
<!--configLocation属性指定mybatis的核心配置文件-->
<property name="configLocation" value="config/Configuration.xml"/>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!--sqlSessionFactory属性指定要用到的SqlSessionFactory实例-->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!--mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象-->
<property name="mapperInterface" value="com.yihaomen.mybatis.inter.IUserOperation" />
</bean>
characterEncoding=utf8"
p:username="root" p:password="password"
p:maxActive="10" p:maxIdle="10">
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource属性指定要用到的链接池-->
<property name="dataSource" ref="dataSource"/>
<!--configLocation属性指定mybatis的核心配置文件-->
<property name="configLocation" value="classpath:config/Configuration.xml" />
<!-- 所有配置的mapper文件 -->
<property name="mapperLocations" value="classpath*:com/yihaomen/mapper/*.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yihaomen.inter" />
</bean>
4. 编写 controller 层
源代码下载:
mybatis spring3 MVC 程序下载
数据库下载:
spring mvc 数据库測试文件
对于物理分页方案,不一样的数据库,有不一样的实现方法,对于mysql 来讲 就是利用 limit offset,pagesize 方式来实现的。oracle 是经过rownum 来实现的。假设你熟悉相关数据库的操做,是同样的很是好扩展。本文以mysql 为样例来说述.先看一下效果图(源码在文章最后提供下载):
实现mybatis 物理分页。一个最简单的方式是,是在你的mapper的SQL语句中直接写相似例如如下方式 :
这是简单的一种方式。但更通用的一种方式是用 mybatis 插件的方式. 參考了网上的很是多资料 ,mybatis plugin 方面的资料。写本身的插件.
不然将不会分页处理.
插件写好了,现在就可以在 spring mvc 中的controller 层中写一个方法来測试这个分页:
foreach元素的属性主要有item。index。collection,open。separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程当中,每次迭代到的位置,open表示该语句以什么開始,separator表示在每次进行迭代之间以什么符号做为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最easy出错的就是collection属性,该属性是必须指定的。但是在不一样状况下。该属性的值是不同的,主要有一下3种状况:
假设传入的是单參数且參数类型是一个List的时候。collection属性值为list
假设传入的是单參数且參数类型是一个array数组的时候。collection的属性值为array
假设传入的參数是多个的时候,咱们就需要把它们封装成一个Map了。固然单參数也可以封装成map。实际上假设你在传入參数的时候,在MyBatis里面也是会把它封装成一个Map的。map的key就是參数名。因此这个时候collection属性值就是传入的List或array对象在本身封装的map里面的key
1.1.单參数List的类型
解压下载后的 mybatis-generator-core-1.3.2-bundle.zip 文件。当中有两个文件夹:一个文件夹是文档文件夹docs,主要介绍这个代码生成工具怎样使用。还有一个是lib文件夹,里面的内容主要是jar 包,这里咱们需要 mybatis-generator-core-1.3.2.jar,这个 jar 包. 将它复制到咱们刚刚建立的 webproject的 WebContent/WEB-INF/lib 文件夹下.在这个文件夹下也放入 mysql 驱动jar包.因为用 mysql 作測试的.
2.在数据库中建立測试表
在mybatis数据库中建立 用来測试的category表(假设没有mybatis这个数据库,要建立。这是基于前面这个系列文章而写的。已经有了mybatis 这个数据库)
假设你想用命令行方式处理,也是可以的.
代码下载:mybatis 代码生成工具
但其实。假设有这个mapper接口不能完毕的工做。或者需要更复杂的扩展的时候,你就需要本身的DAO 层. 其实 mybatis 3 也是支持DAO 层设计的。相似于ibatis 2 .如下介绍下.
在此以前,请下载 上一篇文章提供的代码:http://www.yihaomen.com/article/java/326.htm
首先建立一个com.yihaomen.dao的package.而后在里面分别建立接口UserDAO,以及实现该接口的UserDAOImpl
在controller层中測试,直接调用dao层方法
在controller中增长方法: