之前做项目的时候,DAO层写了一些spring jdbc,用起来的确不是很方便,今天特意去学习了新的框架:mybatis.把之前用spring-jdbc写的内容换成了mybatis框架搭建的内容。
首先你要到mybatis的官网去下mybatis的jar包:mybatis-3.2.7.jar。由于我是在spring的基础上去搭建mybatis所以还要去弄一个mybatis-spring-1.2.2.jar, 这个连接的包好像在spring官方是找不到的,需要自己去网上找。
进入正题。首先在src下面建立一个mybitis-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> <mappers> <mapper resource="com/bookstore/mappers/config/UserMapper.xml"/> </mappers> </configuration>
这样就指明了mapper的路径可以定义多个mapper.
然后在com/bookstore/mappers/config这个路径下面建立一个UserMapper.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="UserMapper"> <select id="selectUser" parameterType="String" resultType="User"> select userName,password,email,phone,isVip from user where userName=#{userName} </select> <insert id="addUser" parameterType="User"> insert into user (userName,password,email,phone,isVip) values (#{userName},#{password},#{email},#{phone},#{isVip}) </insert> </mapper>
我简单地写了一个查询和一个插入。
简单地说下mybatis的核心,就在于一个sqlsession,mybatis是提供工厂方式去创建它。
在spring整合的时候,sqlseesionfactory是由bean去注入,然后生产出sqlsession再由sqlsessiondaosupport去得到sqlsession.
得到sqlsession之后就可以使用各种sql的方法了。
转回正题,接下来该去操作DAO层了,我现在DAO层写了一个BaseDao.它继承了sqlsessiondaosupport,什么都不去做。然后在创建一个UserDaoMappperDaoImpl去继承BaseDao,这样UserDaoMapperDaoImpl就可以使用sqlsessiondaosupport的方法去得到sessionsql了
UserDaoMapperDaoImpl:
package com.bookstore.dao.impl; import java.util.List; import com.bookstore.dao.UserDao; import com.bookstore.dao.impl.BaseDao; import com.bookstore.model.User; public class UserDaoMapperImpl extends BaseDao implements UserDao { public void addUser(User user) { this.getSqlSession().insert("UserMapper.addUser", user); } public User getUser(String userName) { return this.getSqlSession().selectOne("UserMapper.selectUser" ,userName); } }
最后必须在spring配置好:
我们先来理一理,首先sqlSessionFactory是要得到dateSource的,dateSource应该包含了连接池。BaseDao应该有一个属性叫做sqlSessionFactory,并且在前面讲到BaseDao继承了一个抽象类sqlSessionDaoSupport,然后呢是一个UserDaoMapperImpl类,只需要继承一个BaseDao就可以拥有属性sqlSessionFactory和sqlSessionDaoSupport。
Spring-config.xml:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="typeAliasesPackage" value="com.bookstore.model"></property> </bean> <bean id="baseDao" class="com.bookstore.dao.impl.BaseDao"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> <bean id="userDao" class="com.bookstore.dao.impl.UserDaoMapperImpl" parent="baseDao"> </bean>
我发现baseDao没有去写parent而userDao却写了,后来我在baseDao里面也加了parent反而出错了,原来是因为这两个继承的类一个是抽象类。所以不需要去写。
同理假如我拿掉这个baseDao类,直接让userDaoMapperImpl去继承sqlSessionSupport,然后再添加属性
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
也是一模一样的。