发表于: 2018-03-09 22:27:42
1 457
今天完成的事情:
1.今天学习了Spring的JDBCTemplate,用JDBCTemplate写了测试类。
private ApplicationContext context;
private JdbcTemplate jdbcTemplate;
{
context = new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
}
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法:update方法用于执行新增、修改、删除等语句;
batchUpdate方法:batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
Object queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType)
参数requiredType表明了相应函数的返回值类型。3个API都被期望返回一个1行1列的数据,
该行数据就是结果数据(直接为结果),否则会抛出异常。
因而,参数requiredType的值必须是一个对应数据库中的表字段对应的Java类型。
Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper)
如果你需要将返回值设定为自定义类型,你需要使用这3个API来完成。
RowMapper接口的功能就是将结果集中的某行转换为一个Object。
List queryForList(String sql, Object[] args, int[] argTypes, Class elementType)
elementType是返回值的每一个元素的类型。对于elementType的取值与前面的requiredType是相同的。
如果不指定的话,返回值将会被设定为一个a list of maps,即返回值中的每个元素都是一个map对象 。
Map queryForMap(String sql, Object[] args, int[] argTypes)
它们用来将查询结果转换为一个Map对象。这些方法要求查询结果为一个1行的数据,
然后它们可以将这1行数据按照以相应表字段为key值,查询得到的值为value的方式进行转换。
JdbcTemplate的query方法是拥有最多重载版本数的方法,同时也是最为灵活的方法。
从返回值的类型上来看,query方法分为两部分:返回值为Object或List。
从query方法的执行上来看,query方法采用JDBC Statement以及PreparedStatement两种。
以Object作为返回值的方法都含有一个ResultSetExtractor对象。
我没有对Query方法进行测试。
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
PreparedStatement ps = conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
},keyHolder);
通过GeneratedKeyHolder()类和设置Statement()类的autoGeneratedKeys配合使用,就可以插入数据时获取主键。
MyBatis则是要在Mapper.xml映射文件插入语句上添加useGeneratedKeys和keyProperty属性,或者在插入语句<insert>里面添加一个<selectKey>,sql语句为SELECT LAST_INSERT_ID(),返回主键列的java类型,例如java.lang.Integer
2.maven打包跳过测试类的两种方法 http://blog.csdn.net/zhuwillyn/article/details/56679057
1、在执行run as时候加上参数:
clean install compile -Dmaven.test.skip=true
2、在pom文件中添加如下插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
3.改了改bug,修了修需求,将项目打包成jar
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<configuration>
<classesDirectory>target/classes/</classesDirectory>
<archive>
<manifest>
<mainClass>com.controller.StudentController</mainClass>
<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<outputDirectory>
${project.build.directory}lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
将maven依赖的jar包打包下载到项目路径。
4.精细化了自己的日志配置文件
明天计划的事情:
1.数据库里插入100万条数据,对比建索引和不建索引的效率查别。再插入3000万条数据,然后是2亿条,别说话,用心去感受数据库的性能。
2.看看能不能再Linux里面用maven跑通项目。
3.根据验收标准,重新重构代码。
遇到的问题:
1.Junit测试的时候,写了参数和返回值,出现了异常。最后查到Junit单元测试应该是无状态的。
无状态就是说,我们以任何次序和次数去调用某个方法,它给出的结果在参数相同的情况下结果应该完全相同,如果我们在测试过程中记住了某个”状态“变量再去按不同的次序调用几个方法时这几个方法可能分别影响了那个”状态“变量的值,这就导致调用的次序和次数的不同组合得到的结果不相同。比如 testA(), testB(), test(),我们以任何次序和次数的组合去调用这几个方法,对每个方法来说在参数相同时结果就应该相同,如果它们之间共享了”状态“就是错误的 Test Case 设计,因为我们这样是在测试”过程“而不是过程中的某个”单元“。这样一来对于以后经常改动代码的情况下我们只需要改完后再重新跑所有的 JUnit Test Case 来验证这次改动没有影响其它的功能。如果做不到这点就不是一个合格的 JUnit Test Case。
这句话现在也不太理解,先记在这吧。
2.关于Mybatis返回类型为List的子类的问题?
模糊查询返回的List集合,我用LinkedList接收,确报类型不匹配异常,必须用ArrayList接受!
Mybatis的xml文件返回List时是怎么转换成它的子类的,而且始终是ArrayList?为什么不能用户自己去实现?
评论