Spring学习(六)

Jdbc模板测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.xiaoguan.bean;

import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;

public class MyDataSource implements DataSource {
private String driver;
private String url;
private String username;
private String password;

public void setDriver(String driver) {
this.driver = driver;
}

public void setUrl(String url) {
this.url = url;
}

public void setUsername(String username) {
this.username = username;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public Connection getConnection() throws SQLException {
try {
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}

@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}

@Override
public void setLogWriter(PrintWriter out) throws SQLException {

}

@Override
public void setLoginTimeout(int seconds) throws SQLException {

}

@Override
public int getLoginTimeout() throws SQLException {
return 0;
}

@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}

@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}

@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.xiaoguan.bean;

import java.util.Objects;

public class User {
private Integer id;
private String realName;
private Integer age;

@Override
public String toString() {
return "User{" +
"id=" + id +
", realName='" + realName + '\'' +
", age=" + age +
'}';
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(getId(), user.getId()) && Objects.equals(getRealName(), user.getRealName()) && Objects.equals(getAge(), user.getAge());
}

@Override
public int hashCode() {
return Objects.hash(getId(), getRealName(), getAge());
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getRealName() {
return realName;
}

public void setRealName(String realName) {
this.realName = realName;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public User(Integer id, String realName, Integer age) {
this.id = id;
this.realName = realName;
this.age = age;
}

public User() {
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<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 id="ds" class="com.xiaoguan.bean.MyDataSource">&lt;!&ndash;配置自己的连接池&ndash;&gt;-->
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/spring6"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="68963120g"/>-->
<!-- </bean>-->
<bean id="ds" class="com.alibaba.druid.pool.DruidDataSource"><!--配置自己的连接池-->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring6"/>
<property name="username" value="root"/>
<property name="password" value="68963120g"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="ds"/>
</bean>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.xiaoguan.test;

import com.xiaoguan.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JDBCTemplateTest {
@Test
public void testCallback(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="select id,real_name,age from t_user where id=?";
User u = jdbcTemplate.execute(sql, new PreparedStatementCallback<User>() {
@Override
public User doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
User user = new User();
ps.setInt(1, 2);
ResultSet resultSet = ps.executeQuery();
if (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("real_name");
int age = resultSet.getInt("age");
user.setId(id);
user.setAge(age);
user.setRealName(name);
}
return user;
}
});
System.out.println(u);

}
@Test
public void testBatchDelete(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="delete from t_user where id=?";
Object[] objects1={5};
Object[] objects2={6};
Object[] objects3={7};
List<Object[]> list=new ArrayList<>();
list.add(objects1);
list.add(objects2);
list.add(objects3);
int[] ints = jdbcTemplate.batchUpdate(sql, list);
System.out.println(Arrays.toString(ints));

}
@Test
public void testBatchUpdaate(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="update t_user set real_name=?,age=? where id=?";
Object[] objects1={"小明1",18,4};
Object[] objects2={"小明2",19,5};
Object[] objects3={"小明3",20,6};
List<Object[]> list=new ArrayList<>();
list.add(objects1);
list.add(objects2);
list.add(objects3);
int[] ints = jdbcTemplate.batchUpdate(sql,list);
System.out.println(Arrays.toString(ints));
}
@Test
public void testBatchInsert(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="insert into t_user (real_name,age) values(?,?)";
Object[] objects1={"小花1",31};
Object[] objects2={"小花2",32};
Object[] objects3={"小花3",33};
Object[] objects4={"小花4",34};
List<Object[]> list=new ArrayList<>();
list.add(objects1);
list.add(objects2);
list.add(objects3);
list.add(objects4);
int[] count = jdbcTemplate.batchUpdate(sql, list);
System.out.println(Arrays.toString(count));
}
@Test
public void testQueryOneValue(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="select count(1) from t_user";
Integer total = jdbcTemplate.queryForObject(sql, int.class);
System.out.println(total);

}
@Test
public void testSelectAll(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="select id,real_name,age from t_user ";
List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
System.out.println(users);
}
@Test
public void testSelectOne(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="select id,real_name,age from t_user where id=?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class),2);
System.out.println(user);
}
@Test
public void testDelete(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="delete from t_user where id=?";
int count = jdbcTemplate.update(sql, 1);
System.out.println(count);
}
@Test
public void testUpdate(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="update t_user set real_name=?,age=? where id =?";
int count = jdbcTemplate.update(sql, "小关", 22, 1);
System.out.println(count);
}
@Test
public void testInsert(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
String sql="insert into t_user (real_name,age) values(?,?)";
int count = jdbcTemplate.update(sql, "王五", 32);
System.out.println(count);
}
@Test
public void testDataSource(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
System.out.println(jdbcTemplate);
}
}

代理模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.xiaoguan.proxy.client;

import com.xiaoguan.proxy.service.OrderService;
import com.xiaoguan.proxy.service.OrderServiceImpl;
import com.xiaoguan.proxy.service.OrderServiceImplSub;
import com.xiaoguan.proxy.service.OrderServiceProxy;

public class Test {
public static void main(String[] args) {
// OrderService orderService=new OrderServiceImpl();
// orderService.generate();
// orderService.detail();
// orderService.modify();

// OrderService orderService=new OrderServiceImplSub();
// orderService.generate();
// orderService.detail();
// orderService.modify();
OrderService target=new OrderServiceImpl();
OrderService proxy=new OrderServiceProxy(target);
proxy.generate();
proxy.modify();
proxy.detail();

}
}

1
2
3
4
5
6
7
8
9
package com.xiaoguan.proxy.service;

public interface OrderService {
void generate();
void modify();
void detail();

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.xiaoguan.proxy.service;

public class OrderServiceImpl implements OrderService{
@Override
public void generate() {
try {
Thread.sleep(1234);
System.out.println("订单已经生成");
} catch (InterruptedException e) {
e.printStackTrace();
}

}

@Override
public void modify() {
try {
Thread.sleep(456);
System.out.println("订单已经修改");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public void detail() {
try {
Thread.sleep(456);
System.out.println("请看订单详情");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.xiaoguan.proxy.service;

public class OrderServiceImplSub extends OrderServiceImpl{
@Override
public void generate() {
long begin =System.currentTimeMillis();
super.generate();
long end=System.currentTimeMillis();
System.out.println("耗时为毫秒:" + (end - begin));
}

@Override
public void modify() {
long begin =System.currentTimeMillis();
super.modify();
long end=System.currentTimeMillis();
System.out.println("耗时为毫秒:" + (end - begin));
}

@Override
public void detail() {
long begin =System.currentTimeMillis();
super.detail();
long end=System.currentTimeMillis();
System.out.println("耗时为毫秒:" + (end - begin));
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.xiaoguan.proxy.service;

public class OrderServiceProxy implements OrderService {
//代理对象
private OrderService target;

public OrderServiceProxy(OrderService target) {
this.target = target;
}

@Override
public void generate() {
long begin =System.currentTimeMillis();
target.generate();
long end=System.currentTimeMillis();
System.out.println("时间为:" + (end - begin));
}

@Override
public void modify() {
long begin =System.currentTimeMillis();
target.modify();
long end=System.currentTimeMillis();
System.out.println("时间为:" + (end- begin));
}

@Override
public void detail() {
long begin =System.currentTimeMillis();
target.detail();
long end=System.currentTimeMillis();
System.out.println("时间为:" + (end - begin));
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.xiaoguan.client;

import com.xiaoguan.proxy.OrderService;
import com.xiaoguan.proxy.OrderServiceImpl;
import com.xiaoguan.proxy.TimeInvocationHander;

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
OrderService target=new OrderServiceImpl();
Object proxyObj = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new TimeInvocationHander(target));
OrderService obj = (OrderService) proxyObj;
obj.generate();
obj.modify();
obj.detail();
String name = obj.getName();
System.out.println(name);

}
}

1
2
3
4
5
6
7
8
9
10
package com.xiaoguan.proxy;

public interface OrderService {
void generate();
void modify();
void detail();
String getName();

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.xiaoguan.proxy;

public class OrderServiceImpl implements OrderService{
@Override
public void generate() {
try {
Thread.sleep(1234);
System.out.println("订单已经生成");
} catch (InterruptedException e) {
e.printStackTrace();
}

}

@Override
public void modify() {
try {
Thread.sleep(456);
System.out.println("订单已经修改");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public void detail() {
try {
Thread.sleep(456);
System.out.println("请看订单详情");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public String getName() {
System.out.println("getName方法执行了");
return "张三";
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.xiaoguan.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* 第一个参数proxy:代理对象的引用,使用比较少
* 第二个参数method:目标对象上的目标方法
* 第三个参数args:目标方法上的实参
*/
public class TimeInvocationHander implements InvocationHandler {
private Object target;
public TimeInvocationHander(Object target) {
this.target=target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Long begin=System.currentTimeMillis();
Object rs = method.invoke(target, args);
long end=System.currentTimeMillis();
System.out.println("耗时毫秒:" + (end - begin));
return rs;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.xiaoguan.utils;

import com.xiaoguan.proxy.TimeInvocationHander;

import java.lang.reflect.Proxy;

public class ProxyUtil {
public static Object newProxyInstance(Object target){
Object proxyObj = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new TimeInvocationHander(target));
return proxyObj;

}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.xiaoguan.client;
import com.xiaoguan.proxy.TimerMethodInterceptor;
import com.xiaoguan.proxy.UserService;
import net.sf.cglib.proxy.Enhancer;

public class Client {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new TimerMethodInterceptor());
UserService userService = (UserService) enhancer.create();
boolean admin = userService.login("admin", "123");
System.out.println(admin);
userService.logout();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.xiaoguan.proxy;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class TimerMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
long begin=System.currentTimeMillis();
Object o1 = methodProxy.invokeSuper(o, objects);
long end=System.currentTimeMillis();
System.out.println("耗时" + (end - begin) + "毫秒");
return o1;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.xiaoguan.proxy;

public class UserService {
public boolean login(String username,String password){
System.out.println("系统正在验证身份");
if ("admin".equals(username)&&"123".equals(password)) {
return true;
}
return false;
}
public void logout(){
System.out.println("系统正在退出");
}
}