项目准备:
1. 安装Oracle 10g, 或者 Oracle 11g 【安装教程】
2. 配置jdbc连接信息, 将下载的项目中的连接信息换成本地信息
3. 项目是maven工程,需要配置相应的maven信息 【安装教程】
4. ojdbc-14.jar包引用到工程中
5. 实例中涉及二张表 student(学生信息), parent(学生家长信息)
学生信息有数据的增删改查, 家长信息有两表的关联查询,用来查询学生及学生父母信息
6. 下载项目, 项目包含文件(代码, sql脚本, jar包)

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

对应的 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
}
}-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下载Demo