entity
package com.fanyu.mybatis.entity;
/**
* Created with IntelliJ IDEA.
*
* @Auther: cloudonthesun
* @Date: 2021/4/26 15:59
* @Description:
*/
public class Teacher {
private Integer id;
private String name;
private String sex;
private Integer jNo;
private String subject;
private String grade;
private String description;
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", jNo=" + jNo +
", subject='" + subject + '\'' +
", grade='" + grade + '\'' +
", description='" + description + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getjNo() {
return jNo;
}
public void setjNo(Integer jNo) {
this.jNo = jNo;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
mybatis-config.xml
dao
package com.fanyu.mybatis.dao;
import com.fanyu.mybatis.entity.Teacher;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.SelectKey;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Auther: cloudonthesun
* @Date: 2021/4/26 16:02
* @Description:
*/
public interface TeacherDao {
@Insert("")
@SelectKey(statement = "select last_insert_id()",keyProperty = "id",before = false,resultType = Integer.class)
public int batchInsert(List list);
}
MybatisUtilsTest
package com.fanyu.mybatis;
import com.fanyu.mybatis.dao.TeacherDao;
import com.fanyu.mybatis.entity.Teacher;
import com.fanyu.mybatis.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Auther: cloudonthesun
* @Date: 2021/4/26 11:23
* @Description:
*/
public class MybatisUtilsTest {
@Test
public void testBatchInsertByAnnotation(){
SqlSessionFactory sqlSessionFactory = MybatisUtils.getSqlSessionFactory();
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
TeacherDao teacherDao = sqlSession.getMapper(TeacherDao.class);
List list = new ArrayList<>();
for (int i = 0; i < 500; i++) {
Teacher teacher = new Teacher();
teacher.setName("老师" + (i + 1));
teacher.setSex((i % 2 == 1) ? "男" : "女");
teacher.setjNo(i + 1);
teacher.setSubject((i % 2 == 1) ? "英语" : "数学");
teacher.setGrade(i <= 5 ? (i + 1) + "年级" : (i % 6 + 1) + "年级");
teacher.setDescription(i % 2 == 1 ? "最帅的老师" : "最美的老师");
list.add(teacher);
}
teacherDao.batchInsert(list);
sqlSession.commit();
System.out.println("共有" + 500 + "位老师成功生成数据,详情见下*******************");
for (int i = 0; i < 500; i++) {
Teacher teacher = list.get(i);
System.out.print("老师姓名为:" + teacher.getName() + ",");
System.out.print("老师性别为:" + teacher.getSex() + ",");
System.out.print("老师工号为:" + teacher.getjNo() + ",");
System.out.print("老师所教学科为:" + teacher.getSubject() + ",");
System.out.print("老师所在年级为:" + teacher.getGrade() + ",");
System.out.print("老师备注为:" + teacher.getDescription());
System.out.println();
}
}catch (Exception e){
e.printStackTrace();
throw e;
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
}
}
out
D:\D1\java\jdk\jdk1.8.0_45\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\D1\IDEs\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=63340:D:\D1\IDEs\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\D1\IDEs\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar;D:\D1\IDEs\IntelliJ IDEA 2019.3.1\plugins\junit\lib\junit5-rt.jar;D:\D1\IDEs\IntelliJ IDEA 2019.3.1\plugins\junit\lib\junit-rt.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\charsets.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\deploy.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\access-bridge-64.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\cldrdata.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\dnsns.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\jaccess.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\jfxrt.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\localedata.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\nashorn.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\sunec.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\sunjce_provider.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\sunmscapi.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\sunpkcs11.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\ext\zipfs.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\javaws.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\jce.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\jfr.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\jfxswt.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\jsse.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\management-agent.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\plugin.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\resources.jar;D:\D1\java\jdk\jdk1.8.0_45\jre\lib\rt.jar;D:\D1\code\MostImportant\framework\mybatis\mybatis-task\target\test-classes;D:\D1\code\MostImportant\framework\mybatis\mybatis-task\target\classes;D:\D1\java\maven\repo\org\mybatis\mybatis\3.5.3\mybatis-3.5.3.jar;D:\D1\java\maven\repo\mysql\mysql-connector-java\8.0.22\mysql-connector-java-8.0.22.jar;D:\D1\java\maven\repo\com\google\protobuf\protobuf-java\3.11.4\protobuf-java-3.11.4.jar;D:\D1\java\maven\repo\com\github\pagehelper\pagehelper\5.2.0\pagehelper-5.2.0.jar;D:\D1\java\maven\repo\com\github\jsqlparser\jsqlparser\3.2\jsqlparser-3.2.jar;D:\D1\java\maven\repo\junit\junit\4.12\junit-4.12.jar;D:\D1\java\maven\repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\D1\java\maven\repo\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\D1\java\maven\repo\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\D1\java\maven\repo\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\D1\java\maven\repo\com\mchange\c3p0\0.9.5.4\c3p0-0.9.5.4.jar;D:\D1\java\maven\repo\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.fanyu.mybatis.MybatisUtilsTest,testBatchInsertByAnnotation
[main] 16:41:35.996 DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
[MLog-Init-Reporter] 16:41:36.047 INFO com.mchange.v2.log.MLog - MLog clients using slf4j logging.
[MLog-Init-Reporter] 16:41:36.054 DEBUG com.mchange.v2.log.MLog - Reading VM config for path list /com/mchange/v2/log/default-mchange-log.properties, /mchange-commons.properties, /c3p0.properties, hocon:/reference,/application,/c3p0,/, /mchange-log.properties, /
[MLog-Init-Reporter] 16:41:36.054 DEBUG com.mchange.v2.log.MLog - The configuration file for resource identifier '/mchange-commons.properties' could not be found. Skipping.
[MLog-Init-Reporter] 16:41:36.054 DEBUG com.mchange.v2.log.MLog - The configuration file for resource identifier '/c3p0.properties' could not be found. Skipping.
[MLog-Init-Reporter] 16:41:36.054 DEBUG com.mchange.v2.log.MLog - The configuration file for resource identifier 'hocon:/reference,/application,/c3p0,/' could not be found. Skipping.
[MLog-Init-Reporter] 16:41:36.054 DEBUG com.mchange.v2.log.MLog - The configuration file for resource identifier '/mchange-log.properties' could not be found. Skipping.
[main] 16:41:36.056 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier '/mchange-commons.properties' could not be found. Skipping.
[main] 16:41:36.056 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier '/mchange-log.properties' could not be found. Skipping.
[main] 16:41:36.056 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier 'hocon:/reference,/application,/c3p0,/' could not be found. Skipping.
[main] 16:41:36.056 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier '/c3p0.properties' could not be found. Skipping.
[main] 16:41:36.823 INFO com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.5.4 [built 23-March-2019 23:00:48 -0700; debug? true; trace: 10]
[main] 16:41:36.847 DEBUG c.m.v.c.m.DynamicPooledDataSourceManagerMBean - MBean: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2sk6ojah3p9cvh1r3o7jc|45f45fa1,name=2sk6ojah3p9cvh1r3o7jc|45f45fa1 registered.
[main] 16:41:36.862 DEBUG c.m.v.c.m.DynamicPooledDataSourceManagerMBean - MBean: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2sk6ojah3p9cvh1r3o7jc|45f45fa1,name=2sk6ojah3p9cvh1r3o7jc|45f45fa1 unregistered, in order to be reregistered after update.
[main] 16:41:36.862 DEBUG c.m.v.c.m.DynamicPooledDataSourceManagerMBean - MBean: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2sk6ojah3p9cvh1r3o7jc|45f45fa1,name=2sk6ojah3p9cvh1r3o7jc|45f45fa1 registered.
[main] 16:41:36.870 DEBUG org.apache.ibatis.io.VFS - Class not found: org.jboss.vfs.VFS
[main] 16:41:36.870 DEBUG org.apache.ibatis.io.JBoss6VFS - JBoss 6 VFS API is not available in this environment.
[main] 16:41:36.871 DEBUG org.apache.ibatis.io.VFS - Class not found: org.jboss.vfs.VirtualFile
[main] 16:41:36.871 DEBUG org.apache.ibatis.io.VFS - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
[main] 16:41:36.872 DEBUG org.apache.ibatis.io.VFS - Using VFS adapter org.apache.ibatis.io.DefaultVFS
[main] 16:41:36.872 DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/D:/D1/code/MostImportant/framework/mybatis/mybatis-task/target/classes/com/fanyu/mybatis/dao
[main] 16:41:36.872 DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/D:/D1/code/MostImportant/framework/mybatis/mybatis-task/target/classes/com/fanyu/mybatis/dao
[main] 16:41:36.903 DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: TeacherDao.class
[main] 16:41:36.905 DEBUG org.apache.ibatis.io.DefaultVFS - Listing file:/D:/D1/code/MostImportant/framework/mybatis/mybatis-task/target/classes/com/fanyu/mybatis/dao
[main] 16:41:36.905 DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/D:/D1/code/MostImportant/framework/mybatis/mybatis-task/target/classes/com/fanyu/mybatis/dao/TeacherDao.class
[main] 16:41:36.905 DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/D:/D1/code/MostImportant/framework/mybatis/mybatis-task/target/classes/com/fanyu/mybatis/dao/TeacherDao.class
[main] 16:41:36.905 DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: ���� 4 batchInsert (Ljava/util/List;)I Signature 7(Ljava/util/List;)I RuntimeVisibleAnnotations &Lorg/apache/ibatis/annotations/Insert; value � )Lorg/apache/ibatis/annotations/SelectKey; statement select last_insert_id() keyProperty id before
[main] 16:41:36.906 DEBUG org.apache.ibatis.io.ResolverUtil - Checking to see if class com.fanyu.mybatis.dao.TeacherDao matches criteria [is assignable to Object]
[main] 16:41:37.037 DEBUG o.a.i.t.jdbc.JdbcTransaction - Opening JDBC Connection
[main] 16:41:37.056 INFO c.m.v.c.i.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 2sk6ojah3p9cvh1r3o7jc|45f45fa1, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 2sk6ojah3p9cvh1r3o7jc|45f45fa1, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/babytun?useUnicode=true&CharacterEncoding=UTF-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
[main] 16:41:37.066 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier '/mchange-commons.properties' could not be found. Skipping.
[main] 16:41:37.067 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier '/mchange-log.properties' could not be found. Skipping.
[main] 16:41:37.067 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier '/c3p0.properties' could not be found. Skipping.
[main] 16:41:37.067 DEBUG com.mchange.v2.cfg.MConfig - The configuration file for resource identifier 'hocon:/reference,/application,/c3p0,/' could not be found. Skipping.
[main] 16:41:37.068 DEBUG c.m.v.resourcepool.BasicResourcePool - com.mchange.v2.resourcepool.BasicResourcePool@43bc63a3 config: [start -> 5; min -> 5; max -> 10; inc -> 3; num_acq_attempts -> 30; acq_attempt_delay -> 1000; check_idle_resources_delay -> 0; max_resource_age -> 0; max_idle_time -> 0; excess_max_idle_time -> 0; destroy_unreturned_resc_time -> 0; expiration_enforcement_delay -> 0; break_on_acquisition_failure -> false; debug_store_checkout_exceptions -> false; force_synchronous_checkins -> false]
[main] 16:41:37.068 DEBUG c.m.v.c.i.C3P0PooledConnectionPoolManager - Created new pool for auth, username (masked): 'ro******'.
[main] 16:41:37.068 DEBUG c.m.v.resourcepool.BasicResourcePool - acquire test -- pool size: 0; target_pool_size: 5; desired target? 1
[main] 16:41:37.068 DEBUG c.m.v.resourcepool.BasicResourcePool - awaitAvailable(): [unknown]
[main] 16:41:37.377 DEBUG o.a.i.t.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@6025e1b6 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@22ff4249]]
[main] 16:41:37.385 DEBUG c.f.m.dao.TeacherDao.batchInsert - ==> Preparing: insert into teacher(name,sex,j_no,subject,grade,description) values (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?,?) , (?,?,?,?,?