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));
}
AOP(Aspected 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();