Spring笔记05(Spring JDBC三种数据源和ORM框架的映射)

Posted 迷茫王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring笔记05(Spring JDBC三种数据源和ORM框架的映射)相关的知识,希望对你有一定的参考价值。

1.ORM框架的映射

01.JDBC连接数据库以前的方式代码,并给对象赋值

@Test
    /**
     * 以前的方式jdbc
     */
    public void TestJdbc(){
        /**
         * 连接数据库的四要素
         */
        String driver="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/spring";
        String username="root";
        String password="666888";
        /**
         * 创建jdbc需要的api
         */
        Connection connection=null;
        PreparedStatement pst=null;
        ResultSet rs=null;



        try {
            //01加载驱动
            Class.forName(driver);
            //02获取链接
            connection= DriverManager.getConnection(url, username, password);
            //03书写sql语句
            String sql="select sid,sname,age from student where sid=?";
            //04给参数赋值
            pst=connection.prepareStatement(sql);
            pst.setInt(1,2);
            //05获取查询结果
            rs=pst.executeQuery();

            while(rs.next()){
                Student student=new Student();
                student.setSid(rs.getInt("sid"));
                student.setAge(rs.getInt("age"));
                student.setSname(rs.getString("sname"));
                System.out.println(student);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

02.我们使用反射机制来 动态的给 Student对象赋值

 /**
     * 我们使用反射机制来 动态的给 Student对象赋值
     */
    public static void main(String[] args){
        /**
         * 连接数据库的四要素
         */
        String driver="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/spring";
        String username="root";
        String password="666888";

        /**
         * 创建jdbc需要的api
         */
        Connection connection=null;
        PreparedStatement pst=null;
        ResultSet rs=null;



        //创建需要映射的实体类
        Object student=null;
        try {
            student=Class.forName("cn.pb.bean.Student").newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }


        try {
            //01.加载驱动
            Class.forName(driver);
            //02.获取连接
            connection=DriverManager.getConnection(url,username,password);
            //03.书写sql语句
            String sql="select sid,age,sname from student where sid=?";
            //04.给参数赋值
            pst=connection.prepareStatement(sql);
            pst.setInt(1,3);
            //05.返回结果
            rs=pst.executeQuery();

            while (rs.next()){
                //获取元数据的结果集 元数据:描述数据的数据
                ResultSetMetaData metaData = rs.getMetaData();
                System.out.println("元数据"+metaData);
                int columnCount = metaData.getColumnCount();
                //遍历元数据集合
                for (int i=1;i<=columnCount;i++){
                    //获取数据库字段的名称
                    String columnName = metaData.getColumnName(i);
                    //获取数据库字段的类型  返回的类型都是大写
                    String columnTypeName = metaData.getColumnTypeName(i);

                    /**
                     * 01.给我一个元数据的名称
                     * 02.我去实体类中找对应的setXxx()
                     */
                    String method = getMethod(columnName);
                    //赋值的时候根据类型
                    if(columnTypeName.equals("INT")){
                        student.getClass().getMethod(method,int.class).invoke(student,rs.getInt(columnName));
                    }else if(columnTypeName.equals("VARCHAR")){
                        student.getClass().getMethod(method,String.class).invoke(student,rs.getString(columnName));
                    }



                }

                Student stu= (Student) student;
                System.out.println(stu);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }


    /**
     *  01.用户给我一个字段名称(数据库中)
     *  02.我们返回一个set+字段名  (首字母大写)
     *  @param  name 字段名称
     *  @return   返回的set方法名称
     */
    public static String getMethod(String name){//传过来sid  返回 setSid

        return "set"+name.substring(0,1).toUpperCase()+name.substring(1);
    }

2.Spring的JDBC:

01.实体类代码:

package cn.pb.bean;

/**
 * student的实体类
 */
public class Student {

    private   int sid;
    private   int age;
    private   String sname;

    public Student(int sid, int age, String sname) {
        this.sid = sid;
        this.age = age;
        this.sname = sname;
    }

    public Student(int age, String sname) {
        this.age = age;
        this.sname = sname;
    }

    public Student() {

    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", age=" + age +
                ", sname=‘" + sname + \‘ +
                };
    }
}

 

02.dao层代码:

001.dao层代码

package cn.pb.dao;

import cn.pb.bean.Student;

import java.util.List;

public interface StudentDao {
    int addStudent(Student student);
    int delStudent(Student student);
    int updateStudent(Student student);
    List<Student> findAllStudents();
}

 

002.daoImpl层代码

package cn.pb.dao.impl;

import cn.pb.bean.Student;
import cn.pb.dao.StudentDao;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
 * Spring 有一个类叫 JdbcDaoSupport  ===>BaseDao
 * JdbcDaoSupport有一个属性叫JdbcTemplate
 * 在创建JdbcTemplate的时候 需要一个DataSource
 *
 * 我们只需要在配置文件中 配置数据源 即可!
 *
 */
public class StudentDaoImpl extends JdbcDaoSupport implements StudentDao {



    public int addStudent(Student student) {
        String sql="insert into student(sname,age) values(?,?)";
        return getJdbcTemplate().update(sql,student.getSname(),student.getAge());
    }

    public int delStudent(Student student) {
        String sql="delete from student where sid=?";
        return getJdbcTemplate().update(sql,student.getSid());
    }

    public int updateStudent(Student student) {
        String sql="update student set sname=?,age=? where sid=?";
        return getJdbcTemplate().update(sql,student.getSname(),student.getAge(),student.getSid());
    }
    /**
     * @return   行映射器  rowMapper
     */
    public List<Student> findAllStudents() {
        String sql="select * from student";
        return getJdbcTemplate().query(sql, new StudentRowMapper() {

        });
    }
}

行映射器代码:

package cn.pb.dao.impl;


import cn.pb.bean.Student;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

public class StudentRowMapper implements RowMapper<Student> {
    /**
     *
     * @param resultSet   之前叫 返回数据的结果集,是所有数据
     *                    现在 这个不是所有,是一行数据的结果集
     */
    public Student mapRow(ResultSet resultSet, int i) throws SQLException {
        Student student=new Student();
        student.setSid(resultSet.getInt("sid"));
        student.setSname(resultSet.getString("sname"));
        student.setAge(resultSet.getInt("age"));
        return student;
    }
}

 

03.service层代码:

001.service层代码:

package cn.pb.service;

import cn.pb.bean.Student;

import java.util.List;

public interface StudentService {
    int addStudent(Student student);
    int delStudent(Student student);
    int updateStudent(Student student);
    List<Student> findAllStudents();

}

 

002.serviceImpl层代码

package cn.pb.service.impl;

import cn.pb.bean.Student;
import cn.pb.dao.StudentDao;
import cn.pb.service.StudentService;

import java.util.List;

public class StudentServiceImpl implements StudentService {
    private StudentDao dao;


    public int addStudent(Student student) {
        return dao.addStudent(student);
    }

    public int delStudent(Student student) {
        return dao.delStudent(student);
    }

    public int updateStudent(Student student) {
        return dao.updateStudent(student);
    }

    public List<Student> findAllStudents() {
        return dao.findAllStudents();
    }


    public StudentDao getDao() {
        return dao;
    }

    public void setDao(StudentDao dao) {
        this.dao = dao;
    }
}

 

04.连接数据库的properties文件:jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/spring
jdbc.userName=root
jdbc.password=666888

05.applicationContext.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:c="http://www.springframework.org/schema/c"
       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">

    <!--01.加载jdbc.properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--02.配置数据源-->
        <!--001.使用spring默认的数据源
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driverClass}"/>
            <property name="url" value="${jdbc.jdbcUrl}"/>
            <property name="username" value="${jdbc.userName}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>-->
        <!--002.使用c3p0数据源
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${jdbc.driverClass}"/>
            <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
            <property name="user" value="${jdbc.userName}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>-->
        <!--003.使用dbcp数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClass}"/>
        <property name="url" value="${jdbc.jdbcUrl}"/>
        <property name="username" value="${jdbc.userName}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
<!--03.配置dao  在StudentDaoImpl里要使用数据源-->
    <bean id="studentDaoImpl" class="cn.pb.dao.impl.StudentDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--04.配置service-->
    <bean id="studentServiceImpl" class="cn.pb.service.impl.StudentServiceImpl">
        <property name="dao" ref="studentDaoImpl"/>
     </bean>
</beans>

 

06.测试代码:

package cn.pb;

import cn.pb.bean.Student;
import cn.pb.service.StudentService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class TestJdbc {

    public static void main(String[] args) {
        ApplicationContext context=new
                ClassPathXmlApplicationContext("applicationContext.xml");
        StudentService service= (StudentService) context.getBean("studentServiceImpl");
        //service.addStudent(new Student(25,"xixi"));
        List<Student> list=service.findAllStudents();
        System.out.println(list);
    }
}

 

以上是关于Spring笔记05(Spring JDBC三种数据源和ORM框架的映射)的主要内容,如果未能解决你的问题,请参考以下文章

SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-001-Spring对原始JDBC的封装

Spring框架学习笔记 --- [在spring中初步上手使用注解开发;以及JDBC的初步使用]

spring来了-05-JDBC

Spring JDBC模版以及三种数据库连接池的使用

Spring5——JdbcTemplate笔记

Spring框架--Spring JDBC