初见Spring之JDBC
Spring是具有重要的特性就是提供对了JDBC的支持,Spring对JDBC的支持简化了java中JDBC操作,降低的开发难度,本文主要介绍如何利用Spring完成数据库连接以及增删改查等操作。
一丶Spring JDBC的基本概述
Spring操作数据库的主要和两个类相关:
1.DriverManagerDataSource:主要管理和数据的连接,包括数据库驱动,目标数据库url,登录数据的用户名以及密码,这个类交由Spring管理,我们只需要在配置文件中配置这个对象即可。
2.JdbcTemplate:是操作数据的核心类,这个类依赖DriverManagerDataSource这个类,对外提供访问数据库的一系列方法,其中常用的包括如下:
(1)JdbcTemplate.update(Stringsql)可以完成对数据的增删改的操作
(2)JdbcTemplate.execute(Stringsql)执行sql代表的数据操作,通过用来建表,建库。
(3)JdbcTemplate.quertyForObject(Strigsql,RowMapper map,Object...)
这个函数用来完成对数据库的查询操作,其返回值是一个单个的对象。
(4)JdbcTemplate.query(String sql,RowMappermap,object...)
这个函数也是完成对数据的查询操作,其返回值不是单个对象,而是一个List集合,当查询对象结果有多个的时候采用这个方法。
二丶Spring JDBC的基本操作
下面利用一个增删改查的操作来介绍Spring JDBC的基本操作。
1.SpringJDBC配置文件书写,利用Spring JDBC操作数据库的时候,一定要在Spring的配置文件中配置DataSource和JdbcTemplate这两个Bean对象,配置文件内容如下:
<!-- 指定需要扫描的包,使注解生效 -->
<!-- 指定需要扫描的包,使注解生效 -->
<context:component-scan base-package="jdbc"/>
<!--AOP注解生效-->
<aop:aspectj-autoproxy />
<!-- 1配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName"value="com.mysql.jdbc.Driver" />
<!--连接数据库的url -->
<property name="url" value="jdbc:mysql://localhost:3306/spring"/>
<!--连接数据库的用户名 -->
<property name="username"value="root" />
<!--连接数据库的密码 -->
<property name="password"value="123456" />
</bean>
<!-- 2配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource"ref="dataSource" />
</bean>
<context:component-scan base-package="jdbc"/>
<!--AOP注解生效-->
<aop:aspectj-autoproxy />
<!-- 1配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName"value="com.mysql.jdbc.Driver" />
<!--连接数据库的url -->
<property name="url" value="jdbc:mysql://localhost:3306/spring"/>
<!--连接数据库的用户名 -->
<property name="username"value="root" />
<!--连接数据库的密码 -->
<property name="password"value="123456" />
</bean>
<!-- 2配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource"ref="dataSource" />
</bean>
2.User对象设计,这里一定需要特别注意,在将设计实体类的时候,必须要给属性值提供get和set方法并且提供不带参数的构造函数,否则Spring JDBC在返回查询的实体对象的时候会报错。
publicclass User {
publicString name;
publicint age;
publicUser(String name,int age){
this.name= name;
this.age= age;
}
publicUser(){
}
publicString getName() {
returnname;
}
publicvoid setName(String name) {
this.name= name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age= age;
}
}
3.UserDaoImple的设计:
@Repository("userDao")
public class userDaoImpl implements userDao{
@Resource(name="jdbcTemplate")
publicJdbcTemplate JdbcTemplate;
@Override
publicint insert(User user) {
// TODO Auto-generated method stub
String sql = "insert intouser(name,age) value(?,?)";
intresult= JdbcTemplate.update(sql,user.name,user.age);
returnresult;
}
@Override
publicint deleteByName(String name) {
// TODO Auto-generated method stub
String sql = "delete from user wherename=?";
returnJdbcTemplate.update(sql,name);
}
@Override
publicint updataByName(User user) {
// TODO Auto-generated method stub
String sql = "update user set age=?where name=?";
returnJdbcTemplate.update(sql,user.age,user.name);
}
@Override
publicUser queryByName(String name) {
// TODO Auto-generated method stub
String sql = "select * from userwhere name=?";
RowMapper<User> rowMapper = newBeanPropertyRowMapper<User>(User.class);
returnJdbcTemplate.queryForObject(sql,rowMapper,name);
}
@Override
publicList<User> queryAll() {
// TODO Auto-generated method stub
String sql = "select * fromuser";
RowMapper<User> rowMapper = newBeanPropertyRowMapper<User>(User.class);
returnJdbcTemplate.query(sql,rowMapper);
}
@Test
@Override
publicvoid createUserTable() {
// TODO Auto-generated method stub
String sql = "create tableuser("+
"id int primary keyauto_increment,"+
"name char(50),"+
"age int)";
//指向一条建标语句
JdbcTemplate.execute(sql);
}
}
4.测试代码设计,在这个测试代码中加入了Junit4这个单元测试框架。
public class MainJDBC {
@Test
publicvoid mainTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userDao =(userDao) context.getBean("userDao");
userDao.createUserTable();
}
@Test
publicvoid insertTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userDao =(userDao) context.getBean("userDao");
User user = new User("jason2", 22);
userDao.insert(user);
}
@Test
publicvoid deleteTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userDao =(userDao) context.getBean("userDao");
User user = new User("jason", 22);
userDao.deleteByName("jason");
}
@Test
publicvoid updateTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userDao =(userDao) context.getBean("userDao");
User user = new User("jason", 100);
userDao.updataByName(user);
}
@Test
publicvoid queryTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userDao =(userDao) context.getBean("userDao");
User user = userDao.queryByName("jason1");
System.out.println("name="+user.name+"age="+user.age);
}
@Test
publicvoid queryAllTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userDao =(userDao) context.getBean("userDao");
List<User> userList =userDao.queryAll();
for(int i =0;i<userList.size();i++){
System.out.println("name ="+userList.get(i).name+"age="+userList.get(i).age);
}
}
}