前言
基于Spring JdbcTemplate来实现用户的增删改查案例,以及NamedJdbcTemplate模版的优化案例,和Spring JDBC相关支持类使用。
基本案例实现
创建JavaWeb项目,使用JDBCTemplate对MySQL用户表进行增删改查操作。
第一步:创建JavaWeb项目,创建数据库表,配置pom.xml文件
t_user:
数据表如下:包括主键user_id,用户名user_name和用户密码password
(我设置了主键自增,忽略user_id不是顺序的,我对数据进行过增删)
JavaWeb项目:
演示工具idea2023
pom.xml:
导入相应的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
以上一部分依赖,本次未使用到,例如javax-servlet-api和aspectj相关依赖(这是我上个项目残留的依赖,全部导入不影响当前项目运行)
第二步:创建User实体类,配置spring.xml配置文件
User:
注意:将实体类的属性名和数据库中表的字段名设置相同,这样可以省略ORM映射的步骤(字段名和属性名一一对应的映射)
public class User implements Serializable {
private int user_id;
private String user_name;
private String password;
public int getUser_id() {
return user_id;
}
public void setUser_id(int 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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
spring.xml:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!--扫描包-->
<context:component-scan base-package="dao"/>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/csx_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="initialSize" value="100"/>
<property name="maxActive" value="200"/>
<!--<property name="maxIdle" value="10"/>-->
<property name="minIdle" value="5"/>
<property name="maxWait" value="3000"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
配置扫描包:目的是为了识别我们使用的spring注解
配置数据源:jdbc Template需要借助对应的数据源对象获取数据库连接
配置jdbcTemplate的bean:能够在DAO直接使用jdbcTemplate对象执行sql操作
第三步:创建UserDao和对应的实体类
UserDao:
public interface UserDao {
//查询所有用户
List<User> getAllUsers();
//根据条件查询用户
List<User> getUsersByCond(User user);
//根据id查询用户
User getUserById(int id);
//新增用户
int addUser(User user);
//删除用户
int deleteUser(int id);
//根据id修改用户
int updateUser(int id);
}
UserDaoJdbcTemplate:
@Component("userDaoTemp")
public class UserDaoJdbcTemplate implements UserDao {
public static final RowMapper rowMapper=new ParameterizedRowMapper<User>(){
@Override
public User mapRow(ResultSet rs, int i) throws SQLException {
User user =new User();
user.setUser_id(rs.getInt("user_id"));
user.setUser_name(rs.getString("user_name"));
user.setPassword(rs.getString("password"));
return user;
}
}
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Override
public List<User> getAllUsers() {
return null;
}
@Override
public List<User> getUsersByCond(User user) {
return null;
}
@Override
public User getUserById(int id) {
String sql="select * from t_user where user_id = ?";
List<User> list= jdbcTemplate.query(sql,rowMapper,id);
return list.size()>0?list.get(0):null;
}
@Override
public int addUser(User user) {
return 0;
}
@Override
public int deleteUser(int id) {
return 0;
}
@Override
public int updateUser(int id) {
return 0;
}
}
- 一个RowMapper对象,从ResultSet里提取数值并构造一个实体对象返回,在这里就是员工对象。
- 将其声明为公共静态的常量属性,便于所有方法中使用
@Resource(name = "jdbcTemplate") private JdbcTemplate jdbcTemplate;
- 将JdbcTemplate对象注入到当前类中使用
- 使用
jdbcTemplate.query()方法进行根据id查询用户的操作
第四步:书写测试类
UserTest:
public class UserTest {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
@Test
public void getUserTest(){
UserDaoJdbcTemplate dao= (UserDaoJdbcTemplate) ac.getBean("userDaoTemp");
User u= dao.getUserById(51);
System.out.println(u.getUser_name()+","+u.getPassword());
}
}
进阶增删改查
只演示新增和多条件查询,修改和删除操作类似
新增用户
public int addUser(User user) {
Object[] params={user.getUser_name(),user.getPassword()};
String sql="insert into t_user(user_name,password) values(?,?)";
return jdbcTemplate.update(sql,params);
}
将用户名和密码封装为Object类型的数组,作为参数传入jdbcTemplate的update方法中。
多条件查询
public List<User> getUsersByCond(User user) {
StringBuilder sbu =new StringBuilder("select * from t_user where 1=1 ");
List list=new ArrayList();
if (user!=null){
if (user.getUser_name()!=null && user.getUser_name().trim().length()>0){
//拼接sql
sbu.append("and user_name like ?");
//存参数
list.add("%"+user.getUser_name()+"%");
}
if (user.getPassword()!=null && user.getPassword().trim().length()>0){
//拼接sql
sbu.append("and password like ?");
//存参数
list.add("%"+user.getPassword()+"%");
}
}
Object[] params= list.toArray();
return jdbcTemplate.query(sbu.toString(),params,rowMapper);
}
使用StringBuilder进行字符串的拼接,判断user是否为null,若为,则查询所有用户数据,若不为,则再次进行条件判断,判断用户名和密码是否为null或空,如果不为null或空,则拼接条件
NamedJdbcTemplate
前言
NamedJdbcTemplate(更准确地说是NamedParameterJdbcTemplate)是Spring框架中提供的一个用于简化JDBC操作的模板类。它扩展了JdbcTemplate的功能,特别是在处理带有命名参数的SQL语句时提供了更大的灵活性和便利性。
简而言之,我们之前使用问号(?)占位符进行参数传值,如果参数数量较少还可以应对,如果参数过多,就会显得不方便阅读,NamedJdbcTemplate就是为了解决这类问题
基本案例实现
UserDaoNamedParam
spring.xml:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<context:component-scan base-package="dao"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/csx_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="initialSize" value="100"/>
<property name="maxActive" value="200"/>
<!--<property name="maxIdle" value="10"/>-->
<property name="minIdle" value="5"/>
<property name="maxWait" value="3000"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="namedParamTemp" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
</beans>
配置bean:
<bean id="namedParamTemp" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource"/> </bean>只能使用构造器注入数据源
新增用户
@Component("userDaoNamedParam")
public class UserDaoNamedParam implements UserDao {
@Resource(name = "namedParamTemp")
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Override
public List<User> getAllUsers() {
return null;
}
@Override
public List<User> getUsersByCond(User user) {
return null;
}
@Override
public User getUserById(int id) {
return null;
}
@Override
public int addUser(User user) {
Map<String ,Object> params=new HashMap<>();
params.put("uname",user.getUser_name());
params.put("upwd",user.getPassword());
String sql ="insert into t_user(user_name,password) values(:uname,:upwd)";
return namedParameterJdbcTemplate.update(sql,params);
}
@Override
public int deleteUser(int id) {
return 0;
}
@Override
public int updateUser(int id) {
return 0;
}
}
创建一个map集合,将用户名和密码存放进去,在sql中就可以将对应的?占位符替换成":map键名",注意名字要一一对应。
测试
@Test
public void namedAdd(){
UserDaoNamedParam userDaoNamed= (UserDaoNamedParam)
ac.getBean("userDaoNamedParam");
User u=new User();
u.setUser_name("发多少");
u.setPassword("333");
userDaoNamed.addUser(u);
}
标签:name,NamedJdbcTemplate,int,Spring,public,user,User,id,JdbcTemplate
From: https://blog.csdn.net/weixin_52937170/article/details/142761259