create table USER_INFO ( ID VARCHAR2(10) not null, USER_NAME VARCHAR2(50) not null, USER_AGE VARCHAR2(100) not null, USER_ADD VARCHAR2(200) )表创建好之后便创建其映射类“UserInfo”,位于包“vo”中
public class UserInfo { private String id; private String userName; private String userAge; private String userAdd; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserAge() { return userAge; } public void setUserAge(String userAge) { this.userAge = userAge; } public String getUserAdd() { return userAdd; } public void setUserAdd(String userAdd) { this.userAdd = userAdd; } }映射类创建好之后便创建MyBatis映射文件(即Mapper文件),位于conf的mapper包中,文件内容如下:
<?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="UserInfoMapper"> <resultMap type="UserInfo"> <id property="id" column="id" /> <result property="userName" column="user_name" /> <result property="userAge" column="user_age" /> <result property="userAdd" column="user_add" /> </resultMap> </mapper>Mapper文件中的resultMap用于配置表中字段与映射类属性间的映射关系,其中的"type"表示映射类的完整类名,但此处没有使用"vo.UserInfo"的原因是在MyBatis配置文件中配置了其别名。
<?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="UserInfo"/> </typeAliases> <!-- 配置Mapper文件的路径 --> <mappers> <mapper resource="mapper/UserInfoMapper.xml"/> </mappers> </configuration>如果不与Spring进行整合的话,此配置文件还需要配置数据源信息,与Spring整合之后数据源就配置在Spring配置文件中,只需要配置映射文件的路径就可以了。
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl jdbc.username=des jdbc.password=des接下来创建Spring配置文件“applicationContext.xml”,此时配置文件是空的,文件内容如下:
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> </beans>
然后便可以在Spring配置文件中引入jdbc配置文件了,代码如下所示:
<context:property-placeholder location="classpath:jdbc.properties"/>
然后在Spring配置文件配置数据源Bean,代码如下:
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property value="${jdbc.driverClassName}" /> <property value="${jdbc.url}" /> <property value="${jdbc.username}" /> <property value="${jdbc.password}" /> </bean>在Mybatis中对数据库的所有操作都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。但是Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。通过SqlSessionFactoryBean我们可以通过对其指定一些属性来提供Mybatis的一些配置信息。所以接下来我们需要在Spring的applicationContext配置文件中定义一个SqlSessionFactoryBean。
<bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定使用的数据源 --> <property ref="dataSource" /> <!-- 指定MyBatis配置文件路径 --> <property name="configLocation" value="MyBatisConf.xml"/> </bean>在定义SqlSessionFactoryBean的时候,dataSource属性是必须指定的,它表示用于连接数据库的数据源。当然,我们也可以指定一些其他的属性,下面简单列举几个:
<property> <array> <value>com.tiantian.mybatis.model.Blog</value> <value>com.tiantian.mybatis.model.Comment</value> </array> </property>l plugins:数组类型,用来指定Mybatis的Interceptor。
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>这样我们就可以通过Spring的依赖注入在Dao中直接使用SqlSessionTemplate来编程了。
在完成MyBatis与Spring的基本配置之后便可以编写Dao层、Service层代码。首先在MyBatis的Mapper文件中编写SQL语句,内容如下:
<select parameterType="String" resultMap="UserInfoMap"> select * from user_info where id = # {id} </select>此SQL表示根据用户ID查询用户信息,"id"用于唯一表示此SQL语句,"parameterType"表示传入参数类型,"resultMap"表示返回映射类要与映射关系元素的"id"保持一致。此时完整的Mapper文件内容如下(不包括文件头):
<mapper namespace="UserInfoMapper"> <resultMap type="UserInfo"> <id property="id" column="id" /> <result property="userName" column="user_name" /> <result property="userAge" column="user_age" /> <result property="userAdd" column="user_add" /> </resultMap> <select parameterType="String" resultMap="UserInfoMap"> select * from user_info where id = # </select> </mapper>然后创建接口IUserDao,位于包"dao"中,代码如下:
public interface IUserDao {\ /** * 根据用户ID查询用户信息 * @param id * @return */ public UserInfo findUserById(String id); }然后创建此接口的实现类"UserDaoImpl",位于包"dao.impl"中,代码如下:
public class UserDaoImpl implements IUserDao { private SqlSessionTemplate sessionTemplate; public void setSessionTemplate(SqlSessionTemplate sessionTemplate) { this.sessionTemplate = sessionTemplate; } @Override public UserInfo findUserById(String id) { UserInfo user = sessionTemplate.selectOne("UserInfoMapper.selectUserByID", "12"); return user; } }然后在Spring配置文件中注册此实现类的Bean,并为其注入"sessionTemplate"的属性值,代码如下:
<bean class="dao.impl.UserDaoImpl"> <property name="sessionTemplate" ref="sessionTemplate" /> </bean>最后一步便是编写Service代码,由于此案例没有使用前端页面调用的方式,所以就在Service中通过main方法模拟对Dao层的调用,否则还应有Service层接口、controller层编码以及前端页面。Service类"UserService "位于包"service"中
public class UserService { //Spring容器 private static ApplicationContext ctx; private static IUserDao userDao; static { // 在类路径下寻找Spring配置文件 ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } public static void main(String[] args) { userDao = (IUserDao)ctx.getBean("userDao"); UserInfo user = userDao.findUserById("12"); System.out.println(user.getId()); System.out.println(user.getUserName()); } }上述类中有两个属性,"ctx"就是Spring容器,在main方法中先通过其给属性"userDao"赋值,然后调用其方法"findUserById"通过用户ID查询用户信息。