1.1MyBatis簡介
MyBatis 是一個可以自定義SQL、存儲過程和高級映射的持久層框架。MyBatis 摒除了大部分的JDBC代碼、手工設置參數和結果集重獲。MyBatis 只使用簡單的XML 和注解來配置和映射基本數據類型、Map 接口和POJO 到數據庫記錄。相對Hibernate和Apache OJB等“一站式”ORM解決方案而言,Mybatis 是一種“半自動化”的ORM實現。
需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(與Spring結合包)。
下載地址:
http://ibatis.apache.org/tools/ibator
http://code.google.com/p/mybatis/
1.2MyBatis+Spring+MySql簡單配置
1.2.1搭建Spring環境
1,建立maven的web項目;
2,加入Spring框架、配置文件;
3,在pom.xml中加入所需要的jar包(spring框架的、mybatis、mybatis-spring、junit等);
4,更改web.xml和spring的配置文件;
5,添加一個jsp頁面和對應的Controller;
6,測試。
可參照:http://limingnihao.iteye.com/blog/830409。使用Eclipse的Maven構建SpringMVC項目
1.2.2建立MySql數據庫
建立一個學生選課管理數據庫。
表:學生表、班級表、教師表、課程表、學生選課表。
邏輯關系:每個學生有一個班級;每個班級對應一個班主任教師;每個教師只能當一個班的班主任;
使用下面的sql進行建數據庫,先建立學生表,插入數據(2條以上)。
更多sql請下載項目源文件,在resource/sql中。
Sql代碼
- /* 建立數據庫 */
- CREATE DATABASE STUDENT_MANAGER;
- USE STUDENT_MANAGER;
- /***** 建立student表 *****/
- CREATE TABLE STUDENT_TBL
- (
- STUDENT_ID VARCHAR(255) PRIMARY KEY,
- STUDENT_NAME VARCHAR(10) NOT NULL,
- STUDENT_SEX VARCHAR(10),
- STUDENT_BIRTHDAY DATE,
- CLASS_ID VARCHAR(255)
- );
- /*插入學生數據*/
- INSERT INTO STUDENT_TBL (STUDENT_ID,
- STUDENT_NAME,
- STUDENT_SEX,
- STUDENT_BIRTHDAY,
- CLASS_ID)
- VALUES (123456,
- '某某某',
- '女',
- '1980-08-01',
- 121546
- )
創建連接MySql使用的配置文件mysql.properties。
Mysql.properties代碼
- jdbc.driverClassName=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/student_manager?user=root&password=limingnihao&useUnicode=true&characterEncoding=UTF-8
1.2.3搭建MyBatis環境
順序隨便,現在的順序是因為可以盡量的少的修改寫好的文件。
1.2.3.1創建實體類: StudentEntity
Java代碼
- public class StudentEntity implements Serializable {
- private static final long serialVersionUID = 3096154202413606831L;
- private ClassEntity classEntity;
- private Date studentBirthday;
- private String studentID;
- private String studentName;
- private String studentSex;
- public ClassEntity getClassEntity() {
- return classEntity;
- }
- public Date getStudentBirthday() {
- return studentBirthday;
- }
- public String getStudentID() {
- return studentID;
- }
- public String getStudentName() {
- return studentName;
- }
- public String getStudentSex() {
- return studentSex;
- }
- public void setClassEntity(ClassEntity classEntity) {
- this.classEntity = classEntity;
- }
- public void setStudentBirthday(Date studentBirthday) {
- this.studentBirthday = studentBirthday;
- }
- public void setStudentID(String studentID) {
- this.studentID = studentID;
- }
- public void setStudentName(String studentName) {
- this.studentName = studentName;
- }
- public void setStudentSex(String studentSex) {
- this.studentSex = studentSex;
- }
- }
1.2.3.2創建數據訪問接口
Student類對應的dao接口:StudentMapper。
Java代碼
- public interface StudentMapper {
- public StudentEntity getStudent(String studentID);
- public StudentEntity getStudentAndClass(String studentID);
- public List<StudentEntity> getStudentAll();
- public void insertStudent(StudentEntity entity);
- public void deleteStudent(StudentEntity entity);
- public void updateStudent(StudentEntity entity);
- }
1.2.3.3創建SQL映射語句文件
Student類的sql語句文件StudentMapper.xml
resultMap標簽:表字段與屬性的映射。
Select標簽:查詢sql。
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="com.manager.data.StudentMapper">
- <resultMap type="StudentEntity" id="studentResultMap">
- <id property="studentID" column="STUDENT_ID"/>
- <result property="studentName" column="STUDENT_NAME"/>
- <result property="studentSex" column="STUDENT_SEX"/>
- <result property="studentBirthday" column="STUDENT_BIRTHDAY"/>
- </resultMap>
- <!-- 查詢學生,根據id -->
- <select id="getStudent" parameterType="String" resultType="StudentEntity" resultMap="studentResultMap">
- <![CDATA[
- SELECT * from STUDENT_TBL ST
- WHERE ST.STUDENT_ID = #{studentID}
- ]]>
- </select>
- <!-- 查詢學生列表 -->
- <select id="getStudentAll" resultType="com.manager.data.model.StudentEntity" resultMap="studentResultMap">
- <![CDATA[
- SELECT * from STUDENT_TBL
- ]]>
- </select>
- </mapper>
1.2.3.4創建MyBatis的mapper配置文件
在src/main/resource中創建MyBatis配置文件:mybatis-config.xml。
typeAliases標簽:給類起一個別名。com.manager.data.model.StudentEntity類,可以使用StudentEntity代替。
Mappers標簽:加載MyBatis中實體類的SQL映射語句文件。
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>
- <typeAliases>
- <typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity"/>
- </typeAliases>
- <mappers>
- <mapper resource="com/manager/data/maps/StudentMapper.xml" />
- </mappers>
- </configuration>
1.2.3.5修改Spring 的配置文件
主要是添加SqlSession的制作工廠類的bean:SqlSessionFactoryBean,(在mybatis.spring包中)。需要指定配置文件位置和dataSource。
和數據訪問接口對應的實現bean。通過MapperFactoryBean創建出來。需要執行接口類全稱和SqlSession工廠bean的引用。
Xml代碼
- <!-- 導入屬性配置文件 -->
- <context:property-placeholder location="classpath:mysql.properties" />
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="${jdbc.driverClassName}" />
- <property name="url" value="${jdbc.url}" />
- </bean>
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="configLocation" value="classpath:mybatis-config.xml" />
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!— mapper bean -->
- <bean id="studentMapper" class="org.mybatis.spring.MapperFactoryBean">
- <property name="mapperInterface" value="com.manager.data.StudentMapper" />
- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
也可以不定義mapper的bean,使用注解:
將StudentMapper加入注解
Java代碼
- @Repository
- @Transactional
- public interface StudentMapper {
- }
對應的需要在dispatcher-servlet.xml中加入掃描:
Xml代碼
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="annotationClass" value="org.springframework.stereotype.Repository"/>
- <property name="basePackage" value="com.liming.manager"/>
- <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
- </bean>
1.2.4測試StudentMapper
使用SpringMVC測試,創建一個TestController,配置tomcat,訪問index.do頁面進行測試:
Java代碼
- @Controller
- public class TestController {
- @Autowired
- private StudentMapper studentMapper;
- @RequestMapping(value = "index.do")
- public void indexPage() {
- StudentEntity entity = studentMapper.getStudent("10000013");
- System.out.println("name:" + entity.getStudentName());
- }
- }
使用Junit測試:
Java代碼
- 使用Junit測試:
- Java代碼
- @RunWith(value = SpringJUnit4ClassRunner.class)
- @ContextConfiguration(value = "test-servlet.xml")
- public class StudentMapperTest {
- @Autowired
- private ClassMapper classMapper;
- @Autowired
- private StudentMapper studentMapper;
- @Transactional
- public void getStudentTest(){
- StudentEntity entity = studentMapper.getStudent("10000013");
- System.out.println("" + entity.getStudentID() + entity.getStudentName());
- List<StudentEntity> studentList = studentMapper.getStudentAll();
- for( StudentEntity entityTemp : studentList){
- System.out.println(entityTemp.getStudentName());
- }
- }
- }
MyBatis學習 之 一、MyBatis簡介與配置MyBatis+Spring+MySql
MyBatis學習 之 二、SQL語句映射文件(1)resultMap
MyBatis學習 之 二、SQL語句映射文件(2)增刪改查、參數、緩存
61
頂
11
踩
MyBatis學習 之 二、SQL語句映射文件(1 ... | SpringFlex框架搭建 之 二、配置使用Spri ...
參考知識庫
Java EE知識庫17380 關注 | 1301 收錄
評論
28 樓 saybar 2017-01-05
哪里有源代碼啊,?能否發一份?還有就是 ClassEntity 是什么類?怎么不一樣啊?我郵箱:411038060@qq.com
27 樓 liangzulin 2016-12-05
classentity是啥?哪個包的類啊?
這教程並不完整啊!
26 樓 di1984HIT 2014-10-22
寫的很好啊~
25 樓 mojito515 2013-05-05
引用
<bean id="studentMapper" class="org.mybatis.spring.MapperFactoryBean">
<property name="mapperInterface" value="com.manager.data.StudentMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
MapperFactoryBean的路徑寫錯了,應該是org.mybatis.spring.mapper.MapperFactoryBean
24 樓 大貓熊 2013-02-16
你好,可以把源代碼發到343816974@qq.com郵箱好嗎?
23 樓 xvsfeo 2012-12-20
你好,可以把源代碼發到410742933@qq.com郵箱好嗎?
22 樓 hdwmp123 2012-06-13
附件哪里下載呢?
21 樓 phoenixsfans 2012-06-10
您好,我也正在學MyBatis想看看您的上面例子的源碼,如果可以的話麻煩發到我郵箱 kissinglinux@gmail.com 謝謝
20 樓 hao_evolution 2012-04-10
limingnihao 寫道
hao_evolution 寫道
為啥加兩次 @Transactional ,在service層加不就可以了?
你說的兩次,第二次指的是在junit里邊吧。在junit里面加@Transactional可以使在測試增刪改后進行數據回滾,保證數據和測試之前的一樣,不加也沒問題。
@Repository
@Transactional
public interface StudentMapper {
}
個人覺得這里沒必要加事務,在service層去加事務控制
19 樓 limingnihao 2012-04-09
hao_evolution 寫道
為啥加兩次 @Transactional ,在service層加不就可以了?
你說的兩次,第二次指的是在junit里邊吧。在junit里面加@Transactional可以使在測試增刪改后進行數據回滾,保證數據和測試之前的一樣,不加也沒問題。
18 樓 hao_evolution 2012-04-09
為啥加兩次 @Transactional ,在service層加不就可以了?
17 樓 xiaoqiS 2012-02-20
不錯的入門教程
16 樓 幸福人生 2011-07-25
我的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="com.myproject" />
<!-- 定義受環境影響易變的變量 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<!-- 本地開發環境配置 -->
<value>classpath:jdbc.local.properties</value>
<value>classpath:sys_config.properties</value>
</list>
</property>
</bean>
<!-- 數據源配置,使用應用內的DBCP數據庫連接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="false">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url_mex}"/>
<property name="username" value="${jdbc.username_mex}"/>
<property name="password" value="${jdbc.password_mex}"/>
<!-- Connection Pooling Info -->
<property name="maxIdle" value="${dbcp.maxIdle}" />
<property name="maxActive" value="${dbcp.maxActive}" />
<property name="timeBetweenEvictionRunsMillis" value="3600000" />
<property name="minEvictableIdleTimeMillis" value="3600000" />
<property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}" />
</bean>
<!-- 事務管理器配置,單數據源事務 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:ibatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- mapper bean -->
<bean id="StudentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.myproject.report.dao.StudentMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean name="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</beans>
啟動后報錯:
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StudentMapper' defined in ServletContext resource [/WEB-INF/spring/appServlet/app-config.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/spring/appServlet/app-config.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.apache.ibatis.builder.xml.XMLConfigBuilder.<init>(Ljava/io/InputStream;Ljava/lang/String;Ljava/util/Properties;)V
不知什么原因,請各位予以解答,謝謝!
15 樓 limingnihao 2011-03-11
xiaojianhx 寫道
xiaojianhx 寫道
事務怎么加?
哦,寫錯了.....
是"事務怎么處理"
使用Spring的@Transactional注解,一般寫在Service層的接口方法上。
14 樓 xiaojianhx 2011-03-11
xiaojianhx 寫道
事務怎么加?
哦,寫錯了.....
是"事務怎么處理"
13 樓 xiaojianhx 2011-03-11
事務怎么加?
12 樓 小金哥 2010-11-26
小金哥 寫道
xiaojianhx 寫道
我eclipse 啟動tomcat的時候報錯,怎么回事啊
嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeException
代碼:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation">
<value>classpath:mybatis-config.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
遇到相同的問題,調試了一晚上沒有找到原因,不知7樓是否已經解決該問題了?若解決了,請不吝賜教!
終於弄明白了,原來是spring版本的問題,MyBatis-Spring只能在spring3.0版本上使用,如果用spring3.0以下版本就會出現該問題,建議將spring升級為3.0或改用ibatis2.0!
11 樓 JavaScape 2010-11-09
resultType 與resultMap 不能同時使用。
官方使用手冊里好像有這么一句,但是你的配置文件中同時配置了這兩個屬性:
<!-- 查詢學生,根據id -->
13. <select id="getStudent" parameterType="String" resultType="StudentEntity" resultMap="studentResultMap">
請樓主解釋一下?
10 樓 小金哥 2010-10-31
xiaojianhx 寫道
我eclipse 啟動tomcat的時候報錯,怎么回事啊
嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeException
代碼:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation">
<value>classpath:mybatis-config.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
遇到相同的問題,調試了一晚上沒有找到原因,不知7樓是否已經解決該問題了?若解決了,請不吝賜教!
源碼來源: minglisoft.cn/technology