引用的所有jar包,本demo是一个普通的java项目测试的:
aopalliance.jar
asm-3.3.1.jar
aspectjweaver.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
mybatis-3.2.7.jar
mybatis-spring-1.2.3.jar
mysql-connector-java-5.1.20-bin.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aop-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-context-support-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-orm-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-webmvc-4.1.6.RELEASE.jar
spring整合mybatis可以将mybatis单独配置读取实体类的位置文件部分,其他的配置由spring自己单独管理如,需先创建好数据库中User表:
<?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"> <!-- 配置mybatis --> <configuration> <!-- 配置别名 --> <typeAliases> <package name="mr.li.entity"/> </typeAliases> <!-- 引入mr.li.entity包下的user.mapper.xml文件,意思为:将此xml文件配置到mybatis下, 由mybatis框架最终执行,在mr.li.entity包下还可引入其他类的xml映射文件,最终都统一由mybatis执行 --> <mappers> <!-- 第一种:xml方式连接数据库 --> <mapper resource="mr/li/entity/user.mapper.xml"/> </mappers> </configuration>
在spring中的引用位置则是
<!-- 配置sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/>
<!-- 在处引用 --> <property name="configLocation" value="classpath:mybatis.cfg.xml"/> </bean>
好了,上面的都是套在下面的beans.xml中引用的,本文主要讲利用一个spring的beans.xml配置来完成spring继承mybatis,其中实体类(User)可以是user.mapper.xml的方式配置,也可以是@select...
注解的方式配置。总之都是要写sql语句的。下面展示的代码中UserMapper是注解版的,而UserDao则是xml版的(只对于实体类的配置而言)。写的不标准,但是功能做到了,本应该用userService,但是为了方便看,所以尽可能的简单一点。
1.userDao
package mr.li.dao; import java.util.List; import mr.li.entity.User; public interface UserDao { /** * 获得一个User集合 * @return */ List<User> selectList(); }
2.userDaoImpl
package mr.li.dao.impl; import java.util.List; import org.mybatis.spring.support.SqlSessionDaoSupport; import mr.li.dao.UserDao; import mr.li.entity.User; /** * 在mybatis-spring-1.2.3jar中,不在需要注入sqlSessionTemplate类,而是直接继承SqlSessionDaoSupport * 类来实现利用mybatis操作数据库的功能,此类中还是通过封装了sqlSessionTemplate类来实现的,这样做的好处 * 是能更好的支持数据库事务。 * @author Administrator * */ public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { @Override public List<User> selectList() { //此处引用user.mapper.xml文件中id为selectAll的标签 return getSqlSession().selectList("mr.li.entity.user.mapper.selectAll"); } }
3.spring配置beans.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置数据源:连接数据库 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!-- 声明式事务配置 开始 --> <!-- 配置事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置事务通知 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- 配置哪些方法使用什么样的事务,配置事务的传播特性:例如:REQUIRED是:在执行此配置的所有方法是先看看有没有事务开启(就是有没有其他此配置方法在执行),如果有那么在此方法执行完后等待此次整个事务 中的其他方法执行完毕一起提交,如果中间有哪个方法抛出异常则全部数据回滚 --> <tx:method name="add" propagation="REQUIRED"/> <tx:method name="insert" propagation="REQUIRED"/> <tx:method name="update" propagation="REQUIRED"/> <tx:method name="delete" propagation="REQUIRED"/> <tx:method name="remove*" propagation="REQUIRED"/> <tx:method name="get" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <!-- 以上配置的方法事事务在dao.impl中执行时会开启此次事务,一般正常配置应在service中配置,而不是dao中,此处仅用于测试 --> <aop:pointcut expression="execution(* mr.li.dao.impl.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/> </aop:config> <!-- 声明式事务配置 结束 --> <!-- 创建连接数据库第一种方式:创建userDao实例开始 --> <!-- 配置sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 设置spring读取实体对象的配置类信息,在entity包下的所有.mapper.xml文件 --> <property name="mapperLocations" value="classpath:mr/li/entity/*.mapper.xml"/> </bean> <!-- 通过set方法创建一个userDao的实例 --> <bean id="userDao" class="mr.li.dao.impl.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <!-- 创建userDao实例结束 --> <!-- 创建连接数据库第二种方式:采用注解的方式 --> <bean id="userMapper" class = "org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="mr.li.mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> </beans>
4.实体类的xml版,user.mapper.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="mr.li.entity.user.mapper"> <!-- mybatis查询user集合,这只id为selectAll,其他地方如果引用就需要调用这个id resulType:这参数作用:返回类型:如果前面有指定包名则会加上前面的包名,如果没有设置则需要全名 这里不能指定所以用的是全名 --> <select id="selectAll" resultType="mr.li.entity.User"> select * from user </select> </mapper>
5.实体类的注解版Mapper
package mr.li.mapper; import java.util.List; import org.apache.ibatis.annotations.Select; import mr.li.entity.User; public interface UserMapper { @Select("select * from user") List<User> selectList(); }
7.User实体类
package mr.li.entity; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public User() { } }
8.测试类
package mr.li.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import mr.li.dao.UserDao; import mr.li.entity.User; import mr.li.mapper.UserMapper; public class Test { public static void main(String[] args) { //第一种方式 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserDao userDao = (UserDao)context.getBean("userDao"); System.out.println(userDao.selectList().size()); //第二种方式 UserMapper userMapper = (UserMapper)context.getBean("userMapper"); for(User user : userMapper.selectList()) { System.out.println(user.getName()); } } }
测试结果,此结果是mysql数据库中的user表信息:
2
王二小
许三多