作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服

项目准备:

1. 安装Oracle 10g, 或者 Oracle 11g   【安装教程】

2. 配置jdbc连接信息, 将下载的项目中的连接信息换成本地信息

3. 项目是maven工程,需要配置相应的maven信息  【安装教程】

4. ojdbc-14.jar包引用到工程中

5. 实例中涉及二张表 student(学生信息), parent(学生家长信息)

        学生信息有数据的增删改查,  家长信息有两表的关联查询,用来查询学生及学生父母信息

 6. 下载项目, 项目包含文件(代码, sql脚本, jar包)

blob.png



1. maven本地jar包引入

    由于ojdbc-14.jar通过在pom.xml的配置信息无法下载, 但又想通过maven方式引入,可以通过maven jar包本地化,

准备一个ojdbc-14.jar, 目录为C:\Users\Administrator\Desktop\ojdbc14.jar,通过下面的命令将ojdbc-14.jar装载到maven本地仓库

mvn install:install-file -Dfile=C:\Users\Administrator\Desktop\ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar

blob.png

对应的 pom 信息为

<dependency>

<groupId>com.oracle</groupId>                           ----DgroupId

<artifactId>ojdbc</artifactId>                          ----DartifactId

<version>14</version>                                   ----Dversion

</dependency>


2. 项目代码

2.1 数据源配置

jdbc.properties(连接本地的oracle数据库), 将下面url, username, password 换成你本地的信息

driver=oracle.jdbc.OracleDriver
#url=jdbc:mysql://localhost:3306/hctl?characterEncoding=utf-8
url=jdbc:oracle:thin:@127.0.0.1:1521:MYORACLE
#url=jdbc:mysql://www.ad186.com:3306/hctl?characterEncoding=utf-8
username=gepanjiang
password=ajqnhwvia
#username=root
#password=ajqnhwvia

#\u5b9a\u4e49\u521d\u59cb\u8fde\u63a5\u6570
initialSize=0
#\u5b9a\u4e49\u6700\u5927\u8fde\u63a5\u6570
maxActive=20
#\u5b9a\u4e49\u6700\u5927\u7a7a\u95f2
maxIdle=20
#\u5b9a\u4e49\u6700\u5c0f\u7a7a\u95f2
minIdle=1
#\u5b9a\u4e49\u6700\u957f\u7b49\u5f85\u65f6\u95f4
maxWait=6000000


2.2 spring信息配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.3.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
	
	<context:component-scan base-package="com.main">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<!-- 数据库连接池配置 -->
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:jdbc.properties" />
	</bean>
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${driver}" />
		<property name="url" value="${url}" />
		<property name="username" value="${username}" />
		<property name="password" value="${password}" />
		<!-- 初始化连接大小 -->
		<property name="initialSize" value="${initialSize}"></property>
		<!-- 连接池最大数量 -->
		<property name="maxActive" value="${maxActive}"></property>
		<!-- 连接池最大空闲 -->
		<property name="maxIdle" value="${maxIdle}"></property>
		<!-- 连接池最小空闲 -->
		<property name="minIdle" value="${minIdle}"></property>
		<!-- 获取连接最大等待时间 -->
		<property name="maxWait" value="${maxWait}"></property>
	</bean>
	
	<!-- spring和mybatis的整合 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- 自动扫描mapping.xml文件(sql语句) -->
		<property name="mapperLocations" value="classpath:/com/main/dao/*.xml"></property>
		<!-- 用于分页 -->
		<property name="plugins"> 
			<list> 
				<bean class="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor"> 
					<property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"></property> 
				</bean> 
			</list> 
		</property>
	</bean>
	
	<!-- 注解的DAO接口包,自动扫描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!--  <property name="basePackage" value="com.lzjy.sqlmaps.dao" />-->
		<property name="basePackage" value="com.main.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>
	
	
	<!-- 配置事务特性 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<!-- 必须要rollback-for才能事务回滚 -->
			<tx:method name="add*"    propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
			<tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
			<tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
			<tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
			<tx:method name="del*"    propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
			<tx:method name="*"       read-only="true" />
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:pointcut id="serviceMethod" expression="execution(* com.main.service.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
	</aop:config>
</beans>


2.3 用户实体信息, 此实体信息包括下面的sql语句 可以根据自动工具生成 【查看工具】

package com.main.model;

import java.util.Date;

public class Student {
    /**
     * null
     */
    private String studentNo;

    /**
     * null
     */
    private String studentName;

    /**
     * null
     */
    private Short age;

    /**
     * null
     */
    private Date birthday;

    /**
     * null
     */
    private String sex;

    /**
     * null
     * @return STUDENT_NO null
     */
    public String getStudentNo() {
        return studentNo;
    }

    /**
     * null
     * @param studentNo null
     */
    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo == null ? null : studentNo.trim();
    }

    /**
     * null
     * @return STUDENT_NAME null
     */
    public String getStudentName() {
        return studentName;
    }

    /**
     * null
     * @param studentName null
     */
    public void setStudentName(String studentName) {
        this.studentName = studentName == null ? null : studentName.trim();
    }

    /**
     * null
     * @return AGE null
     */
    public Short getAge() {
        return age;
    }

    /**
     * null
     * @param age null
     */
    public void setAge(Short age) {
        this.age = age;
    }

    /**
     * null
     * @return BIRTHDAY null
     */
    public Date getBirthday() {
        return birthday;
    }

    /**
     * null
     * @param birthday null
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * null
     * @return SEX null
     */
    public String getSex() {
        return sex;
    }

    /**
     * null
     * @param sex null
     */
    public void setSex(String sex) {
        this.sex = sex == null ? null : sex.trim();
    }
}

学生家长实体bean

package com.main.model;

public class StudentParent {
	private String studentNo;
    private String studentName;
    private String fatherName;
    private String montherName;
	public String getStudentNo() {
		return studentNo;
	}
	public void setStudentNo(String studentNo) {
		this.studentNo = studentNo;
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
	public String getFatherName() {
		return fatherName;
	}
	public void setFatherName(String fatherName) {
		this.fatherName = fatherName;
	}
	public String getMontherName() {
		return montherName;
	}
	public void setMontherName(String montherName) {
		this.montherName = montherName;
	}
    
    
}

2.4 由于查询数据库使用了mybatis,所以mapper.xml信息必不可少

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.main.dao.StudentMapper">
  <resultMap id="BaseResultMap" type="com.main.model.Student">
    <id column="STUDENT_NO" jdbcType="VARCHAR" property="studentNo" />
    <result column="STUDENT_NAME" jdbcType="VARCHAR" property="studentName" />
    <result column="AGE" jdbcType="DECIMAL" property="age" />
    <result column="BIRTHDAY" jdbcType="DATE" property="birthday" />
    <result column="SEX" jdbcType="CHAR" property="sex" />
  </resultMap>
  
  <resultMap id="BaseStudentParent" type="com.main.model.StudentParent">
  	<id column="STUDENT_NO" property="studentNo" jdbcType="VARCHAR" />
    <result column="STUDENT_NAME" property="studentName" jdbcType="VARCHAR" />
    <result column="FATHER_NAME" property="fatherName" jdbcType="VARCHAR"/>
   	<result column="MONTHER_NAME" property="montherName" jdbcType="VARCHAR"/>
  </resultMap>
  
  
  <sql id="Base_Column_List">
    STUDENT_NO, STUDENT_NAME, AGE, BIRTHDAY, SEX
  </sql>
  
  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
  		select 
	    <include refid="Base_Column_List" />
	    from STUDENT
	    where STUDENT_NO = #{studentNo,jdbcType=VARCHAR}
  </select>
  
  <!-- 分页查询 -->
  <select id="queryPageStudent" parameterType="com.main.model.Student" resultMap="BaseResultMap">
		select 
	    <include refid="Base_Column_List" />
	    from STUDENT
	    where 1=1
	    <if test="studentNo != null" >
	      AND STUDENT_NO = #{studentNo,jdbcType=VARCHAR}
	    </if>
	    <if test="studentName != null" >
	      AND STUDENT_NAME = #{studentName,jdbcType=VARCHAR}
	    </if>
	    <if test="age != null" >
	      AND AGE = #{age,jdbcType=DECIMAL}
	    </if>
	    <if test="sex != null" >
	      AND SEX = #{sex,jdbcType=CHAR}
	    </if>  
  </select>
  
  
  
  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
    delete from STUDENT
    where STUDENT_NO = #{studentNo,jdbcType=VARCHAR}
  </delete>
  
  <insert id="insert" parameterType="com.main.model.Student">
    insert into STUDENT (STUDENT_NO, STUDENT_NAME, AGE, 
      BIRTHDAY, SEX)
    values (#{studentNo,jdbcType=VARCHAR}, #{studentName,jdbcType=VARCHAR}, #{age,jdbcType=DECIMAL}, 
      #{birthday,jdbcType=DATE}, #{sex,jdbcType=CHAR})
  </insert>
  
  <insert id="insertSelective" parameterType="com.main.model.Student">
    insert into STUDENT
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="studentNo != null">
        STUDENT_NO,
      </if>
      <if test="studentName != null">
        STUDENT_NAME,
      </if>
      <if test="age != null">
        AGE,
      </if>
      <if test="birthday != null">
        BIRTHDAY,
      </if>
      <if test="sex != null">
        SEX,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="studentNo != null">
        #{studentNo,jdbcType=VARCHAR},
      </if>
      <if test="studentName != null">
        #{studentName,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        #{age,jdbcType=DECIMAL},
      </if>
      <if test="birthday != null">
        #{birthday,jdbcType=DATE},
      </if>
      <if test="sex != null">
        #{sex,jdbcType=CHAR},
      </if>
    </trim>
  </insert>
  
  <update id="updateByPrimaryKeySelective" parameterType="com.main.model.Student">
    update STUDENT
    <set>
      <if test="studentName != null">
        STUDENT_NAME = #{studentName,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        AGE = #{age,jdbcType=DECIMAL},
      </if>
      <if test="birthday != null">
        BIRTHDAY = #{birthday,jdbcType=DATE},
      </if>
      <if test="sex != null">
        SEX = #{sex,jdbcType=CHAR},
      </if>
    </set>
    where STUDENT_NO = #{studentNo,jdbcType=VARCHAR}
  </update>
  
  <update id="updateByPrimaryKey" parameterType="com.main.model.Student">
    update STUDENT
    set STUDENT_NAME = #{studentName,jdbcType=VARCHAR},
      AGE = #{age,jdbcType=DECIMAL},
      BIRTHDAY = #{birthday,jdbcType=DATE},
      SEX = #{sex,jdbcType=CHAR}
    where STUDENT_NO = #{studentNo,jdbcType=VARCHAR}
  </update>
  
  <!-- 查询学生及父母亲 -->
  <select id="queryStudentParent" resultMap="BaseStudentParent" parameterType="java.lang.String">
 	select m.student_no, m.student_name, n.father_name, n.monther_name  
 	from student m left join parent n on m.student_no=n.student_no where m.student_no = #{studentNo,jdbcType=VARCHAR}
  </select>
</mapper>


2.5 后台框架对接前台使用的springmvc, controller层代码如下:

package com.main.controller;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import com.main.model.Student;
import com.main.model.StudentParent;
import com.main.service.StudentService;
import com.main.util.Result;
import com.main.util.StrDateUtil;

@Controller
@RequestMapping("/student")
public class StudentController {
	
	@Autowired
	private StudentService studentService;
	
	public StudentController() {
		System.out.println("StudentController构造函数");
	}
	
	//访问此资源的url:  http://localhost:8080/MyBatisOracle/student/queryPageStudent.htm?page=1&limit=5
	@RequestMapping("/queryPageStudent.htm")
    public String queryStudent(ModelMap map, PageBounds pageBounds) 
    {
		//查询总数目
		pageBounds.setContainsTotalCount(true);
		Student studentCondition = new Student();
		List<Student> lstStudents = studentService.queryPageStudent(studentCondition, pageBounds);
		
		/*获得总页数        如果page=1&limit=5 未设置,下面强转会失败*/
    	PageList pageList = (PageList)lstStudents;
    	System.out.println("totalCount: " + pageList.getPaginator().getTotalCount());
    	map.put("lstStudent", lstStudents);
    	map.put("total", pageList.getPaginator().getTotalCount());
    	return "studentList";
    }
	
	//访问此资源的url:  http://localhost:8080/MyBatisOracle/student/addStudent.htm
	@RequestMapping("/addStudent.htm")
	@ResponseBody
    public Result addStudent(ModelMap map, HttpServletResponse response) 
    {
		Result result = new Result();
		Student student = new Student();
		student.setStudentNo(StrDateUtil.getCurrentTimeToString2());
		student.setAge(Short.parseShort("10"));
		student.setStudentName("ge-pan-jiang");
		student.setSex("1");
		student.setBirthday(new Date());
		int nCount = studentService.addStudent(student);
		if(nCount == 1){
			result.setDesc("插入成功");
			result.setStateCode("0");
		}else{
			result.setDesc("插入失败");
			result.setStateCode("-1");
		}
		return result;
    }
	
	
	//访问此资源的url:  http://localhost:8080/MyBatisOracle/student/delStudent.htm
	@RequestMapping("/delStudent.htm")
	@ResponseBody
    public Result delStudent(ModelMap map, HttpServletResponse response) 
    {
		Result result = new Result();
		int nCount = studentService.delStudent("000001");
		if(nCount == 1){
			result.setDesc("删除成功");
			result.setStateCode("0");
		}else{
			result.setDesc("删除失败");
			result.setStateCode("-1");
		}
		return result;
    }
	
	//查询学生父母亲 (联表查询【student, parent】)
	//访问此资源的url:  http://localhost:8080/MyBatisOracle/student/queryStudentParent.htm
	@RequestMapping("/queryStudentParent.htm")
	@ResponseBody
    public Result queryStudentParent(ModelMap map, HttpServletResponse response) 
    {
		Result result = new Result();
		StudentParent studentParent = studentService.queryStudentParent("000002");
		result.setStateCode("0");
		result.setDesc("查询学生父母亲");
		result.setData(studentParent);
		return result;
    }
	
	
	/**
	 * 测试事务
	 * 访问此资源的url:  http://localhost:8080/MyBatisPage/user/testUserTransaction.htm
	 */
	@RequestMapping("/testUserTransaction.htm")
	@ResponseBody
    public Result testUserTransaction(ModelMap map, HttpServletResponse response) 
    {
		Result result = new Result();
		/*try{
			userService.addUserTransaction();
		}catch(Exception e){
			e.printStackTrace();
		}
		
		
		result.setStateCode("0");
		result.setDesc("查询成功");*/
		return result;
    }

	//测试函数
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
	}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Home