前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring代码片段

Spring代码片段

作者头像
小锋学长生活大爆炸
发布于 2020-11-24 03:57:27
发布于 2020-11-24 03:57:27
67800
代码可运行
举报
运行总次数:0
代码可运行

文章目录

自定义的bean用注解,非自定义的bean用xml配置文件

set方法使用xml让spring创建bean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"

<context:property-placeholder location="jdbc.properties"/>
<!--数据源对象-->
<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.user}"/>
    <property name="password" value="${jdbc.pwd}"/>
</bean>
<!--jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

// 把容器中的ref=jdbcTemplate通过class=AccountDaoImpl内部的一个name=setJdbcTemplate方法注入给AccountDaoImpl
// 目标bean是class=com.sxf.Dao.Impl.AccountDaoImpl
// 注入方法是name=jdbcTemplate中的setJdbcTemplate
// 注入内容是ref=jdbcTemplate,对应上面的id=jdbcTemplate这个bean
<bean id="accountDao" class="com.sxf.Dao.Impl.AccountDaoImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AccountDaoImpl implements AccountDao {
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}

public class AccountServiceImpl implements AccountService {
    private AccountDao accountDao;
    public void setAccountDao(AccountDao accountDao){
        this.accountDao = accountDao;
    }
}

// 从spring容器获取bean
public static void main(String[] args) {
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    AccountService accountService = app.getBean(AccountService.class);
    accountService.transfer();
}
  • xmlbean中,id是唯一标识符,可以任意设置;class是要自动创建的类的路径;property是增加属性设置;nameset方法后面的内容(如setJdbcTemplate中的jdbcTemplate);ref是当前xml中已有的beanid名(对象的引用用ref)。
  • AccountDaoImpl 中,把容器中的ref=jdbcTemplate通过class=AccountDaoImpl内部的一个name=setJdbcTemplate方法注入给AccountDaoImpl

JdbcTemplate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
	<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.22</version>
    </dependency>
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>
    <dependency>
        <!-- 事务 -->
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>
</dependencies>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("1061700625");

JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 设置数据源对象
jdbcTemplate.setDataSource(dataSource);
jdbcTemplate.update("insert into account values(?,?)", "tom", 5000);
spring产生JdbcTemplate对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.user=root
jdbc.pwd=1061700625
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<context:property-placeholder location="jdbc.properties"/>

<!--数据源对象-->
<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.user}"/>
    <property name="password" value="${jdbc.pwd}"/>
</bean>

<!--jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate= app.getBean(JdbcTemplate.class);
int row = jdbcTemplate.update("insert into account values(?,?)", "ros", 5000);
System.out.println(row);
或
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTempTest {
	@Test
    public void test2() {
        int row = jdbcTemplate.update("insert into account values(?,?)", "bob", 5000);
        System.out.println(row);
    }
}
// 查询所有
List<Account> query = jdbcTemplate.query("select * from account;", new BeanPropertyRowMapper<Account>(Account.class));
System.out.println(query);
// 查询单个
Account query2 = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), "tom");
System.out.println(query2);
//聚合查询
Long aLong = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
System.out.println(aLong);
基于XML的事务控制

切点:被增强的方法(业务方法) 通知:事务控制 切面:配置织入

配置要点:

  • 平台事务管理器配置
  • 事务通知配置
  • 事务aop织入配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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

<context:property-placeholder location="jdbc.properties"/>

<!--数据源对象-->
<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.user}"/>
    <property name="password" value="${jdbc.pwd}"/>
</bean>

<!--jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="accountDao" class="com.sxf.Dao.Impl.AccountDaoImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

<!--业务层,目标对象,内部的方法就是切点-->
<bean id="accountService" class="com.sxf.Service.Impl.AccountServiceImpl">
    <property name="accountDao" ref="accountDao"/>
</bean>

<!--指定平台事务管理器,jdbc和mybatis使用DataSourceTransactionManager-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--内部控制事务时,需要通过DataSource.getConnection-->
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--通知,事务的增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--设置事务的属性信息-->
    <tx:attributes>
        <!-- 哪些方法被增强-->
        <tx:method name="transfer" read-only="false"/>
        <tx:method name="update*" timeout="20"/>
        <!-- 所有方法-->
        <tx:method name="*" timeout="10"/>
    </tx:attributes>
</tx:advice>

<!--配置事务的AOP织入-->
<aop:config>
<!--spring为事务增强的提供配置,一个通知的切面;普通用aop:aspect-->
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.sxf.Service.Impl.*.*(..))"></aop:advisor>
</aop:config>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void out(String name, Double out) {
   jdbcTemplate.update("update account set money=money-? where name=?", out, name);
}

@Override
public void in(String name, Double in) {
    jdbcTemplate.update("update account set money=money+? where name=?", in, name);
}

public void transfer() {
	accountDao.out("tom", 100.0);
	int a = 1/0;   // 故意抛出异常
	accountDao.in("ros", 100.0);
}
基于注解的事务控制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<context:property-placeholder location="jdbc.properties"/>
<!--组件扫描,扫com.sxf这个包-->
<context:component-scan base-package="com.sxf"/>

<!--数据源对象-->
<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.user}"/>
    <property name="password" value="${jdbc.pwd}"/>
</bean>

<!--jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>
    
<!--指定平台事务管理器,jdbc和mybatis使用DataSourceTransactionManager-->
<beanid="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--内部控制事务时,需要通过DataSource.getConnection-->
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service("accountService")
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;
    
    @Override
    @Transactional
    public void transfer() {
        accountDao.out("tom", 100.0);
        int a = 1/0;   // 故意抛出异常
        accountDao.in("ros", 100.0);
    }
}

spring获取ApplicationContext

pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>

web.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--设置全局变量-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置spring内置的监听器-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

applicationContext.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userDao" class="com.sxf.dao.impl.UserDaoImpl"> </bean>
<bean id="userService" class="com.sxf.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>

UserServlet.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@WebServlet("/")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        ServletContext servletContext = req.getServletContext();
        WebApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        UserServiceImpl userService = app.getBean(UserServiceImpl.class);
        userService.save();
    }
}

spring mvc简单配置

导入springmvc相关坐标 pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.2.7.RELEASE</version>
</dependency>

配置springmvc核心控制器DispatcherServlet web.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--配置springmvc前端控制器-->
<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

spring-mvc.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--controller的组件扫描-->
<context:component-scan base-package="com.sxf.controller"/>

创建controller类,使用注解配置controller类中业务方法的映射地址 UserController.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
public class UserController {
    @RequestMapping("/save")
    public String save() {
        System.out.println("save");
        return "ok.jsp";
    }
}

创建视图页面 webapp/ok.jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
	ok save
</body>
</html>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
LeetCode 1933. 判断字符串是否可分解为值均等的子串
举例,"1111" 和 "33" 就是等值字符串。 相比之下,"123"就不是等值字符串。
Michael阿明
2021/09/06
5430
LeetCode 1871. 跳跃游戏 VII(贪心)
给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。 一开始,你在下标 0 处,且该位置的值一定为 '0' 。 当同时满足如下条件时,你可以从下标 i 移动到下标 j 处:
Michael阿明
2021/09/06
1880
LeetCode 1784. 检查二进制字符串字段
如果 s 最多包含 一个由连续的 '1' 组成的字段 ,返回 true​​​ 。否则,返回 false 。
Michael阿明
2021/09/06
3910
LeetCode 6097. 替换字符后匹配(字典)
给你两个字符串 s 和 sub 。同时给你一个二维字符数组 mappings ,其中 mappings[i] = [oldi, newi] 表示你可以替换 sub 中任意数目的 oldi 字符,替换成 newi 。sub 中每个字符 不能 被替换超过一次。
Michael阿明
2022/06/13
7390
LeetCode 6078. 重排字符形成目标字符串
给你两个下标从 0 开始的字符串 s 和 target 。你可以从 s 取出一些字符并将其重排,得到若干新的字符串。
Michael阿明
2022/05/30
2500
LeetCode 2116. 判断一个括号字符串是否有效(栈)
一个括号字符串是只由 '(' 和 ')' 组成的 非空 字符串。 如果一个字符串满足下面 任意 一个条件,那么它就是有效的:
Michael阿明
2022/01/07
3600
LeetCode 2116. 判断一个括号字符串是否有效(栈)
LeetCode 6095. 强密码检验器 II
给你一个字符串 password ,如果它是一个 强 密码,返回 true,否则返回 false 。
Michael阿明
2022/06/13
2940
LeetCode 2085. 统计出现过一次的公共字符串(哈希)
给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。
Michael阿明
2022/01/07
2610
LeetCode 2222. 选择建筑的方案数
作为市政厅的官员,你需要随机 选择 3 栋建筑。 然而,为了确保多样性,选出来的 3 栋建筑 相邻 的两栋不能是同一类型。
Michael阿明
2022/11/27
2350
LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等
给你长度相等的两个字符串 s1 和 s2 。 一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
Michael阿明
2021/09/06
8120
LeetCode 6083. 判断一个数的数字计数是否等于数位的值
如果对于 每个 0 <= i < n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true ,否则返回 false 。
Michael阿明
2022/05/30
5240
LeetCode 1869. 哪种连续子字符串更长
给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
Michael阿明
2021/09/06
2070
LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)
给你一个下标从 0 开始的字符串 street 。street 中每个字符要么是表示房屋的 ‘H’ ,要么是表示空位的 ‘.’ 。
Michael阿明
2022/01/07
2190
LeetCode 1957. 删除字符使字符串变好
我的CSDN博客地址 https://michael.blog.csdn.net/
Michael阿明
2021/09/06
6450
LeetCode 1897. 重新分配字符使所有字符串都相等
在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。
Michael阿明
2021/09/06
3410
LeetCode 1554. 只有一个不同字符的字符串(枚举)
当存在两个字符串在相同索引处只有一个字符不同时,返回 True ,否则返回 False 。
Michael阿明
2021/09/06
3640
LeetCode 1910. 删除一个字符串中所有出现的给定子字符串
给你两个字符串 s 和 part ,请你对 s 反复执行以下操作直到 所有 子字符串 part 都被删除:
Michael阿明
2021/09/06
6900
LeetCode 1844. 将所有数字用字符替换
给你一个下标从 0 开始的字符串 s ,它的 偶数 下标处为小写英文字母,奇数 下标处为数字。
Michael阿明
2021/09/06
8760
LeetCode 664. 奇怪的打印机(区间DP)
我的CSDN博客地址 https://michael.blog.csdn.net/
Michael阿明
2021/09/06
2530
LeetCode 5242. 兼具大小写的最好英文字母
给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。 返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。
Michael阿明
2022/06/20
2070
推荐阅读
相关推荐
LeetCode 1933. 判断字符串是否可分解为值均等的子串
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档