Spring學習筆記(十三)JdbcTemplate工具類的使用
阿新 • • 發佈:2018-12-31
JdbcTemplate就是Spring框架給我們封裝好的簡單對資料庫操作的工具類,返回Map資料,返回List_Map資料,返回一個值,返回一個物件,返回一個List<物件>,新增修改刪除
1.介紹JdbcTemplate工具類
Spring是一個IoC和AOP的容器框架,並且它是一站式開源框架ORM是我們學過的MyBatis,JdbcTemplate就是Spring框架給我們封裝好的簡單對資料庫操作的工具類,需要這個spring-jdbc.jar
2.sql檔案
SET FOREIGN_KEY_CHECKS=0;
------
-- Table structure for oa_user
------
DROP TABLE IF EXISTS `oa_user`;
CREATE TABLE `oa_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`money` decimal(7,2) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;
------
-- Records of oa_user
------
INSERT INTO `oa_user` VALUES ('1', '悟空', '男', '888.00', null);
INSERT INTO `oa_user` VALUES ('2', '八戒', '男', '999.00', null);
INSERT INTO `oa_user` VALUES ('3', '天蓬元帥', '女', '1000.00', null);
INSERT INTO `oa_user` VALUES ('4', '悟能', '男', '666.00' , null);
INSERT INTO `oa_user` VALUES ('5', '法悟法', '女', '544.00', null);
INSERT INTO `oa_user` VALUES ('6', '悟', '女', '562.00', null);
INSERT INTO `oa_user` VALUES ('7', '悟', '女', '562.00', null);
INSERT INTO `oa_user` VALUES ('14', '嫦娥', '女', '1213.00', null);
INSERT INTO `oa_user` VALUES ('15', '月兔', '女', '2113.00', null);
INSERT INTO `oa_user` VALUES ('16', '和尚', '男', '455.00', '2018-08-05');
INSERT INTO `oa_user` VALUES ('18', '沙僧', '男', '455.00', '2018-08-05');
INSERT INTO `oa_user` VALUES ('19', '唐僧', '男', '220.00', '2018-08-09');
INSERT INTO `oa_user` VALUES ('20', '唐僧', '男', '220.00', '2018-08-09');
------
-- Table structure for skill
------
DROP TABLE IF EXISTS `skill`;
CREATE TABLE `skill` (
`skill_id` int(11) NOT NULL AUTO_INCREMENT,
`skill_name` varchar(255) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`fk_teacher_id` int(11) DEFAULT NULL,
PRIMARY KEY (`skill_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
------
-- Records of skill
------
INSERT INTO `skill` VALUES ('2', 'JS', '75', null);
INSERT INTO `skill` VALUES ('7', 'CSS', '66', null);
INSERT INTO `skill` VALUES ('8', 'java', '66', null);
INSERT INTO `skill` VALUES ('9', 'vue', '56', '9999');
------
-- Table structure for sys_role
------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`role_id` int(11) NOT NULL AUTO_INCREMENT,
`role_name` varchar(32) DEFAULT NULL,
`role_key` varchar(32) DEFAULT NULL,
`status` int(1) DEFAULT '1' COMMENT '1可用 -1禁用',
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
------
-- Records of sys_role
------
INSERT INTO `sys_role` VALUES ('-100', '超級管理員', 'ADMIN', '1');
------
-- Table structure for sys_user
------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`account` varchar(32) NOT NULL,
`password` varchar(128) NOT NULL,
`user_name` varchar(32) DEFAULT '',
`status` int(1) NOT NULL DEFAULT '1' COMMENT '1可用 -1刪除 2禁用',
`login_time` datetime DEFAULT CURRENT_TIMESTAMP,
`ip` varchar(128) DEFAULT NULL,
`fk_role_id` int(11) DEFAULT NULL,
PRIMARY KEY (`user_id`),
KEY `fk_role_id` (`fk_role_id`),
CONSTRAINT `sys_user_ibfk_1` FOREIGN KEY (`fk_role_id`) REFERENCES `sys_role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
------
-- Records of sys_user
------
INSERT INTO `sys_user` VALUES ('-999', 'super', 'super', '唐僧', '1', '2018-07-28 18:47:39', null, '-100');
INSERT INTO `sys_user` VALUES ('-888', 'admin', 'admin', '悟空', '1', '2018-07-03 18:48:21', null, '-100');
3.例項化該工具類
<bean class="org.springframework.jdbc.core.JdbcTemplate" >
<property name="dataSource" 賦值/>
------
</bean>
4.配置資料來源
資料來源就是連線資料,而以後工作當中我們推薦使用“連線池”,
什麼是連線池?
我的理解為預先建立好一堆Connection,使用時候從池中獲取,不適應不是銷燬而是把連線再次放回到池中
連線池的工作原理?
Java程式碼如何實現–>Map/List 存Connection
開源的連線池有哪些?
C3p0、dbcp、德魯伊druid(阿里巴巴的)
<!-- destroy-method="close"銷燬的方法-->
<!--4.配置資料來源-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/cy42_mss"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--5.配置工具類JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--setter注入方式-->
<property name="dataSource" ref="druidDataSource"/>
<!--建構函式賦值-->
<!--<constructor-arg name="dataSource" ref="druidDataSource"/>-->
</bean>
5.User.java
package com.hs.model;
import java.math.BigDecimal;
import java.util.Date;
public class User {
private Integer user_id;
private String user_name;
private String sex;
//錢用BigDecimal
private BigDecimal money;
private Date birthday;
public BigDecimal getMoney() {
return money;
}
public void setMoney(BigDecimal money) {
this.money = money;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"user_id=" + user_id +
", user_name='" + user_name + '\'' +
", sex='" + sex + '\'' +
", money=" + money +
", birthday=" + birthday +
'}';
}
}
6.查詢操作(預處理)
1.返回Map資料
package com.hs.test;
import com.hs.model.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class JdbcTemplateTest {
private ApplicationContext ac;
private JdbcTemplate jdbcTemplate;
@Before
public void init() {
ac = new ClassPathXmlApplicationContext("beans.xml");
jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
}
/**
* 返回Map資料
*/
@Test
public void test01() {
/*String sql = "select * from oa_user where user_id = 3";
Map<String, Object> map = this.jdbcTemplate.queryForMap(sql);*/
String sql = "select * from oa_user where user_id = ?";
Map<String, Object> map = jdbcTemplate.queryForMap(sql, 2);
System.out.println(map);
}
}
2.返回List_Map資料
/**
* 返回List_Map資料
*/
@Test
public void test02() {
String sql = "select * from oa_user";
System.out.println(jdbcTemplate.queryForList(sql));
}
3.返回一個值
/**
* 返回一個值
*/
@Test
public void test03() {
String sql = "select count(*) from oa_user";
System.out.println(jdbcTemplate.queryForObject(sql, Integer.class));
}
4.返回一個物件
/**
* 返回一個物件
*/
@Test
public void test04() {
String sql = "select * from oa_user where user_id = ?";
User user = jdbcTemplate.queryForObject(sql, /*匿名內部類*/new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setUser_id(rs.getInt("user_id"));
user.setUser_name(rs.getString("User_name"));
user.setSex(rs.getString("sex"));
user.setMoney(rs.getBigDecimal("money"));
user.setBirthday((Date) rs.getObject("birthday"));
return user;
}
}, 2);
System.out.println(user);
}
5.返回一個List<物件>
/**
* 返回一個List<物件>
*/
@Test
public void test05() {
String sql = "select * from oa_user where user_name like concat('%',?,'%')";
List<User> userList = jdbcTemplate.query(sql,/*處理一條一條的資料*/new UserRowMapper(), "沙僧");
System.out.println(userList);
}
把匿名內部類提出來
/**
* 對於外面那個類來說,這是一個內部類,外面那個類對於這個類來說,是外部類
* 百度什麼是內部類和特種?
* private使這個類只能被這個類使用
*/
private class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
System.out.println("---------");
User user = new User();
user.setUser_id(rs.getInt("user_id"));
user.setUser_name(rs.getString("User_name"));
user.setSex(rs.getString("sex"));
user.setMoney(rs.getBigDecimal("money"));
user.setBirthday((Date) rs.getObject("birthday"));
return user;
}
}
6.返回一個List<物件>——自動對映,類屬性和查詢的欄位名字一樣
/**
* 返回一個List<物件>——自動對映,類屬性和查詢的欄位名字一樣
*/
@Test
public void test06() {
String sql = "select * from oa_user where user_name like concat('%',?,'%')";
List<User> userList = jdbcTemplate.query(sql,/*處理一條一條的資料,,,<User>可以不用寫*/new BeanPropertyRowMapper<User>(User.class), "沙僧");
System.out.println(userList);
}
7.新增修改刪除
/**
* 新增修改刪除
*/
@Test
public void test07() {
String sql1 = "insert into oa_user(user_name,sex,money,birthday) values(?,?,?,?)";
String sql2 = "update oa_user set user_name=?,sex=? where user_id = ?";
String sql3 = "delete from oa_user where user_id = ?";
int num1 = jdbcTemplate.update(sql1, "唐僧", "男", 220.00, "2018-8-9");
int num2 = jdbcTemplate.update(sql2, "和尚", "男", 16);
int num3 = jdbcTemplate.update(sql3, 17);
System.out.println(num1+"--"+num2+"---"+num3);
}