通常之前写的事物提交是在ServiceImpl中写完增删改后 出现方法名.commit().但是在以后的工作中可能会用其他的方式来写事物的提交。
实体类
package com.bean;
import lombok.Data;
@Data
public class User {
private int id;
private String username;
private String password;
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public User() {
}
}
持久层(Dao) 此处我是用的注解的方式来实现增删改查的方法。
之前实现数据库的修改方法是用的 XML文件(具体见5-31Mybatis项目)
package com.dao;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.bean.User;
public interface UserDao {
//增加
@Insert("INSERT INTO users VALUES(DEFAULT,#{username},#{password})")
public void insert(User user);
//删
@Delete("DELETE FROM users WHERE id=#{id}")
public void delete(int id);
//改
@Update("UPDATE users SET username = #{username} , PASSWORD = #{password} WHERE id = #{id}")
public void updateInfo(User user);
//查
@Select("select * from users")
public List<User> selectAll();
}
service包 也可以叫切面类,以前学过面向切面。此处的方法全为切点方法。
package com.service;
import java.util.List;
import com.bean.User;
import com.dao.UserDao;
/**
* 切面类
* @author Lenovo
*
*/
public class UserService {
//拿到数据访问层对象
private UserDao ud;
public UserDao getUd() {
return ud;
}
public void setUd(UserDao ud) {
this.ud = ud;
}
//查看 (切点方法)
public List<User> findAll() {
List<User> list = ud.selectAll();
return list;
}
//增加 (切点方法)
public void insertInfo(User user) {
ud.insert(user);
}
//删 (切点方法)
public void deletInfo(int id) {
ud.delete(id);
}
//改 (切点方法)
public void modifyInfo(User user) {
ud.updateInfo(user);
}
}
视图层
package com.test;
import java.util.List;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bean.User;
import com.service.UserService;
public class demo {
/*public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("springtx.xml");
String[] bean = ac.getBeanDefinitionNames();
for (String string : bean) {
System.out.println(string);
}
}*/
//连接数据库
public UserService getCon() {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("springtx.xml");
UserService us = ac.getBean("service",UserService.class );
return us;
}
//查
@Test
public void selectAll() {
UserService con = this.getCon();
List<User> list = con.findAll();
for (User user : list) {
System.out.println(user);
}
}
//增加
@Test
public void insertUser() {
UserService con = this.getCon();
User user= new User();
user.setUsername("疾速追杀");
user.setPassword("1234");
con.insertInfo(user);
this.selectAll();
}
//删除
@Test
public void deleteUser() {
UserService con = this.getCon();
con.deletInfo(2);
this.selectAll();
}
//修改
@Test
public void modify() {
UserService con = this.getCon();
User user= new User();
user.setId(3);
user.setUsername("叶问");
user.setPassword("1999");
con.modifyInfo(user);
this.selectAll();
}
}
其中ac.getBean("service",UserService.class ); 中的service是来源于xml文件
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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1.创建对象,用于连接数据库 name是属性名字 id可以随意起名-->
<bean id="dataSourceWXB" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3308/school"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
<!-- 2.创建一个类似于session的对象,用于调用增删改查方法 -->
<bean id="session" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceWXB"></property>
</bean>
<!-- 3.创建一个mapper对象,用于关联sql语句在那个包就关联 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao"/>
<property name="sqlSessionFactory" ref="session"/>
</bean>
<!-- 4.创建业务逻辑层类UsersService,并且通过Spring自定义的对象,给ud属性赋值 -->
<bean id="service" class="com.service.UserService">
<property name="ud" ref="userDao"></property>
</bean>
<!-- 5.创建事务对象,用于管理增删改 -->
<bean id="txID" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceWXB"/>
</bean>
<!-- 6.配置事务信息(将“事务”与“切面通知”关联起来) -->
<tx:advice id="txAdvice" transaction-manager="txID">
<tx:attributes>
<tx:method name="findAll"/>
<tx:method name="insertInfo"/>
<tx:method name="deletInfo"/>
<tx:method name="modifyInfo"/>
</tx:attributes>
</tx:advice>
<!-- 7.配置面向切面相关信息 -->
<aop:config>
<aop:pointcut expression="execution(* com.service.UserService.*(..))" id="point"/>
<!-- 后置通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>
</aop:config>
</beans>
此处xml文件整体流程是:
1.连接数据库 其中name:属性名称是固定好的 id 可以随便起名。
2.添加session 用于数据库操作
3.创建mapper用于关联sql语句 第一个语句是用来连接存放具体sql语句的包 第二个是用来关联session
4.创建业务逻辑userService 在UserDao里面查找属性
5.创建事物对象 将事务的属性关联到数据库中
6.配置事务信息 method name必须和service名字一样
7.后置通知