Spring JdbcTemplate 學習筆記
阿新 • • 發佈:2021-03-28
基本概念
- Spring框架對JDBC進行封裝,使用JdbcTemplate方便實現對資料庫操作
準備工作
- 匯入依賴
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </
- 名稱空間
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">
- spring配置檔案配置資料庫連線池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url"> <value> <![CDATA[jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&rewriteBatchedStatements=true]]></value> </property> <property name="username" value="root"/> <property name="password" value="root"/> </bean>
- 配置JdbcTemplate物件,注入DataSource
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>
- 開啟元件掃描
<context:component-scan base-package="com.du.spring"/>
- 檔案結構
- pojo/bean
@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String username; private String phone; }
- 編寫Dao和Service
public interface UserDao { int addUser(User user); }
// 一般用於持久層(DAO) @Repository public class UserDaoImpl implements UserDao { @Autowired JdbcTemplate jdbcTemplate; // 自動裝配 @Override public int addUser(User user) { String sql = "insert into user_info(username, phone) values(?,?);"; return jdbcTemplate.update(sql, user.getUsername(), user.getPhone()); } }
public interface UserService { int addUser(User user); }
// 一般用Service建立物件 @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDaoImpl; @Override public int addUser(User user) { return userDaoImpl.addUser(user); } }
- 測試類
public class Demo { private static final Logger logger = Logger.getLogger(Demo.class); @Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userServiceImpl = context.getBean("userServiceImpl", UserServiceImpl.class); int res = userServiceImpl.addUser(new User("jhon", "1434314")); if (res > 0) logger.info("新增成功"); else logger.info("新增失敗"); } }
CRUD
- 查詢返回某個值
@Override public int countUser() { String sql = "select count(*) from user_info"; Integer res = jdbcTemplate.queryForObject(sql, Integer.class); if (res != null) return res; throw new RuntimeException("查不到"); }
- 查詢某個物件
@Override public User selectUserById(int id) { String sql = "select * from user_info where id = ?"; User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id); if (user != null) return user; throw new RuntimeException("查不到"); }
RowMapper
是介面,針對返回不同型別資料,使用這個接口裡面實現類完成資料封裝 - 查詢一個集合包含多個物件
@Override public List<User> selectUsers() { String sql = "select id, username, phone from user_info"; // RowMapper 是介面,針對返回不同型別資料,使用這個接口裡面實現類完成資料封裝 return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); }
RowMapper
是介面,針對返回不同型別資料,使用這個接口裡面實現類完成資料封裝 - 刪除
@Override public int deleteUserById(int id) { String sql = "delete from user_info where id = ?"; return jdbcTemplate.update(sql, id); }
- 更新
@Override public int updateUser(User user) { String sql = "update user_info set username = ?, phone = ? where id = ?;"; return jdbcTemplate.update(sql, user.getUsername(), user.getPhone(), user.getId()); }
批量操作
- 批量操作:操作表裡面多條記錄
- 批量增加
@Override public void batchAddUsers(List<Object[]> batchArgs) { String sql = "insert into user_info(username, phone) values(?,?);"; // 批量執行sql,並傳入多個數組組成的引數 int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); System.out.println(Arrays.toString(ints)); }
@Test public void batchAddUsersTest() { List<Object[]> batchArgs = new ArrayList<>(); Object[] o1 = {"nihao", "458785"}; Object[] o2 = {"shijie", "458785"}; batchArgs.add(o1); batchArgs.add(o2); userServiceImpl.batchAddUsers(batchArgs); }
- 批量更新
@Override public void batchUpdateUsers(List<Object[]> batchArgs) { String sql = "update user_info set username = ?, phone = ? where id = ?;"; // 批量執行sql,並傳入多個數組組成的引數 int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); System.out.println(Arrays.toString(ints)); }
@Test public void batchUpdateUsersTest() { List<Object[]> batchArgs = new ArrayList<>(); Object[] o1 = {"nihao", "458785", 5}; Object[] o2 = {"shijie", "458785", 6}; batchArgs.add(o1); batchArgs.add(o2); userServiceImpl.batchUpdateUsers(batchArgs); }
- 批量刪除
@Override public void batchDeleteUsers(List<Object[]> batchArgs) { String sql = "delete from user_info where id = ?"; // 批量執行sql,並傳入多個數組組成的引數 int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); System.out.println(Arrays.toString(ints)); }
@Test public void batchDeleteUsersTest() { List<Object[]> batchArgs = new ArrayList<>(); Object[] o1 = {5}; Object[] o2 = {6}; batchArgs.add(o1); batchArgs.add(o2); userServiceImpl.batchDeleteUsers(batchArgs); }