MyBatis和Spring相结合-环境搭建

来源:互联网 发布:c 知乎 编辑:程序博客网 时间:2024/06/05 18:08

—-将MyBatis和Spring相结合也就是将类的创建交给Spring来管理,以及事物的开启和提交也交给Spring来操作,避免我们自己做一些繁琐的事,让我们不再关注事物的开启和提交,一心去做有关项目的其他操作。该项目主要是通过Maven来管理其中所用到的jar包,所以我在这里只贴出所用到的一些jar包的图出来:


这里写图片描述
1.搭建环境自然避免不了配置文件,由于我创建的是Maven项目,首先在src/main/resources文件下面创建applicationContext.xml,里面主要数据库的一些配置,以及事物管理器和一些Bean的配置,下面是该文件的内容:

<?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:aop="http://www.springframework.org/schema/aop"     xmlns:tx="http://www.springframework.org/schema/tx"     xmlns:context="http://www.springframework.org/schema/context"     xsi:schemaLocation="              http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd              http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-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/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd              http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"              default-autowire="no" default-lazy-init="false">   <!-- 扫描Spring组件的包路径 -->  <context:component-scan base-package="com.ecjtu.spring.*"></context:component-scan>  <!-- 读取外部的配置文件,这个配置文件主要配置了数据库的连接信息 -->  <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    <property name="location">        <value>classpath:db-config.properties</value>    </property>  </bean>  <!--本示例采用DBCP连接池,应预先添加DBCP包的依赖。 -->   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">      <property name="driverClassName" value="${jdbc.driverClass}"/>     <property name="url" value="${jdbc.url}" />     <property name="username" value="${jdbc.username}"/>     <property name="password" value="${jdbc.password}"/>   </bean>  <!-- sqlSessionFactory -->  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">      <!--dataSource属性指定要用到的连接池-->      <property name="dataSource" ref="dataSource"/>      <property name="typeAliasesPackage" value="com.ecjtu.*.bean" />     <property name="mapperLocations" >        <list>            <!--xml文件的位置-->            <value>classpath:/com/ecjtu/spring/bean/*.xml</value>        <!--    <value>classpath:/com/ecjtu/test/entity/*.xml</value> -->        </list>     </property>  </bean>   <bean id="userOperation" class="org.mybatis.spring.mapper.MapperFactoryBean">        <!--sqlSessionFactory属性指定要用到的SqlSessionFactory实例-->         <property name="sqlSessionFactory" ref="sqlSessionFactory" />         <!--mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象-->         <property name="mapperInterface" value="com.ecjtu.spring.IOperation.UserOperation" />   </bean>  <bean id="deptOperation" class="org.mybatis.spring.mapper.MapperFactoryBean">        <!--sqlSessionFactory属性指定要用到的SqlSessionFactory实例-->         <property name="sqlSessionFactory" ref="sqlSessionFactory" />         <!--mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象-->         <property name="mapperInterface" value="com.ecjtu.spring.IOperation.DeptOperation" />   </bean>  <!-- 事物transactionManager管理 -->  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="dataSource"></property>  </bean>  <!-- 事物通知Advice Aspect是横切面,是一个抽象的概念,  AOP功能增强器,Advice是Aspect的具体实现-->  <tx:advice id="transactionAdvice" transaction-manager="transactionManager">    <tx:attributes>        <!-- propagation事物传播行为,isolation,事物的隔离级别 rollback-for,回滚策越-->        <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" isolation="DEFAULT"/>        <!-- 对查找方法进行只读事务 -->          <tx:method name="get" read-only="true"/>    </tx:attributes>  </tx:advice>  <!-- 切入点的配置 -->  <aop:config>    <aop:advisor advice-ref="transactionManager" pointcut="execution(* com.ecjtu.spring.service.*.*(..))"/>  </aop:config></beans> 

注:里面db-config.properties文件主要是数据库的连接属性,通过改变文件属性文件的内容来达到更改数据库连接

<property name="mapperLocations" >    <list>        <value>classpath:/com/ecjtu/spring/bean/*.xml</value>    </list></property>

上面的代码片段主要是配置实体类对应的xml文件的位置,这种方式就可以减少一个配置文件,还有一种方式则是再创建一个配置文件mybatis-config.xml,在里面配置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>    <!-- 实体类Mapping映射文件 -->    <mappers>        <mapper resource="com/ecjtu/mybatis/entity/mybatis-user-sql.xml"/>    </mappers></configuration>

2.部门实体和员工实体的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.ecjtu.spring.IOperation.DeptOperation">    <!-- 部门联合用户进行查询的配置 (一对多的方式:一个部门对应多个用户)  -->       <resultMap type="com.ecjtu.spring.bean.Dept" id="DeptsMap">        <id property="deptId" column="DEPTID"/>        <result property="deptName" column="DEPTNAME"/>        <!--记得加上命名空间-->        <collection  column="DEPTID" property="users"  ofType="com.ecjtu.spring.bean.User"             select="com.ecjtu.spring.IOperation.UserOperation.selectUserByDept"></collection>    </resultMap>    <!-- 查询部门 -->    <select id="selectDepts" parameterType="Integer" resultMap="DeptsMap">        SELECT * FROM DEPT         WHERE DEPTID = #{deptId}    </select></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="com.ecjtu.spring.IOperation.DeptOperation">    <!-- 部门联合用户进行查询的配置 (一对多的方式:一个部门对应多个用户)  -->       <resultMap type="com.ecjtu.spring.bean.Dept" id="DeptsMap">        <id property="deptId" column="DEPTID"/>        <result property="deptName" column="DEPTNAME"/>        <!--记得加上命名空间-->        <collection  column="DEPTID" property="users"  ofType="com.ecjtu.spring.bean.User"             select="com.ecjtu.spring.IOperation.UserOperation.selectUserByDept"></collection>    </resultMap>    <!-- 查询部门 -->    <select id="selectDepts" parameterType="Integer" resultMap="DeptsMap">        SELECT * FROM DEPT         WHERE DEPTID = #{deptId}    </select></mapper>

注意:此时先记住这两个xml文件的命名空间,等下我们要和mapper接口对应起来,这个需要一一对应,当然如果不使用接口的方式,这个命名空间就可以随意命名,当然根据一定的规范命名比较好,毕竟我们如果需要打印有关SQL语句的日志的话需要用到这个命名空间
3.创建Mapper接口,这时接口的命全类名就应该和上面xml文件的命名空间一样,接口中的方法名和xml文件中的sql文的Id相同,返回值和resultMap的值相同,如果返回的结果有多个,那么就需要返回List集合,方法的参数和parameterType的值相同

package com.ecjtu.spring.IOperation;import java.util.List;import com.ecjtu.spring.bean.User;public interface UserOperation {    public User getUserById(Integer userId);    public List<User> selectUserByDept(Integer deptId);}

4.创建ServiceImpl实现类,这里是通过Spring注解来配置Bean的

package com.ecjtu.spring.servicesImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.ecjtu.spring.IOperation.UserOperation;import com.ecjtu.spring.bean.User;import com.ecjtu.spring.services.IUserService;@Service("userService")public class UserServiceImpl implements IUserService{    @Autowired    private UserOperation userDao;    public User getUserById(Integer userId) {        return userDao.getUserById(userId);    }}

5.接下来就可以测试了,创建Test.java类:

package com.ecjtu.test;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.ecjtu.spring.IOperation.UserOperation;import com.ecjtu.spring.bean.User;import com.ecjtu.spring.services.IUserService;public class Test {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //通过Spring拿到sessionFactory创建session        SqlSessionFactory sessionFactory = (SqlSessionFactory) context.getBean("sqlSessionFactory");        SqlSession session = sessionFactory.openSession();        //根据Mapper接口中的方法来查询数据,        UserOperation userOperation = session.getMapper(UserOperation.class);        User user = userOperation.getUserById(1001);        System.out.println(user.getUsername() + "111");        //根据xml文件中id来查询数据        List<User> users = session.selectList("selectUserByDept", 2001);        for(User user3 : users){            System.out.println(user3.getUsername());        }        //和Spring结合后可以利用Spring来为我们创造Mapper接口        UserOperation userOperation2 = context.getBean("userOperation",UserOperation.class);        User user2 = userOperation2.getUserById(1001);        System.out.println(user2.getUsername() + "222");        //通过spring注解配置了service,拿到service再去操作数据库        IUserService userService = context.getBean("userService", IUserService.class);        User user4 = userService.getUserById(1001);        System.out.println(user4.getUsername() + "444");    }}

注:里面的注解应该挺清晰的了,主要是先通过Spring来拿到SqlSessionFactory,再通过它来创建SqlSession,拿到Session就可以随意操作数据库了


##下面是测试项目的整体结构图

这里写图片描述

0 0