Spring学习记录(十四)---JDBC基本操作

先看一些定义:

在Spring JDBC模块中,所有的类可以被分到四个单独的包:
1、core
即核心包,它包含了JDBC的核心功能。此包内有很多重要的类,包括:JdbcTemplate类、SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedParameterJdbcTemplate类。
2、datasource
即数据源包,访问数据源的实用工具类。它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码。
3、object
即对象包,以面向对象的方式访问数据库。它允许执行查询并返回结果作为业务对象。它可以在数据表的列和业务对象的属性之间映射查询结果。
4、support
即支持包,是core包和object包的支持类。例如提供了异常转换功能的SQLException类。

Spring中的JDBC帮我们做很多事情,如定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接。

我们只需要关心SQL语句,也就是增删改查。就行

连接数据库,一般都用xml配置

 1     <!-- 导入资源文件 -->
 2     <context:property-placeholder location="class:db.properties"/>
 3
 4     <!-- 配置c3p0数据源 -->
 5     <bean id="dataSource" class="com.mchange.v2.c3p0ComboPooledDataSource">
 6     <property name="user" value="${jdbc.user}"></property>
 7     <property name="password" value="${jdbc.password}"></property>
 8     <property name="driverClass" value="${jdbc.driverClass}"></property>
 9     <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
10     <property name="initPoolSize" value="${jdbc:initPoolSize}"></property>
11     <property name="maxPoolSize" value="${jdbc:maxPoolSize}"></property>
12     </bean>

资源文件:

1   jdbc:user=root
2   jdbc:password=1230
3   jdbc:driverClass=com.mysql.jdbc.Driver
4   jdbc:jdbcUrl=jdbc:mysql:///spring4
5
6   jdbc:initPoolSize=5
7   jdbc:maxPoolSize=10

main函数

1     public void main() {
2         ApplicationContext ctx=new ClassPathXmlApplicationContext("jdbc.xml");
3         DataSource dataource = ctx.getBean(DataSource.class);
4         System.out.println(dataource.getConnection());
5     }

这样就能连接上数据库了。

处理SQL语句的是core包中的类,也要在xml中配置,这里说一下,最多是使用 jdbcTemplate

1、JdbcTemplate 

1     <!-- 配置Spring的JdbcTemplate,数据源作它的属性-->
2     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
3         <property name="dataSource" ref="dataSource"></property>
4     </bean>
5     <!-- 配置NamedParameterJdbcTemplate,可以为参数命名。其没有无参构造函数,所以要指定参数 -->
6     <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.nameparam.NamedParameterJdbcTemplate">
7         <constructor-arg ref="dataSource"></constructor-arg>
8     </bean>

获取jdbcTemplate和NamedParameterJdbcTemplate对象

1 JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
2 NamedParameterJdbcTemplate namedParameterJdbcTemplate=(NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
    //更新一条记录
    @Test
    public void testUpdate(){
        String sql="UPDATE employees SET last_name = ? WHERE id = ?";
        jdbcTemplate.update(sql,"jack",5);
    }
    /*
     * 获取单个列的总数
     */
    @Test
    public void testQueryForObject2(){
        String sql="SELECT count(id) FROM employees";
        long count=jdbcTemplate.queryForObject(sql,Long.class);
        System.out.println(count);
    }

如何获取一条数据?应该要把它取出放在一个对象里面吧。

为了能取出数据,必须创建一个对象专门用来存放,

 1   //用来存放数据的类,一条数据就是一个对象
 2 public class Employee {
 3     private int id;
 4     private String lastName;
 5     private String email;
 6     private Template template;
 7     public int getId() {
 8         return id;
 9     }
10     public void setId(int id) {
11         this.id = id;
12     }
13     public String getLastName() {
14         return lastName;
15     }
16     public void setLastName(String lastName) {
17         this.lastName = lastName;
18     }
19     public String getEmail() {
20         return email;
21     }
22     public void setEmail(String email) {
23         this.email = email;
24     }
 1     /*从数据库获取一条记录,实际得到对应一个对象
 2      * 注意不是调用queryForObject(String sql, Class<Employee> requiredType,..)
 3      * 而是调用queryForObject(String sql, RowMapper<Employee> rowMapper)
 4      * 1.其中的RowMapper指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper
 5      * 2.使用sql中列的别名完成列名和类的属性名的映射,last_name lastName
 6      * 3.不支持级联映射,Employee类一个属性是一个对象,那这个对象不能被级联映射获取
 7      */
 8     @Test
 9     public void testQueryForObject(){
10         String sql="SELECT id,last_name lastName,email FROM employees WHERE id = ?";
11         RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);//完成一条数据和一个对象属性的映射
12         Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); //1是参数,就是id的参数
13     }

获取id大于5的所有数据

1     /*
2      * 查到实体类的集合
3      */
4     public void testQueryForList(){
5         String sql="SELECT id,last_name lastName,email FROM employees WHERE id > ?";
6         RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
7         List<Employee> employee=jdbcTemplate.query(sql, rowMapper,5);
8         System.out.println(employee);
9     }
 1     //批量处理
 2     //最后一个参数是Object[]的List类型,因为修改一条记录需要一个Object的数组,那么多条就需要多个Object的数组
 3     @Test
 4     public void testBatchUpdate(){
 5         String sql="INSERT INTO employees(last_name,email,dept_id) VALUES(?,?,?)";
 6         //使用数组集合
 7         List<Object[]> batchArgs=new ArrayList<>();
 8         batchArgs.add(new Object[]{"AA","[email protected]",1});//一条数据就是一个对象数组
 9         batchArgs.add(new Object[]{"BB","[email protected]",2});
10         batchArgs.add(new Object[]{"CC","[email protected]",3});
11         batchArgs.add(new Object[]{"DD","[email protected]",3});
12         batchArgs.add(new Object[]{"EE","[email protected]",2});
13         jdbcTemplate.update(sql,batchArgs);
14     }

2、NamedParameterJdbcTemplate--具名参数 ,可以给参数命名,不用像上面一样都是问号 "?"作参数。参数多了的话,更便于维护

 1     /*
 2      * 参数名要对应一个值,就要使用键值对。用HashMap
 3      */
 4     @Test
 5     public void testNamedParameterJdbcTemplate(){
 6         String sql="INSERT INTO employees(lase_name,email,dept_id) VALUES(:lastName,:email,:deptId)";
 7         Map<String,Object> paramMap=new HashMap<>();
 8         paramMap.put("lastName", "FF");
 9         paramMap.put("email", "[email protected]");
10         paramMap.put("deptId", 2);
11         namedParameterJdbcTemplate.update(sql, paramMap);
12     }

再看这个,也可以用对象存入。

 1     /*
 2      * 可以对参数命名,用对象传入
 3      */
 4     @Test
 5     public void testNamedParameterJdbcTemplate2(){
 6         String sql="INSERT INTO employees(lase_name,email,dept_id) VALUES(:lastName,:email,:deptId)";
 7         Employee employee=new Employee();
 8         employee.setLastName("SYZ");
 9         employee.setEmail("[email protected]");
10         employee.setId(3);
11         SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);//完成一条数据和一个对象属性的映射
12         namedParameterJdbcTemplate.update(sql, paramSource);
13     }
时间: 2024-11-10 17:33:48

Spring学习记录(十四)---JDBC基本操作的相关文章

Spring学习记录(十二)---AOP理解

Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 专业术语: Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spri

C++语言学习(十四)——C++类成员函数调用分析

C++语言学习(十四)--C++类成员函数调用分析 一.C++成员函数 1.C++成员函数的编译 C++中的函数在编译时会根据命名空间.类.参数签名等信息进行重新命名,形成新的函数名.函数重命名的过程通过一个特殊的Name Mangling(名字编码)算法来实现.Name Mangling算法是一种可逆的算法,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推导出原有函数名.Name Mangling算法可以确保新函数名的唯一性,只要命名空间.所属的类.参数签名等有一个不同,那么产生的

JavaScript学习总结(十四)——JavaScript编写类的扩展方法

在?J?a?v?a?S?c?r?i?p?t?中?可以使?用?类的p?r?o?t?o?t?y?p?e属性来?扩?展?类的属?性?和?方?法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性. 一.扩展JavaScript内置类,添加动态方法 语法格式: 类名.prototype.方法名 = function([param1],[param2],.

python学习记录第四篇--数据库

只要用到MySQLdb,使用时请先安装MySQLdb,百度上可以下载! #coding=utf-8'''@author: 使用python操作MySQL数据库'''import MySQLdb#import MySQLdb.cursorsconn=MySQLdb.connect(user='root',passwd='root') #connect共三个值,user,passwd,host,无密码且连接本地数据库时,可以都为空.cur=conn.cursor() #创建游标,使用游标进行数据库操

Swift学习笔记十四:构造(Initialization)

类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值.存储型属性的值不能处于一个未知的状态. 你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值.以下章节将详细介绍这两种方法. 注意: 当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property observers). 一.基本语法 class Human{ var name :String init(){ name = "human" } init(n

MVC+Ext.net零基础学习记录(四)

在上一篇文章[MVC+Ext.net零基础学习记录(三)]中提到了利用MVC的Area可以做到项目分离,但是实际操作起来还是有很多问题的.比如,对于物理资源的访问,会报:没有相关资源 开始的时候,我在博客园也搜索到了很多解决方案,其中http://www.cnblogs.com/dingji/archive/2012/06/10/2544255.html这篇文章的解决方法是我感觉最有效的解决方法 但是我思考了很久,还是决定不采用MvcContrib进行分离,因为这样的话,一个问题是,DLL文件到

laravel3学习笔记(十四)

原作者博客:ieqi.net ==================================================================================================== 运行时配置 在 Laravel3 中很多地方我们都可以看到“约定大于配置”的影子,我本人也很喜欢这种工程哲学尤其是在框架领域,当然这并不能代替所有的配置.我们知道 Laravel3 中,主要配置都写在 application/config 文件夹下,在应用逻辑中,往往

React官方文档学习记录(四)- 条件渲染

一点点记录,建议需要学习React的移步官方文档去学习. 在React中,你可以创建一个清晰(distinct)的组件来简要描述你现在需要的东西.然后,你只需要使用你应用中的state来渲染它们. React中的条件型渲染跟JavaScript中的条件运算符运行方式差不多.好像就是使用JavaScript中的if或者三元运算符创建元素来显示现在的状态,然后让React更新UI来匹配这些修改. 下面这个例子就是根据不同的isLoggedIn进行不同的欢迎. 1 2 3 4 5 6 7 8 9 10

webpack学习记录(十二)-区分不同环境

webpack学习记录(十二)-区分不同环境 定义全局变量 使用webpack内置的插件DefinePlugin 允许创建一个在编译时可以配置的全局常量. 用法 //在webpack.config.js中配置插件 new webpack.DefinePlugin({ PRODUCTION: JSON.stringify(true) }) //在index.js中使用定义的变量 if (!PRODUCTION) { console.log('Debug info') } if (PRODUCTIO