发表于: 2018-04-25 21:19:18

1 555


今天完成的事情:验收标准5  直接上项目


代码和配置文件在下面

package mapper;

import model.Student;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface AnnotionStudentMapper {
@Insert("insert into student (id,name,qq,wish,create_at) values(#{id} , #{name} , #{qq} , #{wish},#{create_at})")
void insert(Student student);
   @Delete("delete from student where id=#{id}")
void delete(Long id);
   @Update(" update student set wish=#{wish} where Id=#{id}")
void update(Student student) ;
   @Select("select * from student where id=#{id}")
Student select(Long id);
   @Select("select * from student")
List<Student> getAll() ;
}
import java.io.IOException;
import java.io.InputStream;

public class MybatisTool {
private static SqlSessionFactory sessionFactory=null;
   private  static void initialFactory()
{
String resource="conf.xml";
       try {
InputStream in = Resources.getResourceAsStream(resource);
           sessionFactory=new SqlSessionFactoryBuilder().build(in);
       } catch (IOException e) {
e.printStackTrace();
       }
}
public static SqlSession getSession()
{
if(sessionFactory==null)
{
initialFactory();
       }
return sessionFactory.openSession();
   }
}
public class AnnoStuTest
{
private static Logger logger = Logger.getLogger("MybatisTestTest.class");
   @Test
   public void insert() {
//SQL 的语句insert into students (id,name,qq,wish,create_at)
       SqlSession session = MybatisTool.getSession();
       AnnotionStudentMapper mapper = session.getMapper(AnnotionStudentMapper.class);
       Student student = new Student(201L, "张三", "244558", "修仙", 2018L);
       mapper.insert(student);
       session.commit();
       session.close();
       logger.info(student.toString());
   }

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <!--
   environments:开发模式
   work:工作模式
   default="development"id="development",两个的属性值必须一致
    -->
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mysql"/>
               <property name="username" value="root"/>
               <property name="password" value="123456"/>
           </dataSource>
       </environment>
   </environments>

   <!-- 在配置文件中 关联包下的 接口类-->
   <mappers>
       <mapper class="mapper.AnnotionStudentMapper"/>
   </mappers>
</configuration>

这里要注意下 有学到东西了


28.数据库里插入100万条数据,对比建索引和不建索引的效率查别。再插入3000万条数据,然后是2亿条,别说话,用心去感受数据库的性能。

索引其实也就是一张表

建立索引和不设置的去别在于有索引插入慢 查询快  没有插入块查询慢  

但是我下面的代码不讨论这个 ,直接上学习干货。

public class DbcpDataSourceTest {
private static Logger logger = Logger.getLogger(DbcpDataSourceTest.class);
   @Test
   public void insert() {
//SQL 的语句insert into students (id,name,qq,wish,create_at) values(?,?,?,?,?);
       String sql = "insert into student(id,name,qq,wish,create_at) values(?,?,?,?,?)";
       Long startTime = System.currentTimeMillis();
       StringBuffer stu=new StringBuffer();
       Connection conn = null;
       PreparedStatement st = null;
       ResultSet rs = null;
       for (long x = 1; x <100; x++) {
Student s = new Student(Long.valueOf(x), "张三", "244558", "修仙", 2018L);
           try {
conn = JdbcUtils_dbcp.getConnetion();
               st = conn.prepareStatement(sql);
               st.setLong(1, s.getId());
               st.setString(2, s.getName());
               st.setString(3, s.getQq());
               st.setString(4, s.getWish());
               st.setLong(5, s.getCreate_at());
               st.execute();
           } catch (SQLException e) {
e.printStackTrace();
               }
JdbcUtils_dbcp.release(conn, st, rs);
       }
Long endTime = System.currentTimeMillis();
       System.out.println("OK,用时:" + (endTime - startTime));
   }
@Test
   public void insert1() {
//SQL 的语句insert into students (id,name,qq,wish,create_at) values(?,?,?,?,?);
       String sql1= "insert into student(id,name,qq,wish,create_at) values";
       Long startTime = System.currentTimeMillis();
       StringBuffer stf = new StringBuffer();
       Connection conn = null;
       PreparedStatement st = null;
       ResultSet rs = null;
       try {
conn = JdbcUtils_dbcp.getConnetion();
           conn.setAutoCommit(false);
           for (int x = 1; x <=100; x++) {
for (int y = 1; y <=10000; y++) {

stf.append("(" + Long.valueOf((x-1)*10000+y) + ",'张三'," + "244558," + "'修仙'," + 2018L + "),");
               }
//conn = JdbcUtils_dbcp.getConnetion();
               String sql = sql1 + stf.substring(0, stf.length() - 1);
               //logger.info(sql);
               st = conn.prepareStatement("");
               //conn.setAutoCommit(false);
               st.addBatch(sql);
               st.executeBatch();
               conn.commit();
               stf=new StringBuffer();
           }
} catch(SQLException e){
e.printStackTrace();
           }

JdbcUtils_dbcp.release(conn, st, rs);

       Long endTime = System.currentTimeMillis();
       logger.info("OK,用时:" + (endTime - startTime));
   }
@Test
   public void insert2() {
//SQL 的语句insert into students (id,name,qq,wish,create_at) values(?,?,?,?,?);
       String sql1= "insert into student(id,name,qq,wish,create_at) values";
       Long startTime = System.currentTimeMillis();
       StringBuffer stf = new StringBuffer();
       Connection conn = null;
       PreparedStatement st = null;
       ResultSet rs = null;
       try {
conn = JdbcUtils_dbcp.getConnetion();
           conn.setAutoCommit(false);

               for (int y = 1; y <=1000000; y++) {

stf.append("(" + Long.valueOf(y) + ",'张三'," + "244558," + "'修仙'," + 2018L + "),");
               }
String sql = sql1 + stf.substring(0, stf.length() - 1);
               st = conn.prepareStatement("");
               st.addBatch(sql);
               st.executeBatch();
               conn.commit();
               stf=new StringBuffer();

       } catch(SQLException e){
e.printStackTrace();
       }

JdbcUtils_dbcp.release(conn, st, rs);

       Long endTime = System.currentTimeMillis();
       logger.info("OK,用时:" + (endTime - startTime));
   }
}

这个我得dbcp连接池就在这里面做数据插入,虽然只有我一个连接;这里三种方法插入数据

test()测试的时候我直接用连接开启关闭插入一个对象来插入数据,结果插了10多分钟还没有插完,只差了40w多条数据,后面我问师兄们有方法快速插入然后就百度  按照https://blog.csdn.net/u012860938/article/details/50850983 的文本流插入数据

如果按照这个教程做确实可以实现,但是我要查如自己的表格虽然知己游学过java的基础,但是在作的时候还是出现的一些bug,主要就是对mysql的操作语句理解不到位mysql在对中文编码是对文本流的“”‘’这个两个一定要理解清楚,java文本流对‘’和“”有明显却别,为什么mysql没有,通过对这次的学习对这个说点自己的理解,java“”中间输出的是String,但是mysql对“”''为了 

insert into student(id,name)  values(1,"我是谁" ) ;和insert into student(id,name)  values(1。‘我是谁’);结果一样

这就是为了解决java在文本流编码时输入中文String类型的时候“”能够正确书写;  mysql(“我是谁”)整体是一个文本流  在java书写(““我是谁””)就会报错  只能写成“'我是谁'”;这是这种原因,mysql必须对“ ” 和‘ ’不敏感;理解这个是重点


下面还有个小知识点  手动开启连接  下面2个代码必须都在

conn.setAutoCommit(false);

conn.commit();


接下来说文本流到mysql输入学习的一些东西一开始我按教程直接来了2个循环插入语句结果直接报错

就开始按照教程2个嵌套循环也是=这样写;

   for (int x = 1; x <=100; x++) {
for (int y = 1; y <=10000; y++) {stf.append("(" + Long.valueOf(x*y) + ",'张三'," + "244558," + "'修仙'," + 2018L + "),");
               }

出现如下错误  查看数据库里面只有10000条数据;

这个时候返回来看自己的代码。

有于主键位置id的值时唯一的这个时候但外循环执行到x=2的时候里面还是执行2*1;这就和2的主键重复;解决这个方法可以百度查一下,不过我还用笔算了一下2个嵌套循环这怎么实现数据唯一;根据他的循环我们获得的数据如下图

这个结果就导致我们只能但插入一次循环但查到x=2的时候就会出现数据的错误

我们实际要的数据循环结构是这样的


怎么实现也不难就是要思考下,很久没做数学可能一下想不到   结果就算是 (x-1)*1000+y;那为啥要写两个循环嵌套 我下面会说

通过这么写代码我们首先运行下,100次手动打开连接关闭的操作的结果如下9156ms;


如果我们不采用2个循环会怎么而却不应2个循环就只有建立一次数据库的连接不是更加节省时间吗

就这样我在写test直接循环一次但是出现下面错误

出现这种原因如下:

我们采用文本对数据操作,数据给了我们一个设定的最大上传就是1m;数据供给我们修改这个最大上传量就是100m  也就是你最大的一次文本上传就是100m了,首先是你的数据有可实现的循环关系 ,你想上传一个文本数据流量大于100m那你就得写嵌套,不然你就得各种复写代码。

我们通过对数库的修把他设置到40m 从上图我们看出我们的100w数据块40m了;然后运行

8887ms

我们用这个方法出插入3000w数据100w为基数循环30次;

插入索引

执行3000w数据插入


插入数据是的cup占用;

2亿数据(无索引)大概40分钟吧


                    
明天计划的事情: 任务总结 ,提交任务一, 

                      
遇到的问题:已解决     装GitHub;
收获:解决昨天乱码  第一次真正写了一条代码(x-1)*1000+y;(x-1)*1000000+y;





返回列表 返回列表
评论

    分享到