发表于: 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.关于服务器的相关知识
评论