Mybatis笔记之四 -- mybatis与spring整合简单例子

1、导入开发所需要的jar包

2、配置spring配置文件beans.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: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-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/tx
				         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
				         http://www.springframework.org/schema/aop 
				         http://www.springframework.org/schema/aop/spring-aop-3.0.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="root" />
	</bean>

	<bean id="sf" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<!--  将mybatis的配置文件引入  -->
		<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
		<property name="mapperLocations">//mybatis的映射文件导入,则不需要再sqlMapConfig.xml中在导入
			<value>classpath:cn/mybatis/domain/User.xml</value>
		</property>
	</bean>
	
	<bean id="userDao" class="cn.mybatis.dao.UserDaoImpl">
		<property name="sqlSessionFactory" ref="sf"></property>
	</bean>
	
	
	<!-- ================================事务相关控制=================================================    -->
	<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<tx:advice id="userTxAdvice" transaction-manager="transactionManager">
		<tx:attributes>
		<!-- 有事务就不用开启事务,没有就单独开启事务 -->
			<tx:method name="delete*" propagation="REQUIRED" />  
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="get*" read-only="true" />
			<tx:method name="select*" read-only="true" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut id="pc" expression="execution(* cn.mybatis.service.*.*(..))" />
		<!--把事务控制在Service层-->
		<aop:advisor pointcut-ref="pc" advice-ref="userTxAdvice" />
	</aop:config>
	
	<bean id="userService" class="cn.mybatis.service.UserServiceImpl">
		<property name="userDao" ref="userDao"></property>
	</bean>
	
</beans>
3、配置mybatis的配置文件sqlMapConfig.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>
	<typeAliases>
		<typeAlias type="cn.mybatis.domain.User" alias="User"/>
	</typeAliases>
	
	<mappers>
		<mapper resource="cn/mybatis/domain/User.xml"/>
	</mappers>
</configuration>

4、实体类与映射文件user.xml

package cn.mybatis.domain;

public class User {
	
	private String id;
	private String name;
	private String address;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		System.out.println("利用set方法设置id");
		this.id = id;
	}
	public String getName() {
		System.out.println("调用get方法获取Name");
		return name;
	}
	public void setName(String name) {
		System.out.println("利用set方法设置name");
		this.name = name;
	}
	public String getAddress() {
		System.out.println("调用get方法获取Address");
		return address;
	}
	public void setAddress(String address) {
		System.out.println("利用set方法设置ddres");
		this.address = address;
	}
	@Override
	public String toString() {
		
		return "id = "+id+"name = "+ name +" address" + address;
	}

}
映射文件
<?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="cn.mybatis.domain.User">
	
	<!-- 根据id查询 user-->
	<select id="selectUserById" parameterType="string" resultType="cn.mybatis.domain.User">
		select * from user where id = #{id}
		<!--  #{id} 中的参数可以随便写,因为是传进来的,在这里起到的是占位的作用-->
	</select>
	
	<!-- 查询所有的user -->
	<select id="selectAllUser" resultType="cn.mybatis.domain.User">
		select id,name,address from user
	</select>
	
	<!-- 根据id查询 user-->
	<select id="serlectUserByIdForMap" parameterType="string" resultType="hashmap">
		select id,name,address from user where id = #{id}
	</select>
	
	<!-- 插入User 参数为hashmap-->
	<insert id="inserUserForMap" parameterType="hashmap">
		insert into user(id,name,address) values(#{id},#{name},#{address})
	</insert>
	
	<!-- 插入user -->
	<insert id="insertUser" parameterType="cn.mybatis.domain.User">
		insert into user(id,name,address) values(#{id},#{name},#{address})
			<!-- 其中vlaues(#{id},#{name},#{address}中的参数不可以随便写,必须有对应的get方法,因为是通过反射注入进来的 -->
	</insert>
	
	<!-- 根据id删除user -->
	<delete id="deleteUserById" parameterType="string">
		delete from user where id = #{id}
	</delete>
	
	<!-- 根据id更新user -->
	<update id="updateUserById" parameterType="cn.mybatis.domain.User">
		update user set name = #{name}, address = #{address} where id =  #{id}
	</update>
	
		<!-- 根据id更新user 更新参数为Map-->
	<update id="updateUserByIdForMap" parameterType="hashmap">
		update user set name = #{name}, address = #{address} where id =  #{id}
	</update>
	
	
		
	<!-- 动态sql -->
	<select id="selectUserByCondition" parameterType="cn.mybatis.domain.User" resultType="cn.mybatis.domain.User">
		select id,name,address from user where 1=1
		<if test="id != null">
			and id = #{id}
		</if>
		<!-- userName指的是实体的属性 -->
		<if test="name != null">
			and name = #{name}
		</if>
		<if test="address != null">
			and address = #{address}
		</if>
	</select>
	
	<!-- 动态sql -->
	<select id="selectUserByCondition2" parameterType="cn.mybatis.domain.User" resultType="cn.mybatis.domain.User">
		select id,name,address from user
		<where>
			<if test="id != null">
			   id = #{id}
			</if>
			<!-- userName指的是实体的属性 -->
			<if test="name != null">
				and name = #{name}
			</if>
			<if test="address != null">
				and address = #{address}
			</if>
		</where>
	</select>
	
	<!-- 动态更新user -->
	<update id="updateUserByCondition" parameterType="User">
		update user 
		<set>
			<if test="name != null">
				name = #{name},
			</if>
			<if test="address != null">
				address = #{address}
			</if>
		</set>
		where id = #{id}
	</update>
	
</mapper>


 

5、dao层

package cn.mybatis.dao;

import java.util.List;

import cn.mybatis.domain.User;

public interface UserDao {
	
	//根据id查询User
	public User findUserById(String id);
	
	//查询所有User
	public List<User> findAllUser();
	
	//动态sql查询User
	
	public List<User> findUserByIdCondition(User user);
	
	//根据id删除User
	public int deleteUserById(String id);
	
	//添加User
	public int insertUser(User user);
	
	//更新User
	public int updateUserById(User user);
	
	public int updateUser(User user);	
	
}

dao实现

package cn.mybatis.dao.impl;

import java.util.List;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import cn.mybatis.domain.User;

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{

	//根据id查询User
	@Override
	public User findUserById(String id) {
		return (User) this.getSqlSession().selectOne("cn.mybatis.domain.User.selectUserById", id);
	}

	//根据id删除User
	@Override
	public int deleteUserById(String id) {
		int i = this.getSqlSession().delete("cn.mybatis.domain.User.deleteUserById", id);
		return i;
	}

	//查询所有User
	@Override
	public List<User> findAllUser() {
		
		return this.getSqlSession().selectList("cn.mybatis.domain.User.selectAllUser");
	}

	//动态sql查询所有User
	@Override
	public List<User> findUserByIdCondition(User user) {
		return this.getSqlSession().selectList("cn.mybatis.domain.User.selectUserByCondition", user);
	}

	//添加User
	@Override
	public int insertUser(User user) {
		return this.getSqlSession().insert("cn.mybatis.domain.User.insertUser", user);
	}

	//更新User
	@Override
	public int updateUser(User user) {
		int i = this.getSqlSession().update("cn.mybatis.domain.User.updateUserByCondition", user);
		return i;
	}

	@Override
	public int updateUserById(User user) {
		int i = this.getSqlSession().update("cn.mybatis.domain.User.updateUserById", user);
		return i;
	}
}

6、业务层service

一般方法都与dao层相对应

package cn.mybatis.service;

import java.util.List;

import cn.mybatis.domain.User;

public interface UserService {
	//根据id查询User
	public User findUserById(String id);
	
	//查询所有User
	public List<User> findAllUser();
	
	//动态sql查询User
	
	public List<User> findUserByIdCondition(User user);
	
	//根据id删除User
	public int deleteUserById(String id);
	
	//添加User
	public int insertUser(User user);
	
	//更新User
	public int updateUserById(User user);
	
	public int updateUser(User user);
	
}

实现

package cn.mybatis.service;


import java.util.List;

import cn.mybatis.dao.UserDao;
import cn.mybatis.domain.User;

public class UserServiceImpl implements UserService {

	private UserDao userDao;
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	@Override
	public int deleteUserById(String id) {
		int i = userDao.deleteUserById(id);
		return i;
	}

	@Override
	public List<User> findAllUser() {
		return userDao.findAllUser();
	}

	@Override
	public User findUserById(String id) {
		return userDao.findUserById(id);
	}

	@Override
	public List<User> findUserByIdCondition(User user) {
		return userDao.findUserByIdCondition(user);
	}

	@Override
	public int insertUser(User user) {
		int i = userDao.insertUser(user);
		return i;
	}

	@Override
	public int updateUser(User user) {
		int i = userDao.updateUser(user);
		return i;
	}

	@Override
	public int updateUserById(User user) {
		int i = userDao.updateUserById(user);
		return i;
	}

}


7、利用单元测试进行测试

package cn.mybatis.test;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.mybatis.dao.UserDao.impl;
import cn.itcast.mybatis.domain.User;
import cn.itcast.mybatis.service.UserService.impl;

public class MyBatisTest {

	@Test
	public void findUserByIdTest()throws Exception{
		//加载配置文件
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		
		UserDao userDao = (UserDao) ct.getBean("userDao");
		User u = userDao.findUserById("001");
		System.out.println(u);
		
	}
	
	//根据id删除User
	@Test
	public void deleteUserByIdTest()throws Exception{
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		
		UserDao userDao = (UserDao) ct.getBean("userDao");
		int i = userDao.deleteUserById("04");
		System.out.println("影响的条数: " + i);	
	}
	
	//查询所有User
	
	@Test
	public void findAllUserTest()throws Exception{
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		
		UserDao userDao = (UserDao) ct.getBean("userDao");
		//查询出所有的User返回的为list集合
		List<User> usersList = userDao.findAllUser();
		
		for(User user: usersList){
			System.out.println(user);
		}	
	}
	
	//动态sql查询所有User
	@Test
	public void selectUserByConditionTest()throws Exception{
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		UserDao userDao = (UserDao) ct.getBean("userDao");
		
		User user = new User();
		user.setId("002");
		
		List<User> userList = userDao.findUserByIdCondition(user);
		for(User u:userList){
			System.out.println(u);
		}
	}
	
	//添加User
	@Test
	public void insertUserTest()throws Exception{
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		UserDao userDao = (UserDao) ct.getBean("userDao");
		
		User user = new User();
		user.setId("007");
		user.setName("测试007");
		user.setAddress("测试地址007");
		
		int i = userDao.insertUser(user);
		
		System.out.println("影响的条数: " + i);			
	}
	//更新User
	@Test
	public void updateUserByIdTest()throws Exception{
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		
		UserDao userDao = (UserDao) ct.getBean("userDao");
		User user = new User();
		user.setId("01");
		user.setName("更新后的001");
		user.setAddress("更新后的001地址");
		
		int i = userDao.updateUserById(user);
		System.out.println("影响的条数: " + i);				
	}
	
	@Test
	public void updateUserByIdForMapTest()throws Exception{
		ApplicationContext ct = new ClassPathXmlApplicationContext("beans.xml");
		
		UserDao userDao = (UserDao) ct.getBean("userDao");
		User user = new User();
		user.setId("03");
		user.setName("更新后的000");
		user.setAddress("更新后的地址000");
		
		int i = userDao.updateUser(user);
		System.out.println("影响的条数: " + i);	
	}
	
	@Test
	public void transactionTest(){
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserService userService = (UserService) ctx.getBean("userService");
		int i = userService.deleteUserById("001");
		System.out.println("影响的条数: " + i);	

}

数据库表结构:



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值