Spring学习笔记

IOC

DI

代理对象

AOP

数据源配置

执行预编译语句(DML)

事务操作

编程式事务

jdbc中事务

Spring中事务

Spring模板事务

Spring模板事务(配置文件)

声明式事务

IOC(Inversion of Control)控制反转:将你设计好的类交给系统区控制,而不是在你的类内部控制。

Person.java

public interface Person {

 

public void eat();

public void sleep();

}

ChinesePerson.java

public class ChinesePerson implements Person {

public void eat() {

System.out.println("ChinesePerson eat()");

}

public void sleep() {

System.out.println("ChinesePerson sleep()");

}

}

TestMain.java
ApplicationContext context = new ClassPathXmlApplicationContext(

"applicationContext.xml");

Person person = (Person) context.getBean("person", Person.class);

person.eat();

person.sleep();

<bean id="person" class="com.lfg.ioc.AmericanPerson"></bean>

DI(Dependency Injection)依赖注入:创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者。

<bean id="person_2" class="com.lfg.di.Person">

<!-- 构造注入 -->

<constructor-arg name="axe" ref="steelAxe"></constructor-arg>

<!-- 设值注入 -->

<property name="axe" ref="stoneAxe"></property>

</bean>

1. 设值注入

private Axe axe;

public Axe getAxe() {

return axe;

}

2. 构造注入

public Person(Axe axe){

this.axe = axe;

}

3. 接口注入

Interface Axe.java

实现类SteelAxe.java

public class SteelAxe implements Axe{

 

public void chop() {

System.out.println("用钢斧砍柴");

}

代理对象:

ProxyUtil.java

private Object sendObj;

 

public Object createProxyObj(Object sendObj) {

this.sendObj = sendObj;

Object proxyObj = Proxy.newProxyInstance(sendObj.getClass()

.getClassLoader(), sendObj.getClass().getInterfaces(), this);

return proxyObj;

}

 

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

System.out.println("Method = "+method);

if(args!=null){

System.out.println("args = "+args.length);

}

System.out.println("通过代售点");

return method.invoke(this.sendObj, args);

}

 

public static void main(String[] args) {

// 没有使用代理对象

// TestIFC testIFC = new TestImpl();

// testIFC.buyTicket();

// 使用静态代理

// TestIFC testIFC = new TestProxy(new TestImpl());

// testIFC.buyTicket();

//使用动态代理

ProxyUtil proxyUtil = new ProxyUtil();

TestIFC testIFC = (TestIFC)proxyUtil.createProxyObj(

new TestImpl());

//testIFC.buyTicket();

TestIFC_2 testIFC_2 =(TestIFC_2) proxyUtil.createProxyObj(

new TestImpl_2());

System.out.println(testIFC_2.test(1, 2));

}

AOPAspected Oriented Programming)面向切面编程:可以解决OOP和过程化方法不能够很好的解决的横切(crosscut)问题。

ApplicationContext.xml

数据库连接

<!-- Spring中配置数据源的方式 -->

<bean name="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" 

value="oracle.jdbc.OracleDriver" />

<property name="url" 

value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />

<property name="username" value="test" />

<property name="password" value="test" />

</bean>

<!-- Tomcat的DBCP连接池 -->需要导入:tomcat-dbcp.jar

<bean name="dbcp_dataSource" 

class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">

<property name="driverClassName" 

value="oracle.jdbc.OracleDriver" />

<property name="url"

value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />

<property name="username" value="test" />

<property name="password" value="test" />

<property name="initialSize" value="50" />

<property name="maxActive" value="30" />

<property name="maxIdle" value="20" />

<property name="minIdle" value="10" />

</bean>

<!-- C3p0连接池 -->需要导入c3p0-0.9.2.1.jar

       c3p0-oracle-thin-extras-0.9.2.1.jar

mchange-commons-java-0.2.3.4.jar

<bean name="c3p0_dataSource" 

class="com.mchange.v2.c3p0.ComboPooledDataSource">

<property name="driverClass" value="oracle.jdbc.OracleDriver" />

<property name="jdbcUrl" 

value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />

<property name="user" value="test" />

<property name="password" value="test" />

<property name="maxPoolSize" value="30" />

<property name="minPoolSize" value="20" />

<property name="initialPoolSize" value="50" />

</bean>

<!-- Proxool连接池 -->需要导入:proxool-0[1].9.0RC3.jar

<bean name="dataSource_ProXool"

 class="org.logicalcobwebs.proxool.ProxoolDataSource">

<property name="driver" value="oracle.jdbc.OracleDriver" />

<property name="driverUrl"

value="jdbc:oracle:thin:test/test@127.0.0.1:1521:orcl" />

<property name="user" value="test" />

<property name="password" value="test" />

<property name="maximumConnectionCount" value="30" />

<property name="minimumConnectionCount" value="20" />

<property name="trace" value="true" />

</bean>

 

执行预编译语句(DML)(下标从1开始)

1.静态语句

public void update_1() {

String sql = "update T_Userinfo set usersex = ?,userage=? where userid<?";

this.getJdbcTemplate().update(sql, new PreparedStatementSetter() {

public void setValues(PreparedStatement pstmt) 

throws SQLException {

pstmt.setString(1, "0");

pstmt.setInt(2, 30);

pstmt.setInt(3, 100);

}

});

}

 

public void update_2() {

final String sql = "update T_Userinfo set usersex = ?,userage=? where userid<?";

this.getJdbcTemplate().update(new PreparedStatementCreator() {

public PreparedStatement createPreparedStatement(Connection  conn)

throws SQLException {

PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "1");

pstmt.setInt(2, 30);

pstmt.setInt(3, 100);

return pstmt;

}

});

}

//数组

public void update_3() {

Object[] paramArray = { "0", 20, 90 };

final String sql = "update T_Userinfo set usersex = ?,userage=? where userid<?";

this.getJdbcTemplate().update(sql, paramArray);

}

2.动态sql语句
a)使用Map

public void update_2(boolean updateSex, boolean updateAge,

boolean updateSalary) {

/**

 * Map中的KEY的名字,和SQL语句命名参数的名称相同即可。

 */

Map<String, Object> paramMap = new HashMap<String, Object>();

StringBuffer updateSQL = new StringBuffer();

updateSQL.append("Update T_Userinfo Set");

updateSQL.append(" UserName = UserName");

if (updateSex == true) {

updateSQL.append(",UserSex = :usersex");

paramMap.put("usersex""0");

}

if (updateAge == true) {

updateSQL.append(",UserAge = :userage");

paramMap.put("userage", 50);

}

if (updateSalary == true) {

updateSQL.append(",Salary = :price");

paramMap.put("price", 6000);

}

updateSQL.append(" where 1 = 1");

updateSQL.append(" and UserId< :userid");

paramMap.put("userid""100");

System.out.println(updateSQL);

NamedParameterJdbcTemplate jdbcTemplate = 

new NamedParameterJdbcTemplate(

this.getDataSource());

jdbcTemplate.update(updateSQL.toString(), paramMap);

}

B)通过JavaBean方式

public void update_4(boolean updateSex, boolean updateAge,

boolean updateSalary) {

/**

 * SqlParameterSource是一个接口,其实现类有2个

 * 

 * MapSqlParameterSource,BeanPropertySqlParameterSource

 * 

 * SQL语句中命名参数的名称要与javaBean中属性的名称一样即可。

 */

 

UserBean userBean = new UserBean();

userBean.setUsersex("1");

userBean.setUserage(40);

userBean.setSalary(new BigDecimal(8000));

userBean.setUserid(100);

BeanPropertySqlParameterSource paramSource = 

new BeanPropertySqlParameterSource(userBean);

 

StringBuffer updateSQL = new StringBuffer();

updateSQL.append("Update T_Userinfo Set");

updateSQL.append(" UserName = UserName");

 

if (updateSex == true) {

updateSQL.append(",UserSex = :usersex");

}

 

if (updateAge == true) {

updateSQL.append(",UserAge = :userage");

}

if (updateSalary == true) {

updateSQL.append(",Salary = :salary");

}

updateSQL.append(" where 1 = 1");

updateSQL.append(" and UserId< :userid");

System.out.println(updateSQL);

NamedParameterJdbcTemplate jdbcTemplate = 

new NamedParameterJdbcTemplate(this.getDataSource());

jdbcTemplate.update(updateSQL.toString(), paramSource);

 

}

3.执行查询语句

/**

 * 返回所有记录

 */

public void queryForList() {

String sql = "Select * From T_Userinfo order by userid asc";

List<Map<String, Object>> userList = this.getJdbcTemplate()

.queryForList(sql);

for (Map<String, Object> rowMap : userList) {

String userid = String.valueOf(rowMap.get("userid"));

String username = String.valueOf(rowMap.get("username"));

System.out.println(userid + "\t" + username);

}

}

//返回单条记录

String sql = "Select * From T_Userinfo where userid = 5";

Map<String, Object> rowMap = 

this.getJdbcTemplate().queryForMap(sql);

 

String userid = String.valueOf(rowMap.get("userid"));

String username = String.valueOf(rowMap.get("username"));

//记录条数

String sql = "Select count(1) as rsCount From T_Userinfo";

int rowCount = this.getJdbcTemplate().queryForInt(sql);

//取单个字段,当条记录

String sql = "Select UserName From T_Userinfo where userid = 4";

String username = this.getJdbcTemplate().queryForObject(sql,

String.class);

//RowMapper:行的映射,把行的数据转化成自定义的类型,有2个实现类

 ColumnMapRowMapper, BeanPropertyRowMapper

String sql = "Select * From T_Userinfo order by userid asc";

List<Map<String, Object>> userList = 

this.getJdbcTemplate().query(sql,new ColumnMapRowMapper());

for (Map<String, Object> rowMap : userList) {

String userid = String.valueOf(rowMap.get("userid"));

String username = String.valueOf(rowMap.get("username"));

}

//javabean方式返回查询

public void queryForRowMapper_2() {

String sql = "Select * From T_Userinfo order by userid asc";

BeanPropertyRowMapper<UserBean> rowMapper = 

new BeanPropertyRowMapper<UserBean>(

UserBean.class);

List<UserBean> userList = this.getJdbcTemplate().query(sql, 

rowMapper);

for (UserBean userBean : userList) {

String userid = String.valueOf(userBean.getUserid());

String username = String.valueOf(userBean.getUsername());

 

System.out.println(userid + "\t" + username);

}

}

事务

1. 编程式事务

a. Jdbc中事务

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

String sql_1 = null;

String sql_2 = null;

try {

Class.forName("oracle.jdbc.OracleDriver");

String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";

String username = "test";

String password = "test";

 

conn = DriverManager.getConnection(url, username, password);

/**

 * 事务的操作

 */

conn.setAutoCommit(false);

    conn.setTransactionIsolation(

Connection.TRANSACTION_SERIALIZABLE);

 

stmt.executeUpdate(sql_1);

stmt.executeUpdate(sql_2);

 

conn.commit();

catch (Exception e) {

e.printStackTrace();

try {

conn.rollback();

catch (SQLException e1) {

e1.printStackTrace();

}

finally {

// 关闭资源

}

b. Spring中事务

public boolean insert() {

// 1:创建事务的管理器

PlatformTransactionManager manager =

 new DataSourceTransactionManager(this.getDataSource());

 

// 2:定义事务的属性

DefaultTransactionDefinition definition = 

new DefaultTransactionDefinition();

definition.setReadOnly(false);

definition.setTimeout(60);

definition.setIsolationLevel(

TransactionDefinition.ISOLATION_READ_COMMITTED);

definition.setPropagationBehavior(

TransactionDefinition.PROPAGATION_REQUIRED);

// 3:获取事务的状态

TransactionStatus status = manager.getTransaction(definition);

// 4:对数据的操作

String sql_1 = "Insert into T_classinfo (classid_2,classname)

 values(seq_user.nextval,'Spring事务')";

String sql_2 = "Update T_Userinfo set username = 'zzzz' where 

userid = 5";

try {

JdbcTemplate template = this.getJdbcTemplate();

template.update(sql_2);

template.update(sql_1);

 

// 4:对事务状态的操作

manager.commit(status);

catch (Exception e) {

e.printStackTrace();

 

manager.rollback(status);

finally {

 

}

return true;

}

c. Spring模板事务

public boolean insert() {

 

// 1:创建事务的管理器

PlatformTransactionManager manager =

new DataSourceTransactionManager(this.getDataSource());

TransactionTemplate template = new TransactionTemplate(manager);

template.setReadOnly(false);

template.setTimeout(60);

template.setIsolationLevel(

TransactionDefinition.ISOLATION_READ_COMMITTED);

template.setPropagationBehavior(

TransactionDefinition.PROPAGATION_SUPPORTS);

 

boolean flag = template.execute(

new TransactionCallback<Boolean>() {

public Boolean doInTransaction(TransactionStatus status) {

String sql_1 = "Insert into T_classinfo (classid,classname) values(seq_user.nextval,'Spring事务')";

String sql_2 = "Update T_Userinfo set username_2 = 'zzzz' where userid = 5";

 

JdbcTemplate jdbcTemplate = Spring_Tx_Template.this

.getJdbcTemplate();

int i = jdbcTemplate.update(sql_1);

int j = jdbcTemplate.update(sql_2);

if (i > 0 && j > 0) {

return true;

else {

return false;

}

}

});

System.out.println("Flag = " + flag);

return flag;

}

d. Spring模板事务(配置文件)

 

<bean name="transactionManager" class="

   org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

<bean name="transactionTemplate"class="

org.springframework.transaction.support.TransactionTemplate">

<property name="transactionManager" ref="transactionManager"/>

<property name="readOnly" value="false"/>

<property name="timeout" value="60"/>

<property name="isolationLevel" value="2"/>

</bean>

 

<bean name="tx_Template_2" class="com.tx.Spring_Tx_Template_2">

<property name="dataSource" ref="dataSource"/>

<property name="template" ref="transactionTemplate"/>

</bean>

private TransactionTemplate template = null;

public TransactionTemplate getTemplate() {

return template;

}

public void setTemplate(TransactionTemplate template) {

this.template = template;

}

public boolean insert() {

boolean flag = template.execute(

new TransactionCallback<Boolean>() {

public Boolean doInTransaction(TransactionStatus status) {

String sql_1 = "Insert into T_classinfo (classid,classname) values(seq_user.nextval,'Spring事务')";

String sql_2 = "Update T_Userinfo set username_2 = 'ttt' where userid = 5";

 

JdbcTemplate jdbcTemplate = Spring_Tx_Template_2.this

.getJdbcTemplate();

int i = jdbcTemplate.update(sql_1);

int j = jdbcTemplate.update(sql_2);

if (i > 0 && j > 0) {

return true;

else {

return false;

}

}

});

System.out.println("Flag = " + flag);

return flag;

}

 

2. 声明式事务

a. 通过定义接口实现(代理)

<!-- 声明式事务的配置 -->

 

<bean name="declare_tx_1" class="com.tx.declare.Declare_Tx_1">

<property name="dataSource" ref="dataSource"></property>

</bean>

 

<bean name="declare_tx_1_proxy"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<!-- 事物管理器 -->

<property name="transactionManager" 

ref="transactionManager"></property>

<!-- 代理的对象 -->

<property name="target" ref="declare_tx_1"></property>

<!-- 事务属性的设置 -->

<property name="transactionAttributes">

<props>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="update*">PROPAGATION_SUPPORTS</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="select*">readOnly</prop>

<!--  

<prop key="*">PROPAGATION_REQUIRED</prop>

-->

</props>

</property>

</bean>

public boolean insert() {

String sql_1 = "Insert into T_classinfo (classid,classname) values(seq_user.nextval,'Spring声明式务')";

String sql_2 = "Update T_Userinfo set username = 'BBB' 

where userid = 5";

 

JdbcTemplate jdbcTemplate = this.getJdbcTemplate();

int i = jdbcTemplate.update(sql_1);

int j = jdbcTemplate.update(sql_2);

if (i > 0 && j > 0) {

return true;

else {

return false;

}

}

Declare_Tx_IFC declare_tx_1 = context.getBean("declare_tx_1_proxy",

Declare_Tx_IFC.class);

declare_tx_1.insert();

b. 通过实现类接口实现(代理)

<bean name="declare_tx_2" class="com.tx.declare.Declare_Tx_2">

<property name="dataSource" ref="dataSource"></property>

</bean>

 

<bean name="declare_tx_2_proxy" 

class="org.springframework.transaction.interceptor.

TransactionProxyFactoryBean">

<!-- 事物管理器 -->

<property name="transactionManager" 

ref="transactionManager"></property>

<!-- 代理的对象 -->

<property name="target" ref="declare_tx_2"></property>

<property name="proxyTargetClass" value="true"></property>

 

<!-- 事务属性的设置 -->

<property name="transactionAttributes">

<props>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="update*">PROPAGATION_SUPPORTS</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="select*">readOnly</prop>

<!--  

<prop key="*">PROPAGATION_REQUIRED</prop>

-->

</props>

</property>

</bean>

public boolean insert() {

String sql_1 = "Insert into T_classinfo (classid,classname) values(seq_user.nextval,'Spring声明式务')";

String sql_2 = "Update T_Userinfo set username = 'CCC' 

where userid = 5";

 

JdbcTemplate jdbcTemplate = this.getJdbcTemplate();

int i = jdbcTemplate.update(sql_1);

int j = jdbcTemplate.update(sql_2);

if (i > 0 && j > 0) {

return true;

else {

return false;

}

Declare_Tx_2 declare_Tx_2 = context.getBean("declare_tx_2_proxy",

Declare_Tx_2.class);

declare_Tx_2.insert();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值