packagecom.spring.bean.jdbc;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importorg.springframework.dao.DataAccessException;importorg.springframework.jdbc.core.BeanPropertyRowMapper;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.jdbc.core.RowMapper;importorg.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;importorg.springframework.jdbc.core.namedparam.MapSqlParameterSource;importorg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;importorg.springframework.jdbc.core.namedparam.SqlParameterSource;public classMainTest {private ApplicationContext ctx=null;privateStudentsDao studentsDao;privateJdbcTemplate jdbcTemplate;privateNamedParameterJdbcTemplate namedParameterJdbcTemplate;privateCourseDao courseDao;
{
ctx=new ClassPathXmlApplicationContext("bean.xml");
jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
studentsDao=(StudentsDao) ctx.getBean("studentsDao");
namedParameterJdbcTemplate=(NamedParameterJdbcTemplate)ctx.getBean("namedParameterJdbcTemplate");
courseDao=(CourseDao) ctx.getBean("courseDao");
}
/**
*更新某一条操作
*/
@Testpublic voidgetCourse(){
String sql="SELECT * from course WHERE id=?";
Course course= courseDao.getCourse(sql,1);
System.out.println(course);
}/*** 使用具名参数操作数据库(可以为字段起名)
* 优点就是:当字段较多,不用考虑字段的顺序,效率高,即key,value的形式
* 缺点:麻烦代码量多*/@Testpublic voidtestnamedParameterJdbcTemplate(){
String sql="INSERT INTO students ( name, sex, age, tel) VALUES (:n, :s, :a, :t)";
Map paramMap=new HashMap();
paramMap.put("n", "rongrong");
paramMap.put("s", "man");
paramMap.put("a", "25");
paramMap.put("t", "18612396984");
namedParameterJdbcTemplate.update(sql, paramMap);
}/*** 使用具名参数操作数据库
* 使用update(String sql, SqlParameterSource paramSource)方法传入实体参数
* 要求:sql的字段名称与对象属性名称一致
* SqlParameterSource paramSource*/@Testpublic voidtestnamedParameterJdbc(){
String sql="INSERT INTO course (coursename, coursenameid) VALUES (:coursename, :coursenameid);";
Course course= newCourse();
course.setCoursenameid("As-1001");
course.setCoursename("java");
SqlParameterSource paramSource= newBeanPropertySqlParameterSource(course);
namedParameterJdbcTemplate.update(sql, paramSource);
}/*** 修改数据库某条属性*/@Testpublic voidtestUpdate(){
String sql="UPDATE students SET `name`=? WHERE id=? ";
jdbcTemplate.update(sql,"lucy",1);
}/*** 批量更新数据
* List此处为对象数组
* 必须为对象数组,插入一条数据如:{"MT-1","man",17,"13706063546"}
* 如为多条数据,那么必须为对象数组*/@Testpublic voidtestBatchUpdate(){
String sql="INSERT INTO students ( name, sex, age, tel) VALUES (?, ?, ?, ?)";
List batchArgs=new ArrayList();
batchArgs.add(new Object[]{"MT-1","man",17,"13706063546"});
batchArgs.add(new Object[]{"MT-2","man",18,"13706063547"});
batchArgs.add(new Object[]{"MT-3","man",19,"13706063548"});
batchArgs.add(new Object[]{"MT-4","man",20,"13706063549"});
jdbcTemplate.batchUpdate(sql, batchArgs);
}/*** 查询返回一个实体对象集合
* 注意调用的不是 queryForList 方法*/@Testpublic voidtestQueryForList(){
String sql="SELECT id,name, sex, age, tel FROM students";
RowMapper rowMapper = new BeanPropertyRowMapper(Students.class);
List students =jdbcTemplate.query(sql, rowMapper);//不是 queryForList 方法//List students = jdbcTemplate.queryForList(sql, Students.class);
System.out.println(students);
}/*** 从数据库中获取一条记录, 实际得到对应的一个对象
* 注意不是调用 queryForObject(String sql, Class requiredType, Object... args) 方法!
* 而需要调用 queryForObject(String sql, RowMapper rowMapper, Object... args)
* 1. 其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper
* 2. 使用 SQL 中列的别名完成列名和类的属性名的映射. 例如 name, sex, age, tel
* 3. 不支持级联属性. JdbcTemplate 到底是一个 JDBC 的小工具, 而不是 ORM 框架*/@Testpublic voidtestQueryForObject(){
String sql="SELECT id,name, sex, age, tel FROM students WHERE id=?";
RowMapper rowMapper = new BeanPropertyRowMapper(Students.class);
Students students= jdbcTemplate.queryForObject(sql, rowMapper,1);
System.out.println(students);
}/*** 获取单个列的值, 或做统计查询
* 使用 queryForObject(String sql, Class requiredType)
* 其中:requiredType为Integer.class可以达到统计查询的效果
* 使用 int queryForInt(String sql) throws DataAccessException,可实现*/@Testpublic voidtestQueryForINt(){
String sql="SELECT count(id) FROM students ";//RowMapper rowMapper = new BeanPropertyRowMapper(Students.class);
int long1 =jdbcTemplate.queryForInt(sql);//Integer long1 = jdbcTemplate.queryForObject(sql, Integer.class);//不是 queryForList 方法//List students = jdbcTemplate.queryForList(sql, Students.class);
System.out.println(long1);
}/*** 根据用户id,返回用户对象*/@Testpublic voidgetStudents(){
String sql="SELECT id,name, sex, age, tel FROM students WHERE id=?";
System.out.println(studentsDao.getStudent(sql,4));
}
}