Spring整合JDBC
首先Spring框架中提供了一个可以操作数据库的对象,这个对象翻转过来JDBC的细节,提供了一套模板,这个模板类就是JdbcTemplate 该类在Spring-jdbc jar包中.
就是说我们可以使用这个然后就可以不用取使用jdbc了
接下来就是如何使用这个JdbcTemplate的步骤
1.首先是要在pom.xml中到ar包 没有这些包你是没办法完成接下来的操作的
<dependencies>
<!--Spring核心jar包,使用Spring就必须导入这个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--jdbc的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--数据库驱动jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<!--连接池jar包(C3P0连接池)-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--德鲁伊连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.2</version>
</dependency>
<!--spring-test测试包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--junit测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
</dependencies>
2.准备数据库 user表,给你一个截图,自己对照着写一个数据库表吧
插入:先把建包的样子发给你们看一哈,然后接着说,
3.书写dao层接口,因为我们的抽象方法都是在dao层的哦,所以要先写一个dao层的接口
// dao接口
public interface UserDao {
// 添加用户
void addUser(User user);
// 删除用户 根据id值
void deleteUserById(int uid);
// 修改用户信息 根据id值
void updateUserById(User user);
// 查询所有用户
List<User> queryAllUsers();
// 查询单个用户 根据id值
User queryUserById(int uid);
// 分页+模糊查询
List<User> queryFuzzyUserByUsername(String u_name,int beginIndex);
// 查询总记录值
int queryUserCount();
4.先来看看我们主配置文件里面的信息和配置
<!--组件扫描:目的就是一下吧com.zhiyou100这个包里面的所有类也接口对象全部扫描进来,就可以不用一个一个的去bean对象了-->
<context:component-scan base-package="com.zhiyou100"/>
<!--content:property 这个是需要强写的在Spring内存之中引入文件格式-->
<!--引入db.properties文件到Spring容器-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置数据源-->
<!--采用数据库连接池 C3p0 依赖于数据源DataSource ComboPooledDataSource -->
<!--把ComboPooledDataSource该对象注入到Spring的容器中-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!--引入对象并取别名为dataSource-->
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置JdbcTemplate对象-->
<!--该对象也依赖于数据源DataSource-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--属性注入 采用set方式-->
<property name="dataSource" ref="dataSource"/>
<!-- <constructor-arg -->
</bean>
下面是里面会用到的文件db.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/db_spring?characterEncoding=UTF-8
jdbc.user=root
jdbc.password=root```
5.写dao层接口的实现类,并写增删改查的方法,因为接口里面的方法没有方法体,所以写实现类来实现他们需要的方法实现
注意在jdbcTemplate对象里面 增删改都是用方法update 只有查询才使用query 如果查询的事单个数据就使用方法 queryForObject 如果查询的是一个集合就使用方法 query
@Repository("userDao")//该注解的目的就是把该对象交给Spring内存,这样就能在内存中找到该对象并使用它
public class UserDaoImpl implements UserDao {
@Autowired //前提是Spring容器含有该对象,我们之前已经吧对象存到内存空间里面了,在执着配置文件里面
private JdbcTemplate jdbcTemplate;
// 对于数据库来说 增删改 都是更新
@Override
public void addUser(User user) {
// 添加用户
int num = jdbcTemplate.update("insert into user values(null,?,?,?)", user.getU_name(), user.getU_age(), user.getU_salary());
if (num > 0) {
System.out.println("数据添加成功!");
} else {
System.out.println("数据添加失败!");
}
}
@Override
public void deleteUserById(int uid) {
int num = jdbcTemplate.update("delete from user where u_id = ?", uid);
if (num > 0) {
System.out.println("数据删除成功!");
} else {
System.out.println("数据删除失败!");
}
}
// 更新用户名和年龄
@Override
public void updateUserById(User user) {
int num = jdbcTemplate.update("update user set u_name = ?,u_age = ? where u_id = ?", user.getU_name(), user.getU_age(), user.getU_id());
if (num > 0) {
System.out.println("数据更新成功!");
} else {
System.out.println("数据更新失败");
}
}
@Override
public List<User> queryAllUsers() {
List<User> users = null;
try {
// BeanPropertyRowMapper 装配多条记录
users = jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));
} catch (Exception e) {
e.printStackTrace();
}
return users;
}
@Override
public User queryUserById(int uid) {
// 根据用户id值查询一条记录 queryForObject方法
User user = null;
try {
user = jdbcTemplate.queryForObject("select * from user where u_id = ?", new BeanPropertyRowMapper<>(User.class), uid);
}catch (Exception e) {
e.printStackTrace();
}
return user;
}
// 分页+模糊查询
@Override
public List<User> queryFuzzyUserByUsername(String u_name, int beginIndex) {
List<User> users = null;
try {
users = jdbcTemplate.query("select * from user where u_name like '%' ? '%' limit ?,3", new BeanPropertyRowMapper<>(User.class),u_name,beginIndex);
}catch (Exception e){
e.printStackTrace();
}
return users;
}
@Override
public int queryUserCount() {
// 需要返回一个数值 queryForObject 后面传入Integer.class字节码对象
int count = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
return count;
}
6.最后junit的单元测试
@RunWith(SpringJUnit4ClassRunner.class)//目的是让我们的测试类运行与Spring内存之后,
@ContextConfiguration("classpath:applicationContext.xml")//这一步是为了读取主配置文件中的数据,读取之后就能得到里面的数据在测试后的时候能使用
public class JdbcTemplateTest {
// 进行dao接口的属性注入
@Autowired //因为只有一个单独的userDao对象所以能够直接使用 @Autowired从spring内存中读取对象并注入
private UserDao userDao;
@Autowired
private User user;// 此时user值就从容器注入进来
/**
* 测试 查询总记录值
*/
@Test
public void testQueryCount() {
int count = userDao.queryUserCount();
System.out.println(count);// 9
}
/**
* 测试 分页+模糊查询
*/
@Test
public void testQueryFuzzyUserByUsername() {
List<User> users = userDao.queryFuzzyUserByUsername("小", 0);
for (User user1 : users) {
System.out.println(user1);
}
}
/**
* 测试 queryUserById
*/
@Test
public void testQueryUserById() {
// 周八 id值为 7
User user = userDao.queryUserById(7);
System.out.println(user);//User{u_id=7, u_name='周八', u_age=29, u_salary=6000.0}
}
/**
* 测试 queryAllUsers
*/
@Test
public void testQueryALllUsers(){
List<User> users = userDao.queryAllUsers();
for (User user1 : users) {
System.out.println(user1);
}
}
/**
* 测试 deleteUser
*/
@Test
public void testDeleteUser() {
userDao.deleteUserById(11);// 数据删除成功!
}
/**
* 测试 updateUser
*/
@Test
public void testUpdateUser() {
// 更新用户名字和年龄 根据id值 --->把小孙的信息更改为小强的信息
User user = new User();
user.setU_age(40);
user.setU_name("小强");
user.setU_id(11);
userDao.updateUserById(user);// 数据更新成功!
}
/**
* 测试 addUser
*/
@Test
public void testAddUser(){
userDao.addUser(user);
}
}