spring-第三章-jdbc

一,回顾

aop:面向切面编程,就是将一些和主业务流程没有关系的公共代码,提取封装到切面类,通过切入点规则,可以对目标方法进行功能增强;也就是可以再目标方法执行的前后添加一段额外逻辑代码;

二,JdbcTemplate模板类

spring框架对数据库的操作在jdbc基础上做了封装,使用spring依赖注入功能,可以吧DataSource(数据源,链接地址,账号,密码,驱动类)注入给JdbcTemplate模板类中,然后就可以使用JdbcTemplate工具类对数据表进行增删改查操作

1、数据库和表

create table userInfo(
    id int not null primary key auto_increment,
    no char(4) not null unique,
    name varchar(20) not null,
    pwd varchar(20) not null,
    sex int not null,
    age int not null
)
insert into userInfo values(0,'U001','小明','123456',1,20);
insert into userInfo values(0,'U002','小红','123456',0,18);
insert into userInfo values(0,'U003','小方','123456',1,21);

2、添加依赖

<!-- spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <scope>provided</scope>
        </dependency>
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

3、配置数据源DataSource

(1)在src目录中新建jdbc.properties配置文件

jdbc.url=jdbc:mysql://127.0.0.1:3306/spring-test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

(2)在spring.xml中引用资源配置文件

<!-- 引用配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

(3)在spring.xml中配置数据源以及使用配置文件中的key

<!-- 数据源配置 :配置连接地址、账号、密码;下面的url、username、password属性来自于DriverManagerDataSource的父类AbstractDriverBasedDataSource-->
    <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

4、注册JdbcTemlate模板工具类

在spring.xml中配置工具类

<!-- 注册jdbcTemplate工具类实例    dataSource属性就是数据源-->
    <bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource1"></property>
    </bean>

5、UserInfo实体类

@Data
public class UserInfo {
    private Integer id;
    private String no;
    private String name;
    private String pwd;
    private Integer sex;
    private Integer age;
}

6、UserInfoDao接口

public interface UserInfoDao {
    //添加
    void add(UserInfo user);
}

7、UserInfoDaoImpl实现类

@Data
public class UserInfoDaoImpl implements UserInfoDao {

    //工具类
    private JdbcTemplate jdbcTemplate;
    
    @Override
    public void add(UserInfo user) {
        //update()可以执行增删改,后面的参数可以可变类型,依次为SQL语句中的?赋值
        String sql = "insert into userInfo values(0,?,?,?,?,?)";
        jdbcTemplate.update(sql, user.getNo(),user.getName(),user.getPwd(),user.getSex(),user.getAge());
    }

}

这里的jdbcTemplate属性,必须有set和get方法,否则spring不能正常给它注入实例

8、注册UserInfoDaoImpl实例

在spring.xml中注册

<bean id="userInfoDaoImpl" class="com.yujun.maven.dao.impl.UserInfoDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate1"></property>
</bean>

注意的是需要给UserInfoDaoImpl类注入jdbcTemlate的实例

9、添加

public class Demo1 {

    public static void main(String[] args) {
        //context上下文对象(spring容器)
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class);
        
        
        UserInfo user = new UserInfo();
        user.setAge(20);
        user.setName("明明");
        user.setNo("U004");
        user.setPwd("123456");
        user.setSex(0);
        
        dao.add(user);
        System.out.println("over...");
    }

}

10、修改

(1)UserInfoDao接口中添加方法

//修改
    void update(UserInfo user);

(2)UserInfoDaoImpl实现类中重写方法

@Override
    public void update(UserInfo user) {
        String sql = "update userinfo set no=?,name=?,pwd=?,sex=?,age=? where id=?";
        jdbcTemplate.update(sql, user.getNo(),user.getName(),user.getPwd(),user.getSex(),user.getAge(),user.getId());
    }

(3)测试

public static void main(String[] args) {
        //context上下文对象(spring容器)
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class);
        
        UserInfo user = new UserInfo();
        user.setId(5);
        user.setAge(22);
        user.setName("明明5");
        user.setNo("U005");
        user.setPwd("654321");
        user.setSex(1);
        
        dao.update(user);
        System.out.println("over...");
    }

11、删除

(1)UserInfoDao接口中添加方法

//删除
    void delete(Integer id);

(2)UserInfoDaoImpl实现类中重写方法

@Override
    public void delete(Integer id) {
        String sql = "delete from userInfo where id=?";
        jdbcTemplate.update(sql, id);
    }

(3)测试

public static void main(String[] args) {
        //context上下文对象(spring容器)
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class);
        
        dao.delete(5);
        System.out.println("over...");
    }

三、JdbcTemplate模板类-查询

1、查询单个结果

查询userinfo表中的记录数(count(*))

(1)UserInfoDao接口添加方法

//查询count(*)
    int queryCount();

(2)UserInfoDaoImpl实现类重写方法

@Override
    public int queryCount() {
        String sql = "select count(*) from userInfo";
        Integer count = jdbcTemplate.queryForObject(sql, int.class);
        return count;
    }

(3)测试

public static void main(String[] args) {
        //context上下文对象(spring容器)
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class);
        
        int count = dao.queryCount();
        System.out.println("总记录数:"+count);
        System.out.println("over...");
    }

2、查询单一实体对象

根据用户的ID查询出唯一的用户实体数据

(1)UserInfoDao接口添加方法

//根据ID查询唯一数据
    UserInfo queryById(Integer id);

(2)UserInfoDaoImpl实现类重写方法

@Override
    public UserInfo queryById(Integer id) {
        String sql = "select * from userInfo where id=?";
        return jdbcTemplate.queryForObject(sql, new RowMapper<UserInfo>() {
            //RowMapper是行映射器,需要再mapRow()方法中对每行数据进行映射
            @Override
            public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
                String no = rs.getString("no");
                String name = rs.getString("name");
                String pwd = rs.getString("pwd");
                Integer sex = rs.getInt("sex");
                Integer age = rs.getInt("age");
                UserInfo user = new UserInfo(id, no, name, pwd, sex, age);
                return user;
            }
        }, id);
    }

(3)测试

public static void main(String[] args) {
        //context上下文对象(spring容器)
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class);
        
        UserInfo info = dao.queryById(1);
        System.out.println(info);
        
        System.out.println("over...");
    }

3、查询集合对象

(1)UserInfoDao接口添加方法

//根据sex查询数据集合
    List<UserInfo> queryBySex(int sex);

(2)UserInfoDaoImpl实现类重写方法

@Override
    public List<UserInfo> queryBySex(int sex) {
        String sql = "select * from userInfo where sex=?";
        return jdbcTemplate.query(sql, new RowMapper<UserInfo>() {
            //RowMapper是行映射器,需要再mapRow()方法中对每行数据进行映射
            @Override
            public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
                int id = rs.getInt("id");
                String no = rs.getString("no");
                String name = rs.getString("name");
                String pwd = rs.getString("pwd");
                Integer sex = rs.getInt("sex");
                Integer age = rs.getInt("age");
                UserInfo user = new UserInfo(id, no, name, pwd, sex, age);
                return user;
            }
        }, sex);
    }

这里的映射器写法和前面查询单一实体对象一样

(3)测试

public static void main(String[] args) {
        //context上下文对象(spring容器)
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class);
        
        List<UserInfo> list = dao.queryBySex(0);
        list.forEach(System.out::println);
        
        System.out.println("over...");
    }

四、补充说明

         上面我们使用JdbcTemplate模板工具类完成后简单的增删改查操作,更多详细的操作可以查看官方文档或百度;

         在上面的案例中,有2个问题需要被完善:

(1)       数据源没有使用连接池技术

(2)       数据源没有事务的支持

关于上述两个问题,我们会在下次课spring+hibernate中一起完善;

原文地址:https://www.cnblogs.com/faded8679/p/10797122.html