Spring框架整合Mybatis
一、基础工程
基础工程就是之前我们学习MyBatis时使用的工程,里面没有任何Spring的内容。
1.1、建库建表
1.2、创建实体类
Role.java
public class Role {
private Long id;
private String roleName;
private String roleDesc;
//set和get方法
//toString方法
}
User.java
public class User {
private Long id;
private String username;
private String email;
private String password;
private String phoneNum;
private List<Role> roles;
//set和get方法
//toString方法
}
1.3、创建接口
RoleMapper.java
public interface RoleMapper {
List<Role> list();
void save(Role role);
List<Role> fingByUserId(Long uid);
}
UserMapper.java
public interface UserMapper {
List<User> list();
void save(User user);
void delete(Long uid);
}
UserRoleMapper.java
public interface UserRoleMapper {
void save(@Param("uid") Long uid, @Param("rid") Long rid);
void delete(Long uid);
}
1.3、创建映射配置文件
RoleMapper.xml
<mapper namespace="com.hpe.mapper.RoleMapper">
<!-- 写SQL语句 -->
<!-- 查询所有的角色 -->
<select id="list" resultType="role">
SELECT * FROM sys_role
</select>
<!--添加角色-->
<insert id="save" parameterType="role">
INSERT INTO sys_role(roleName,roleDesc) VALUES(${roleName},${roleDesc})
</insert>
<!--根据用户id查询角色-->
<select id="fingByUserId" parameterType="long" resultType="role">
SELECT
u.*,r.roleName roleName,r.roleDesc roleDesc
FROM
sys_user u,sys_role r,sys_user_role ur
WHERE
u.id=ur.userId AND r.id=ur.roleId AND u.id=${uid}
</select>
</mapper>
UserMapper.xml
<mapper namespace="com.hpe.mapper.UserMapper">
<resultMap id="userMap" type="user">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="email" property="email" />
<result column="password" property="password" />
<result column="phoneNum" property="phoneNum" />
<collection property="roles" ofType="role">
<id column="rid" property="id" />
<result column="roleName" property="roleName" />
<result column="roleDesc" property="roleDesc" />
</collection>
</resultMap>
<!-- 查询所有用户 -->
<select id="list" resultMap="userMap">
SELECT
u.*, r.id rid, r.roleName roleName, r.roleDesc roleDesc
FROM
sys_user u, sys_user_role ur, sys_role r
WHERE
u.id=ur.userId AND ur.roleId=r.id
</select>
<!-- 添加用户 -->
<insert id="save" parameterType="user">
<selectKey keyProperty="id" keyColumn="id" resultType="long" order="AFTER">
SELECT last_insert_id()
</selectKey>
INSERT INTO sys_user(username, email, password, phoneNum) VALUES(#{username}, #{email}, #{password}, #{phoneNum})
</insert>
<!-- 删除用户 -->
<delete id="delete" parameterType="long">
DELETE FROM sys_user WHERE id=#{uid}
</delete>
</mapper>
UserRoleMapper.xml
<mapper namespace="com.hpe.mapper.UserRoleMapper">
<!-- 添加用户角色关系 -->
<insert id="save">
INSERT INTO sys_user_role(userId, roleId) VALUES(#{uid}, #{rid})
</insert>
<!-- 删除用户角色关系 -->
<delete id="delete" parameterType="long">
DELETE FROM sys_user_role WHERE userId=#{uid}
</delete>
</mapper>
1.4、创建核心配置文件
<configuration>
<!-- 配置别名 -->
<typeAliases>
<package name="com.hpe.domian" />
</typeAliases>
</configuration>
其他的在spring配置文件里面配置了
1.5、测试
@Test
public void test1() throws IOException {
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.list();
for (User user : users) {
System.out.println(user);
}
}
二、Spring整合MyBatis
2.1、整合思路
将Session工厂交给Spring容器进行管理;
将事务交给Spring容器进行声明式事务控制。
2.2、将Session工厂交给Spring进行管理
<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: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/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 引入外部配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置包扫描 扫描spring注解-->
<context:component-scan base-package="com.hpe"/>
<!-- dataSource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置SqlSessionFactory 用于整合mybatis-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean>
<!-- 配置Mybatis包扫面 用于加入mapper文件 MapperScannerConfigurer-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.hpe.mapper"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置织入 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut id="pt" expression="execution(* com.hpe.service.impl..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt" />
</aop:config>
</beans>
2.6、Service层代码
接口RoleService.java
public interface RoleService {
List<Role> list();
void save(Role role);
}
接口UserService.java
public interface UserService {
List<User> list();
void save(User user, Long[] roleId);
void delete(Long uid);
}
实现类RoleServiceImpl.java
@Service//使用在service层用于实例化Bean
public class RoleServiceImpl implements RoleService {
@Autowired//注入RoleMapper
private RoleMapper roleMapper;
@Override
public List<Role> list() {
return roleMapper.list();
}
@Override
public void save(Role role) {
roleMapper.save(role);
}
}
实现类UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private UserRoleMapper userRoleMapper;
@Override
public List<User> list() {
List<User> users = userMapper.list();
return users;
}
@Override
public void save(User user, Long[] roleId) {
userMapper.save(user);
int i = 1/0;
Long uid = user.getId();
for (Long rid : roleId) {
userRoleMapper.save(uid, rid);
}
}
@Override
public void delete(Long uid) {
userRoleMapper.delete(uid);
userMapper.delete(uid);
}
}
2.7、测试
//指定运行时
@RunWith(SpringJUnit4ClassRunner.class)
//指定spring的配置文件
@SpringJUnitConfig(locations = "classpath:applicationContext.xml")
public class MyTest1 {
@Autowired
private RoleMapper roleMapper;
@Autowired
private UserMapper userMapper;
@Autowired
private UserService userService;
@Test
public void test4() {
User user = new User();
user.setUsername("EFGH");
user.setPhoneNum("2222");
user.setEmail("sdasda@126.com");
user.setPassword("22222");
Long[] ids = {2L, 3L};
userService.save(user, ids);
}
@Test
public void test1() {
List<Role> roles = roleMapper.list();
System.out.println(roles);
}
@Test
public void test2() {
List<User> users = userMapper.list();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void test3() {
User user = new User();
user.setUsername("AAAA");
user.setPhoneNum("2222");
user.setEmail("sdasda@126.com");
user.setPassword("22222");
userMapper.save(user);
System.out.println(user);
}
}