2023年6月21日发(作者:)

JDBCTemplate执⾏增删改查(CDUR)操作1、JdbcTemplate简介(1)Spring提供的⼀个操作数据库的技术JdbcTemplate,是对Jdbc的封装。语法风格⾮常接近DBUtil。JdbcTemplate可以直接操作数据库,加快效率,⽽且学这个JdbcTemplate也是为声明式事务做准备,毕竟要对数据库中的数据进⾏操纵!JdbcTemplate中并没有提供⼀级缓存,以及类与类之间的关联关系!就像是spring提供的⼀个DBUtils。Spring对数据库的操作使⽤JdbcTemplate来封装JDBC,结合Spring的注⼊特性可以很⽅便的实现对数据库的访问操作。使⽤JdbcTemplate可以像JDBC⼀样来编写数据库的操作代码(2)为啥要使⽤Jdbc_template进⾏开发呢?Spring对数据库的操作在jdbc上⾯做了深层次的封装,使⽤spring的注⼊功能,可以把DataSource注册到JdbcTemplate之中。Spring提供的JdbcTemplate对jdbc做了封装,⼤⼤简化了数据库的操作。找到Spring JdbcTemplate源码,可以看到如下⽅法:Connection con = nection(getDataSource());如果直接使⽤JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等⼀系列的动作;繁琐且代码看起来不直观。此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值/赋值等操作,提⾼开发效率;如下:return (User) orObject("select * from tb_test1 where id = 100", )(3)配置环境①导⼊jar包IOC容器需要的jar包------------------------- //注解会使⽤到的包QL驱动、C3P0jar包-------------------------cTemplate需要的jar包-------------------------②在IOC容器中配置数据源 其中ties⽂件内容:=rd==jdbc:mysql://localhost:3306/=③在IOC容器()中配置JdbcTemplate对象的bean,并将数据源对象装配到JdbcTemplate对象中 2、案例演⽰(1)⾸先,新建数据库 jdbc_template,新建表 employee,并插⼊⼏条测试数据USE `jdbc_template`;DROP TABLE IF EXISTS `employee`;CREATE TABLE `employee` ( `emp_id` int(11) NOT NULL AUTO_INCREMENT, `emp_name` char(100) DEFAULT NULL, `salary` double DEFAULT NULL, PRIMARY KEY (`emp_id`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=gb2312;将数据库连接信息改为:=jdbc:mysql://localhost:3306/jdbc_template(2)在bean包下新建 1 public class Employee { 2 private Integer emp_id; 3 private String emp_name; 4 private Double salary; 5 public Employee() { 6 super(); 7 } 8 public Employee(Integer emp_id, String emp_name, double salary) { 9 super();10 _id = emp_id;11 _name = emp_name;12 = salary;13 }14 public int getEmp_id() {15 return emp_id;16 }17 public void setEmp_id(int emp_id) {18 _id = emp_id;19 }20 public String getEmp_name() {21 return emp_name;22 }23 public void setEmp_name(String emp_name) {24 _name = emp_name;25 }26 public double getSalary() {27 return salary;28 }29 public void setSalary(double salary) {30 = salary;31 }32 @Override33 public String toString() {34 return "Employee [emp_id=" + emp_id + ", emp_name=" + emp_name + ", salary=" + salary + "]";35 }36 }(3)新建JUnit测试类进⾏测试 blic class TestJdbcTemp { //声明两个对象ioc和JdbcTemplate private ApplicationContext ioc = new ClassPathXmlApplicationContext(""); private JdbcTemplate template = n();}① 测试数据源 DataSource

@Testpublic void testDataSource() { DataSource bean = n(); try { n(nection());//xyConnection@223aa2f7 } catch (SQLException e) { tackTrace(); }}② 将emp_id=5的记录的salary字段更新为1300.00【更新操作】@Testpublic void testUpdate() { String sql = "UPDATE employee SET salary = ? WHERE emp_id = ?"; (sql, 1300, 5);//第⼀个是sql语句,后⾯的按着顺序传⼊参数即可,update⽅法能接收的可变参数!}可以看到,该操作不⽤我们⾃⼰再去获取数据库连接信息了,⽽是直接传递sql语句及其参数就可以了!③ 批量插⼊@Testpublic void testBatch() { String sql = "INSERT INTO employee(`emp_name`,`salary`) VALUES(?,?)"; // 执⾏sql语句需要传递的参数 List list = new ArrayList(); (new Object[] { "Tom2015", 1000 }); (new Object[] { "Tom2016", 2000 }); (new Object[] { "Tom2017", 3000 }); pdate(sql, list);}④ 查询emp_id=5的数据库记录,封装为⼀个Java对象返回,分析:封装为⼀个对象返回的话,⾸先我们需要有⼀个与数据表对应的实体类!@Testpublic void testFindById(){ //需要注意的是:sql语句中的别名要与对应实体类的属性名保持⼀致!ps:这⾥不⽤别名也可以 String sql = "SELECT emp_id AS emp_id,emp_name AS emp_name,salary FROM employee WHERE emp_id=?"; //RowMapper是⼀个接⼝,我们使⽤其⼦类,把查出来的数据封装成⼀个bean对象 RowMapper rowMapper = new BeanPropertyRowMapper(); //最后⼀个参数是可变参数,⽤于向sql语句中依次传递参数! Employee employee = orObject(sql, rowMapper, 5); n(employee);//Employee [emp_id=5, emp_name=Kasier, salary=1300.0]}⑤ 查询salary>4000的数据库记录,封装为List集合返回@Testpublic void testEmployeeList(){ //需要注意的是:sql语句中的别名要与对应实体类的属性名保持⼀致!ps:这⾥不⽤别名也可以 String sql = "SELECT emp_id AS emp_id,emp_name AS emp_name,salary FROM employee WHERE salary > ?"; //RowMapper是⼀个接⼝,这⾥我们使⽤其⼦类,把查出来的数据封装成⼀个bean对象 RowMapper rowMapper = new BeanPropertyRowMapper(); //该query⽅法查询出来的是⼀个list列表,query⽅法的最后⼀个参数是可变参数! List list = (sql, rowMapper, 4000); for (Employee employee : list) { n(employee); //Employee [emp_id=1, emp_name=Susan, salary=5000.23] //Employee [emp_id=2, emp_name=Julian, salary=4234.77] //Employee [emp_id=3, emp_name=Papu, salary=9034.51] //Employee [emp_id=4, emp_name=Babala, salary=8054.33] //Employee [emp_id=6, emp_name=Owen, salary=7714.11] }}查询结果是⼀个实体还是⼀个list列表是靠template对象的不同⽅法实现的!⑥ 查询最⼤salary【返回单值】@Testpublic void testMaxSalary(){ String sql = "SELECT MAX(salary) FROM employee"; //需要指定返回值的类型,⽽且类型必须是包装类型,可带可变参数 Double maxSalary = orObject(sql, ); n(maxSalary);//9034.51}⑦ 使⽤带有具名参数的SQL语句插⼊⼀条员⼯记录,并以Map形式传⼊参数值具名参数:是指基于名称的,前⾯我们使⽤的都是⽤?作为占位符,然后是使⽤基于位置的如果要使⽤具名参数的sql语句就必须在spring配置⽂件中配置NamedParameterJdbcTemplat这个模板类,⽽不能使⽤原来的JdbcTemplate,因为JdbcTemplate不能完成这样的任务!在 中新增配置信息 测试@Testpublic void testParam(){ String sql="INSERT INTO employee VALUES(null,:paramName,:paramSalary)"; Map paramMap = new HashMap(); ("paramName","LiMing" ); ("paramSalary",1000); (sql, paramMap);}⑧ 重复实验 ⑦,以 SqlParameterSource 形式传⼊参数值@Testpublic void testParameterSource(){ String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(:emp_name,:salary)"; //该BeanPropertySqlParameterSource类构造器需要⼀个对象参数,该对象参数是⼀个封装了sql语句参数的对象! //此时要求对象的属性名要和sql中的参数名保持⼀致!这⾥我们使⽤Employee对象来完成 Employee employee= new Employee(null, "Danny", 1500); //以实体对象的形式封装具名参数和值 SqlParameterSource source = new BeanPropertySqlParameterSource(employee); (sql, source);}⑨ 创建 EmployeeDao,⾃动装配 JdbcTemplate 对象创建 EmployeeDao 类@Repository//加载到IOC容器public class EmployeeDao { @Autowired//注⼊JdbcTemplate对象 private JdbcTemplate jdbcTemplate; //更新⼯资,加1000元 public void updateSaraly(Integer id){ String sql = "update employee set salary=salary+1000 where emp_id=?"; (sql, id); } //查询所有员⼯信息 public List findAll(){ String sql = "select * from employee"; RowMapper rowMapper = new BeanPropertyRowMapper(); return (sql, rowMapper); }}配置spring的配置⽂件的配置⽂件 测试Dao@Testpublic void testUpdateSalary(){ EmployeeDao employeeDao = n(); Saraly(11);}@Testpublic void testFindAll(){ EmployeeDao employeeDao = n(); List list = l(); for (Employee employee : list) { n(employee); }}

2023年6月21日发(作者:)

JDBCTemplate执⾏增删改查(CDUR)操作1、JdbcTemplate简介(1)Spring提供的⼀个操作数据库的技术JdbcTemplate,是对Jdbc的封装。语法风格⾮常接近DBUtil。JdbcTemplate可以直接操作数据库,加快效率,⽽且学这个JdbcTemplate也是为声明式事务做准备,毕竟要对数据库中的数据进⾏操纵!JdbcTemplate中并没有提供⼀级缓存,以及类与类之间的关联关系!就像是spring提供的⼀个DBUtils。Spring对数据库的操作使⽤JdbcTemplate来封装JDBC,结合Spring的注⼊特性可以很⽅便的实现对数据库的访问操作。使⽤JdbcTemplate可以像JDBC⼀样来编写数据库的操作代码(2)为啥要使⽤Jdbc_template进⾏开发呢?Spring对数据库的操作在jdbc上⾯做了深层次的封装,使⽤spring的注⼊功能,可以把DataSource注册到JdbcTemplate之中。Spring提供的JdbcTemplate对jdbc做了封装,⼤⼤简化了数据库的操作。找到Spring JdbcTemplate源码,可以看到如下⽅法:Connection con = nection(getDataSource());如果直接使⽤JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等⼀系列的动作;繁琐且代码看起来不直观。此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值/赋值等操作,提⾼开发效率;如下:return (User) orObject("select * from tb_test1 where id = 100", )(3)配置环境①导⼊jar包IOC容器需要的jar包------------------------- //注解会使⽤到的包QL驱动、C3P0jar包-------------------------cTemplate需要的jar包-------------------------②在IOC容器中配置数据源 其中ties⽂件内容:=rd==jdbc:mysql://localhost:3306/=③在IOC容器()中配置JdbcTemplate对象的bean,并将数据源对象装配到JdbcTemplate对象中 2、案例演⽰(1)⾸先,新建数据库 jdbc_template,新建表 employee,并插⼊⼏条测试数据USE `jdbc_template`;DROP TABLE IF EXISTS `employee`;CREATE TABLE `employee` ( `emp_id` int(11) NOT NULL AUTO_INCREMENT, `emp_name` char(100) DEFAULT NULL, `salary` double DEFAULT NULL, PRIMARY KEY (`emp_id`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=gb2312;将数据库连接信息改为:=jdbc:mysql://localhost:3306/jdbc_template(2)在bean包下新建 1 public class Employee { 2 private Integer emp_id; 3 private String emp_name; 4 private Double salary; 5 public Employee() { 6 super(); 7 } 8 public Employee(Integer emp_id, String emp_name, double salary) { 9 super();10 _id = emp_id;11 _name = emp_name;12 = salary;13 }14 public int getEmp_id() {15 return emp_id;16 }17 public void setEmp_id(int emp_id) {18 _id = emp_id;19 }20 public String getEmp_name() {21 return emp_name;22 }23 public void setEmp_name(String emp_name) {24 _name = emp_name;25 }26 public double getSalary() {27 return salary;28 }29 public void setSalary(double salary) {30 = salary;31 }32 @Override33 public String toString() {34 return "Employee [emp_id=" + emp_id + ", emp_name=" + emp_name + ", salary=" + salary + "]";35 }36 }(3)新建JUnit测试类进⾏测试 blic class TestJdbcTemp { //声明两个对象ioc和JdbcTemplate private ApplicationContext ioc = new ClassPathXmlApplicationContext(""); private JdbcTemplate template = n();}① 测试数据源 DataSource

@Testpublic void testDataSource() { DataSource bean = n(); try { n(nection());//xyConnection@223aa2f7 } catch (SQLException e) { tackTrace(); }}② 将emp_id=5的记录的salary字段更新为1300.00【更新操作】@Testpublic void testUpdate() { String sql = "UPDATE employee SET salary = ? WHERE emp_id = ?"; (sql, 1300, 5);//第⼀个是sql语句,后⾯的按着顺序传⼊参数即可,update⽅法能接收的可变参数!}可以看到,该操作不⽤我们⾃⼰再去获取数据库连接信息了,⽽是直接传递sql语句及其参数就可以了!③ 批量插⼊@Testpublic void testBatch() { String sql = "INSERT INTO employee(`emp_name`,`salary`) VALUES(?,?)"; // 执⾏sql语句需要传递的参数 List list = new ArrayList(); (new Object[] { "Tom2015", 1000 }); (new Object[] { "Tom2016", 2000 }); (new Object[] { "Tom2017", 3000 }); pdate(sql, list);}④ 查询emp_id=5的数据库记录,封装为⼀个Java对象返回,分析:封装为⼀个对象返回的话,⾸先我们需要有⼀个与数据表对应的实体类!@Testpublic void testFindById(){ //需要注意的是:sql语句中的别名要与对应实体类的属性名保持⼀致!ps:这⾥不⽤别名也可以 String sql = "SELECT emp_id AS emp_id,emp_name AS emp_name,salary FROM employee WHERE emp_id=?"; //RowMapper是⼀个接⼝,我们使⽤其⼦类,把查出来的数据封装成⼀个bean对象 RowMapper rowMapper = new BeanPropertyRowMapper(); //最后⼀个参数是可变参数,⽤于向sql语句中依次传递参数! Employee employee = orObject(sql, rowMapper, 5); n(employee);//Employee [emp_id=5, emp_name=Kasier, salary=1300.0]}⑤ 查询salary>4000的数据库记录,封装为List集合返回@Testpublic void testEmployeeList(){ //需要注意的是:sql语句中的别名要与对应实体类的属性名保持⼀致!ps:这⾥不⽤别名也可以 String sql = "SELECT emp_id AS emp_id,emp_name AS emp_name,salary FROM employee WHERE salary > ?"; //RowMapper是⼀个接⼝,这⾥我们使⽤其⼦类,把查出来的数据封装成⼀个bean对象 RowMapper rowMapper = new BeanPropertyRowMapper(); //该query⽅法查询出来的是⼀个list列表,query⽅法的最后⼀个参数是可变参数! List list = (sql, rowMapper, 4000); for (Employee employee : list) { n(employee); //Employee [emp_id=1, emp_name=Susan, salary=5000.23] //Employee [emp_id=2, emp_name=Julian, salary=4234.77] //Employee [emp_id=3, emp_name=Papu, salary=9034.51] //Employee [emp_id=4, emp_name=Babala, salary=8054.33] //Employee [emp_id=6, emp_name=Owen, salary=7714.11] }}查询结果是⼀个实体还是⼀个list列表是靠template对象的不同⽅法实现的!⑥ 查询最⼤salary【返回单值】@Testpublic void testMaxSalary(){ String sql = "SELECT MAX(salary) FROM employee"; //需要指定返回值的类型,⽽且类型必须是包装类型,可带可变参数 Double maxSalary = orObject(sql, ); n(maxSalary);//9034.51}⑦ 使⽤带有具名参数的SQL语句插⼊⼀条员⼯记录,并以Map形式传⼊参数值具名参数:是指基于名称的,前⾯我们使⽤的都是⽤?作为占位符,然后是使⽤基于位置的如果要使⽤具名参数的sql语句就必须在spring配置⽂件中配置NamedParameterJdbcTemplat这个模板类,⽽不能使⽤原来的JdbcTemplate,因为JdbcTemplate不能完成这样的任务!在 中新增配置信息 测试@Testpublic void testParam(){ String sql="INSERT INTO employee VALUES(null,:paramName,:paramSalary)"; Map paramMap = new HashMap(); ("paramName","LiMing" ); ("paramSalary",1000); (sql, paramMap);}⑧ 重复实验 ⑦,以 SqlParameterSource 形式传⼊参数值@Testpublic void testParameterSource(){ String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(:emp_name,:salary)"; //该BeanPropertySqlParameterSource类构造器需要⼀个对象参数,该对象参数是⼀个封装了sql语句参数的对象! //此时要求对象的属性名要和sql中的参数名保持⼀致!这⾥我们使⽤Employee对象来完成 Employee employee= new Employee(null, "Danny", 1500); //以实体对象的形式封装具名参数和值 SqlParameterSource source = new BeanPropertySqlParameterSource(employee); (sql, source);}⑨ 创建 EmployeeDao,⾃动装配 JdbcTemplate 对象创建 EmployeeDao 类@Repository//加载到IOC容器public class EmployeeDao { @Autowired//注⼊JdbcTemplate对象 private JdbcTemplate jdbcTemplate; //更新⼯资,加1000元 public void updateSaraly(Integer id){ String sql = "update employee set salary=salary+1000 where emp_id=?"; (sql, id); } //查询所有员⼯信息 public List findAll(){ String sql = "select * from employee"; RowMapper rowMapper = new BeanPropertyRowMapper(); return (sql, rowMapper); }}配置spring的配置⽂件的配置⽂件 测试Dao@Testpublic void testUpdateSalary(){ EmployeeDao employeeDao = n(); Saraly(11);}@Testpublic void testFindAll(){ EmployeeDao employeeDao = n(); List list = l(); for (Employee employee : list) { n(employee); }}