发表于: 2018-03-25 16:18:37

3 449


今天完成的事情:


1.使用java类自动装配bean,用断言测试

2.查询服务器和域名相关的信息

3.关于批量插入数据的测试




1.使用java类代替xml注入bean(不使用xml) 

(创建java配置类,让spring自动扫描带有@Component或其它@注解,并且为其创建bean。需要配置的bean要在配置类同级或者子级文件目录下)

   之前有个问题没有清楚,是注解跟xml的关系。使用java类一样可以代替xml,但是各有好处。有点豁然开朗的感觉。但是bean是如何装配的、属性是什么依然有疑惑。


目录:

配置类:

//配置类@ComponentScan默认会扫描与配置类相同的包,spring会自动扫描这个包以及这个包下所有子包,查找带有@Component注解的类并为其创建bean
@Configuration
@ComponentScan
public class SheDiaoConfig {

//    也可以xml中配置:
//    <context:component-scan base-package="aopperson"/>

}

需要扫描的类

@Component
public interface SheDiao {

void jianwuxufa();

}
@Component
public class SheDiaoImpl implements SheDiao ,Serializable{

public void jianwuxufa() {
System.out.print("\n 射出亿万箭矢!! \n");
}
}
@Component
public class ShediaoStart {

public void beforeQima(){
System.out.print("飞身上马!\n");
}

public void afterXiama(){
System.out.print("一波骚操作 \n");
}

}

测试是否自动装配:

//@RunWith(SpringJUnit4ClassRunner.class)为了开始的时候自动创建spring的上下文
@RunWith(SpringJUnit4ClassRunner.class)
//告诉spring需要加载的配置类 因为其中注释了@ComponentScan
@ContextConfiguration(classes = SheDiaoConfig.class)
public class TestAop {

@Autowired
   SheDiao sheDiao;

@Test
   public void testShediao(){

//        ApplicationContext conn = new ClassPathXmlApplicationContext("applicationaop.xml");//
//        SheDiao sheDiao = (SheDiao) conn.getBean("Shediao");
//        断言sheDiao是否为空
       assertNull(sheDiao);
sheDiao.jianwuxufa();

}


测试成功:

这里提示断言sheDiao为空,但是测试出来它不为空,说明被创建了bean(这里有疑问,因为不使用注解直接普通的创建引用测试出来也是非空的,这里只能说明spring发现它了):


为了测试是否真的创建,我把interface SheDiao上的注解删除

import org.springframework.stereotype.Component;

import java.io.PrintStream;

public interface SheDiao {
void jianwuxufa();
}

结果仍然相同,我又把它的实现类SheDiaoImpl注解删除

public class SheDiaoImpl implements SheDiao ,Serializable{
public void jianwuxufa() {
System.out.print("\n 射出亿万箭矢!! \n");
}
}

结果报错:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'TestAop': Unsatisfied dependency expressed through field 'sheDiao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'aopperson.SheDiao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

而且测试类属性也报红线:

如果把@Autowired去掉,则会报空指针异常(java.lang.NullPointerException

@Component是可以带id标识的:@Component("id")


2.服务器

就是看服务器的相关信息。记得之前买过其它的服务器,感觉很便宜,忘了在哪里买的了,跟在阿里的不一样。见过的只有以前公司自己的服务器,还是windows service。现在只能用远程命令,很多不知道,一直在看相关的信息。


3.测试插入语句

想到服务器就想到以前的数据,可以先做个测试

先测试插入多条语句:

User u = new User();
int max = 30;
int min = 20;
for (int i=0;i<100;i++){
int age = random.nextInt(max)%(max-min+1) + min;
u.setAge(age);
userMapper.insertUser(u);
}

报错:

Duplicate entry '36' for key 'PRIMARY'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '36' for key 'PRIMARY'

insert语句:

<insert id="insertUser" parameterType="springmybatis.model.User"  useGeneratedKeys="true"  keyProperty="id" >
INSERT INTO jnshu_user(id,create_at,update_at,name,age,sex,pro,brother) values (#{id},#{create_at},#{update_at},#{name},#{age},#{sex},#{pro},#{brother})
</insert>

原因:把id值赋给实体类了,所以提示重复报错

  keyProperty="id" 
“表示将自增长后的Id赋值给实体类中的userId字段。”

删除 keyProperty="id" 以后成功:

@org.junit.Test
public void testInsertUserM(){

Random random = new Random();

for(int i=1;i<51;i++){
int a = (int)(Math.random()*100);
System.out.print("Math" + i + "个随机数 : " + a +"\n");
System.out.print("Random" + i + "个随机数 : " + random.nextInt(100) +"\n");
}

User u = new User();
int max = 30;
int min = 20;
for (int i=0;i<100;i++){

int age = random.nextInt(max)%(max-min+1) + min;
u.setAge(age);

userMapper.insertUser(u);

}

}


接下来测试更多,但是有个问题,是一条一条插入还是直接插入一个集合?还是一条集合几百个数据,然后分批次插入这些集合?可以都尝试下。


试了一下插入5000条数据:

用了16s

如果插入更多呢…


1分钟插入20000条数据

用心去感受插入百万千万条数据,1分钟两万,两百万就是100分钟,两亿就是1万分钟,呵呵。


之前测试了逐条插入没问题,所以就尝试把一个list插入进去:

首先mapper添加插入集合方法:

public interface UserMapper {

List<User> findAllUser();

public User selectById(int id);

void updateUser(User user);

void insertUser(User user);

void deleteUser(int id);

void insertUserList(List<User> list);


}

mapperxml增加插入集合映射语句:

<insert id="insertUserList" parameterType="springmybatis.model.User"  useGeneratedKeys="true">
INSERT INTO jnshu_user(id,create_at,update_at,name,age,sex,pro,brother)
values
<foreach  item="item" collection="list" separator="," index = "index">
(#{item.id},#{item.create_at},#{item.update_at},#{item.name},#{item.age},#{item.sex},#{item.pro},#{item.brother})
</foreach>
</insert>

然后是测试:

@org.junit.Test
public void testInsertUserList(){

List<User> list = new ArrayList<User>();
User user = new User();
//        user.setId(5);
   user.setName("花花");
user.setAge(22);
user.setCreate_at(20150301);
user.setUpdate_at(20160927);
user.setSex(0);
user.setPro("风儿吹,风儿吹,你在思念谁~~");
user.setBrother("娘娘");
list.add(user);
userMapper.insertUserList(list);

}


插入成功


然后使用集合插入:

发现每个集合都是同一个数据

测试输出:

------已插入第1条数据------

[User{id=0, create_at=0, update_at=0, name='乔叶', age=29, sex=1, pro='null', brother='李飞龙'}]=====  xingshi:乔叶,age:24,sex:0  =====

------已插入第2条数据------

[User{id=0, create_at=0, update_at=0, name='乔叶', age=24, sex=0, pro='null', brother='乔叶'}, User{id=0, create_at=0, update_at=0, name='乔叶', age=24, sex=0, pro='null', brother='乔叶'}]=====  xingshi:孙风,age:20,sex:1  =====

------已插入第3条数据------

[User{id=0, create_at=0, update_at=0, name='孙风', age=20, sex=1, pro='null', brother='乔叶'}, User{id=0, create_at=0, update_at=0, name='孙风', age=20, sex=1, pro='null', brother='乔叶'}, User{id=0, create_at=0, update_at=0, name='孙风', age=20, sex=1, pro='null', brother='乔叶'}]=====  xingshi:王子赣,age:26,sex:1  =====


原来每次循环都添加并覆盖了之前的数据。

List<User> list = new ArrayList<User>()

User user = new User();

for (int j=0;j<10;j++){
list.clear();

for (int i=0;i<5;i++){ 

.. 

u.setName(xing + ming); 

u.setAge(age); 

u.setSex(sex); 

u.setBrother(pro.getName()); 

pro.setName(xing + ming);

list.add(u);

}

}

原来是因为添加的是同一个对象,new User的时候把它放在了for循环的外面,所以每次for循环使用的都是一个对象,对象的属性变了,但是添加的都是这个对象,所以会覆盖前面的数据。

应该在for循环内创建对象,这样每次添加进去的都是新的数据,不会覆盖之前的数据。

这样就把new放在for循环内

   int max = 30;
int min = 20;
String xing = "" ;
String ming = "挪移";
User pro = new User();
pro.setName("大师兄");
List<User> list = new ArrayList<User>();

for (int j=0;j<50;j++){

list.clear();

for (int i=0;i<100;i++){

int xingshi = (int)(Math.random()*11);
int shi = (int)(Math.random()*11);
if(xingshi == 0){
xing = "";
}else if(xingshi == 1){
xing = "";
}else if(xingshi == 2){
xing = "";
}else if(xingshi == 3){
xing = "";
}else if(xingshi == 4){
xing = "";
}else if(xingshi == 5){
xing = "";
}else if(xingshi == 6){
xing = "诸葛";
}else if(xingshi == 7){
xing = "夏侯";
}else if(xingshi == 8){
xing = "";
}else if(xingshi == 9){
xing = "欧阳";
}else if(xingshi == 10){
xing = "";
}
if(shi == 0){
ming = "";
}else if(shi == 1){
ming = "";
}else if(shi == 2){
ming = "乾坤";
}else if(shi == 3){
ming = "天地";
}else if(shi == 4){
ming = "";
}else if(shi == 5){
ming = "村夫";
}else if(shi == 6){
ming = "飞龙";
}else if(shi == 7){
ming = "";
}else if(shi == 8){
ming = "";
}else if(shi == 9){
ming = "子赣";
}else if(shi == 10){
ming = "孔明";
}

int age = random.nextInt(max)%(max-min+1) + min;

int sex = (int)(Math.random()*2);


               User u = new User();
u.setName(xing + ming);
u.setAge(age);
u.setSex(sex);
u.setBrother(pro.getName());
pro.setName(xing + ming);
//            userMapper.insertUser(u);
System.out.print("=====  xingshi:"+ xing + ming +",age:"+age+",sex:"+sex+"  =====\n");
System.out.print("------已插入第"+(i+1)+"条数据------\n");
System.out.print(list.toString());
System.out.print("list.size():"+list.size()+"\n");

list.add(u);
}
userMapper.insertUserList(list);

}


测试:

应该有更好的随机插入方法,名字时间都可以随机。



明天计划的事情:


·好久没看任务了,跟着任务继续

·明天可能要外出


遇到的问题:


感觉有个很大的问题,就是看着写的东西感觉什么都知道,但是仔细一想却又什么都不知道。

任务做了很久了,很多是知其然不知其所以然。所以比较焦虑。

有时候不想跟着任务做,想以自己的吸收为主。感觉虽然这样做是可以做下去直到做完,但是做完以后只知道这样做就可以运行,任务就完成了,但是却没多少印象。有很多东西感觉理解了,有的可以写,有的却写不对,就好像理儿是那个理儿,但是功夫到不到是另外一回事。于是想把问题理解透彻才往前走。但是越是这样想就越没办法理解透彻。

而且越想理解需要看的东西就越多,知识无限,诚惶诚恐。

或许做下去会有新的理解。


·随机数的(int)Math.random()*3 应该为(int)(Math.random()*3);否则为0(计算顺序)

·for循环内引用对象的问题

·还是关于bean的引用的问题

·数据库数据多了明显卡顿,而且这还是未加索引


收获:


1.for循环内部使用对象是同一个,它存放的内存不变。set也只是改了它的属性,使用的还是它。只有new一个新对象才会使用新内存,不会覆盖之前的数据。new list也是一样,如果在for循环内new list,则每次都是把数据add到新的list中去,所以每次list.size()的值都是1。

2.使用java类配置bean,效果很好

3.关于服务器的相关知识



返回列表 返回列表
评论

    分享到