4.Spring的数据库开发
JDBC是Spring数据集成/访问的重要模块
4.1Spring JDBC
Spring 的 JDBC模块负责数据库资源管理和错误处理,简化开发人员对数据库的操作。
4.1.1Spring JdbcTemplate 的解析
JdbcTemplate类是Spring JdBC的核心类,该类继承抽象类JdbcAccessor,实现JdbcOperations接口。
抽象类JdbcAccessor中,包含访问数据库的公共属性,主要用于数据库的连接和转译工作
JdbcOperations接口定义了JdbcTemplate类中可以操作的集合包括增删改查。
4.1.2Spring JDBC的配置
Spring JDBC模块主要由4个包组成,分别是core(核心包),daraSource(数据源包),object(对象包),support(支持包)
jdbc配置的模板
需要在xml文件中定义三个bean实例,分别是datasource,jdbcTemplate和需要注入类的bean,分别负责数据源配置,将数据源注入到 jdbctemplate,然后将其注入具体的类。
<!-- 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="root" />
</bean>
<!-- 2配置JDBC模板 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--定义id为accountDao的Bean-->
<bean id="accountDao" class="com.itheima.jdbc.AccountDaoImpl">
<!-- 将jdbcTemplate注入到accountDao实例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
4.2Spring JdbcTemplate 的常用方法
4.2.1execute()
这个方法可以执行sql语句,首先执行一个创建表的操作,先引入相应的jar包,然后根据配置文件的模板修改配置文件,这里使用mysql数据库,并且已经创建了spring数据库,这里的配置文件也做出了一定的修改,这里没有使用实体注入类,而且连接数据库的url和数据库驱动由于采用模板的值会报错错误,也根据网上的教程做出了修改。
<!-- 1配置数据源 -->
<bean id="dataSource" class=
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<!--连接数据库的url -->
<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC" />
<!--连接数据库的用户名 -->
<property name="username" value="root" />
<!--连接数据库的密码 -->
<property name="password" value="1234" />
</bean>
<!-- 2配置JDBC模板 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
编写创建表的测试类
获取jdbcTemplate实例,调用execute方法,将创建表的sql语句作为参数填入。
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
String sql = "CREATE TABLE `account` (\n" +
" `id` int(11) NOT NULL,\n" +
" `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,\n" +
" `balance` double(255, 0) DEFAULT NULL,\n" +
" PRIMARY KEY (`id`) USING BTREE\n" +
") ";
jdTemplate.execute(sql);
System.out.println("创建成功 ");
}
运行结果如图
4.2.2update()
update方法可以实现增删改操作。下面分别定义用户实体类,操作接口和操作类。
定义实体类,实现接口
package com.itheima.jdbc;
public class Account {
private Integer id;
private String username;
private Double balance;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [id=" + id + ", username=" + username + ", balance=" + balance + "]";
}
}
接口及其实现类
public interface AccountDao {
public int addAccount(Account account);
public int deleteAccount(int id);
public int updateAccount(Account account);
}
public class AccountDaoImpl implements AccountDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate= jdbcTemplate;
}
public int addAccount(Account account) {
String sql = "insert into account(username,balance) value(?,?)";
Object[] obj = new Object[]{
account.getUsername(),
account.getBalance()
};
int num = this.jdbcTemplate.update(sql,obj);
return num;
}
public int deleteAccount(int id) {
// TODO Auto-generated method stub
String sql = "delete from account where id = ?";
int num = this.jdbcTemplate.update(sql,id);
return num;
}
public int updateAccount(Account account) {
// TODO Auto-generated method stub
String sql = "update account set username = ?,balance = ? where id = ?";
Object[] params = new Object[]{
account.getUsername(),
account.getBalance(),
account.getId()
// "大魔王",12.5,1
};
int num = this.jdbcTemplate.update(sql,params);
return num;
}
}
测试方法,这里采用了junit4测试
package com.itheima.jdbc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateTest {
// @Test
// public void mainTest( ) {
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// JdbcTemplate jdTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
// String sql = "CREATE TABLE `account` (\n" +
// " `id` int(11) auto_increment NOT NULL,\n" +
// " `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,\n" +
// " `balance` double(255, 0) DEFAULT NULL,\n" +
// " PRIMARY KEY (`id`) USING BTREE\n" +
// ") ";
// jdTemplate.execute(sql);
// System.out.println("创建成功 ");
// }
// @Test
// public void addAcc( ) {
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// AccountDao accountDao = (AccountDao)applicationContext.getBean("accountDao");
// Account account1 = new Account();
// account1.setId(15);
// account1.setUsername("张伟隆");
// account1.setBalance(100.0);
// int num = accountDao.addAccount(account1);
// if (num>0) {
// System.out.println("添加成功 "+num);
// }
// else
// System.out.println("插入失败");
// }
// @Test
// public void updateacc(){
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// AccountDao accountDao = (AccountDao)applicationContext.getBean("accountDao");
// Account account2 = new Account();
// account2.setId(1);
// account2.setUsername("小魔王");
// account2.setBalance(50.0);
// int num = accountDao.updateAccount(account2);
// if (num>0){
// System.out.println("更新成功");
// }else {
// System.out.println("失败");
// }
// }
@Test
public void deleteAcc(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountDao accountDao = (AccountDao)applicationContext.getBean("accountDao");
int num = accountDao.deleteAccount(1);
if (num>0){
System.out.println("删除成功");
}else {
System.out.println("失败");
}
}
}
4.2.3query()
该方法用于查询,这里定义两个方法,一个用于根据id查询,一个查询所有
首先在接口中定义方法,然后在UserDaoImpl中给出具体实现
public Account findByAccount(int id);
public List<Account> findAll();
//实现
@Override
public Account findByAccount(int id) {
// TODO Auto-generated method stub
String sql = "select * from account where id = ?";
org.springframework.jdbc.core.RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
return this.jdbcTemplate.queryForObject(sql, rowMapper,id);
}
@Override
public List<Account> findAll() {
// TODO Auto-generated method stub
String sql = "select * from account";
org.springframework.jdbc.core.RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
return this.jdbcTemplate.query(sql, rowMapper);
}
编写测试结果