<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义Bean -->
<bean id="myBean" class="com.example.MyBean">
<!-- 设置属性值 -->
<property name="message" value="Hello, World!"/>
</bean>
<!-- 引入其他配置文件 -->
<import resource="another-config.xml"/>
</beans>
构造函数注入(Constructor Injection): 通过构造函数注入依赖对象。在类的构造函数中声明依赖的参数,并在创建类实例时传入依赖对象。
Setter方法注入(Setter Injection): 通过Setter方法注入依赖对象。在类中定义Setter方法,通过调用Setter方法来设置依赖对象。
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
字段注入(Field Injection): 通过字段注入依赖对象。在类的字段上使用@Autowired
或@Resource
注解来标记依赖对象,Spring会自动将相应的Bean注入到字段中。
public class UserService {
@Autowired
private UserRepository userRepository;
// ...
}
@Component
:
@Component
是一个通用的注解,用于标识一个类为Spring容器的组件(Component)。@Component
注解,我们可以将一个类自动注册为Spring容器中的Bean,并由Spring负责管理该Bean的生命周期。@Component
注解可以用于任何类,包括自定义类、第三方库类等。@Bean
:
@Bean
是一个在配置类中使用的注解,用于显式地声明一个方法返回一个Bean对象。@Bean
注解,我们可以定制化地创建和配置一个Bean对象,然后将其纳入Spring容器的管理。@Bean
注解通常与@Configuration
注解一起使用,用于标识一个类为配置类,其中定义了一个或多个@Bean
方法。@Bean
注解的方法可以设置参数、返回值和Bean的作用域等属性。编程式事务管理(Programmatic Transaction Management): 在代码中显式地使用事务管理API来控制事务的开始、提交或回滚。通过TransactionTemplate
或PlatformTransactionManager
等接口来编写事务管理代码。
public class UserService {
private PlatformTransactionManager transactionManager;
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void performBusinessLogic() {
DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
TransactionStatus txStatus = transactionManager.getTransaction(txDefinition);
try {
// 执行业务逻辑
// ...
transactionManager.commit(txStatus);
} catch (Exception e) {
transactionManager.rollback(txStatus);
throw e;
}
}
}
声明式事务管理(Declarative Transaction Management): 基于AOP(Aspect-Oriented Programming)的方式,通过在配置文件或注解中声明事务的属性来实现事务管理。可以通过XML配置文件中的
元素,或通过在方法上使用@Transactional
注解来声明事务属性。
<bean id="userService" class="com.example.UserService">
<property name="userRepository" ref="userRepository" />
</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="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="userServicePointcut" expression="execution(* com.example.UserService.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointcut" />
</aop:config>
注解驱动事务管理(Annotation-Driven Transaction Management): 是声明式事务管理的一种形式,通过在配置文件中启用注解驱动的事务管理,使用@EnableTransactionManagement
注解或
配置元素来启用。然后在需要事务管理的方法上使用@Transactional
注解来声明事务属性。
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
public void performBusinessLogic() {
// 执行业务逻辑
// ...
}
}
注入式事务管理(Injection Transaction Management): 通过将事务管理器注入到需要事务管理的Bean中,在Bean中直接调用事务管理器的方法来控制事务的开始、提交或回滚。
@Service
public class UserService {
private PlatformTransactionManager transactionManager;
@Autowired
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void performBusinessLogic() {
TransactionStatus txStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// 执行业务逻辑
// ...
transactionManager.commit(txStatus);
} catch (Exception e) {
transactionManager.rollback(txStatus);
throw e;
}
}
}
1、读未提交
Read uncommitted:最低级别,以上情况均无法保证。
2、读已提交
Read committed:可避免脏读情况发生。
4、可重复读
Repeatable read:可避免脏读、不可重复读情况的发生。不可以避免虚读。
8、串行化读 Serializable:事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重
在Spring MVC中,可以使用Model对象从后台向前台传递数据。Model对象是一个接口,可以通过方法参数进行注入或在方法返回值中使用。常见的实现类是ModelMap
、ModelAndView
和Model
。
ModelMap
是Spring MVC提供的一个实现了Model接口的类。addAttribute()
方法添加属性和值。ModelAndView
是一个包含模型数据和视图信息的类。addObject()
方法添加属性和值。Model
是一个接口,是ModelMap
的父接口。@Controller
:
@RequestMapping
:
@GetMapping
:
@RequestMapping
,用于处理GET请求。@PostMapping
:
@RequestMapping
,用于处理POST请求。@PutMapping
:
@RequestMapping
,用于处理PUT请求。@DeleteMapping
:
@RequestMapping
,用于处理DELETE请求。@RequestParam
:
@PathVariable
:
@RequestBody
:
@ResponseBody
:
@ModelAttribute
:
@Valid
:
javax.validation
包中的注解一起使用。@ExceptionHandler
:
@SessionAttributes
:
@Controller
:
@RequestMapping
:
@GetMapping
:
@RequestMapping
,用于处理GET请求。@PostMapping
:
@RequestMapping
,用于处理POST请求。@PutMapping
:
@RequestMapping
,用于处理PUT请求。@DeleteMapping
:
@RequestMapping
,用于处理DELETE请求。@RequestParam
:
@PathVariable
:
@RequestBody
:
@ResponseBody
:
@ModelAttribute
:
@Valid
:
javax.validation
包中的注解一起使用。@ExceptionHandler
:
@SessionAttributes
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woUyDMf1-1687195324078)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
#符号:
#
符号用于预编译的语句,也称为安全的占位符。
当使用#
符号时,MyBatis会将参数值转义并将其作为预编译的参数传递给数据库,可以有效防止SQL注入攻击。
#
符号可以用于任何参数类型,包括基本类型、包装类型和自定义类型。
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
//在上面的示例中,#{id}是一个预编译的占位符,MyBatis会将传入的id参数值安全地转义并插入到SQL语句中。
$符号:
$
符号用于拼接字符串,也称为非安全的占位符。
当使用$
符号时,MyBatis会直接将参数值插入到SQL语句中,不会进行预编译或转义处理。
$
符号主要用于动态拼接SQL语句的部分,如表名、列名等,而不适合用于传递参数值。
<select id="getUserByName" resultType="User">
SELECT * FROM users WHERE username = '${username}'
</select>
//在上面的示例中,${username}是一个非安全的占位符,传入的username参数值会直接插入到SQL语句中,可能存在SQL注入的风险。
LIMIT
关键字、Oracle的ROWNUM
等。
:用于定义查询语句。
:用于定义插入语句。
:用于定义更新语句。
:用于定义删除语句。
:用于定义结果映射关系,将查询结果映射到Java对象。
:用于定义单个属性的映射关系。
:用于条件判断,根据条件动态拼接SQL语句。
:用于生成动态的WHERE子句。
:用于遍历集合或数组,并将元素应用于SQL语句中。
、
、
:用于实现类似于Java中的switch-case语句的逻辑。
:用于包含其他SQL片段,可以重复使用已定义的SQL片段。
:用于修剪SQL语句,删除开头或结尾的多余空格。
:用于生成动态的SET子句。
:用于将一个参数绑定到一个变量上。
:用于定义可重用的SQL片段。
:用于将多个SQL语句分组,并将它们作为一个单元进行操作。
:条件判断标签,根据条件动态拼接SQL语句。
<select id="getUserList" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
if>
<if test="age != null">
AND age = #{age}
if>
where>
select>
、
、
:类似于Java中的switch-case语句的逻辑。
<select id="getUserList" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="name != null">
AND name = #{name}
when>
<when test="age != null">
AND age = #{age}
when>
<otherwise>
AND status = 1
otherwise>
choose>
where>
select>
:修剪SQL语句,删除开头或结尾的多余空格。
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<trim suffixOverrides=",">
<if test="name != null">
name = #{name},
if>
<if test="age != null">
age = #{age},
if>
trim>
set>
WHERE id = #{id}
update>
:生成动态的WHERE子句,自动添加WHERE关键字。
<select id="getUserList" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
if>
<if test="age != null">
AND age = #{age}
if>
where>
select>
:生成动态的SET子句,用于更新语句中的动态赋值。
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="name != null">
name = #{name},
if>
<if test="age != null">
age = #{age},
if>
set>
WHERE id = #{id}
update>
:用于遍历集合或数组,并将元素应用于SQL语句中。
<select id="getUserList" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
foreach>
select>
:将一个参数绑定到一个变量上,可以在后续的标签中使用该变量。
<select id="getUserList" resultType="User">
<bind name="searchName" value="'%' + name + '%'"/>
SELECT * FROM users
WHERE name LIKE #{searchName}
select>
:定义可重用的SQL片段,可以在其他语句中使用。
<sql id="commonColumns">
id, name, age
sql>
<select id="getUserList" resultType="User">
SELECT <include refid="commonColumns"/> FROM users
select>
:包含其他SQL片段,可以重复使用已定义的SQL片段。
<sql id="commonConditions">
WHERE status = 1
sql>
<select id="getUserList" resultType="User">
SELECT * FROM users
<include refid="commonConditions"/>
select>
在MyBatis中,每个XML映射文件对应一个命名空间(namespace),并且每个SQL语句都需要使用一个唯一的ID来标识。因此,同一个XML映射文件中的ID必须是唯一的,不允许重复。
如果在同一个XML映射文件中出现了相同的ID,会导致MyBatis解析时发生冲突,无法确定具体使用哪个SQL语句,从而抛出异常。
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
insert>
mapper>
L语句都需要使用一个唯一的ID来标识。因此,同一个XML映射文件中的ID必须是唯一的,不允许重复。
如果在同一个XML映射文件中出现了相同的ID,会导致MyBatis解析时发生冲突,无法确定具体使用哪个SQL语句,从而抛出异常。
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
insert>
mapper>