package com.zxh.customer.testmap.dao;
import java.util.List;
import java.util.Map;
public interface IBaseDao {
/**
* 获取单条记录
* @param map
* @return
*/
public Map selectOne(String sqlId, Map map);
/**
* 获取记录列表
* @param map
* @return
*/
public List selectList(String sqlId, Map map);
/**
* 插入一条记录
* @param map
*/
public void insert(String sqlId, Map map);
/**
* 更新记录
*/
public void update(String sqlId, Map map);
/**
* 删除记录
* @param map
*/
public void delete(String sqlId, Map map);
/**
* 调用存储过程
* @param map
*/
public void callProcedure(String sqlId, Map map);
}
package com.zxh.customer.testmap.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.zxh.customer.testmap.util.MybatisUtil;
/**
* 通用DAO 减少代码量,服务层只需构造map参数 sqlId 为映射sql的id 增删改 要提交事务
*
* @author zhangxiaohong
*
*/
public class BaseDaoImpl implements IBaseDao {
public Map selectOne(String sqlId, Map map) {
SqlSession session = MybatisUtil.getSessionFactory().openSession();
Map resultMap;
try {
resultMap = session.selectOne(sqlId, map);
} finally {
session.close();
}
return resultMap;
}
public List selectList(String sqlId, Map map) {
SqlSession session = MybatisUtil.getSessionFactory().openSession();
List resultList;
try {
resultList = session.selectList(sqlId, map);
} finally {
session.close();
}
return resultList;
}
public void insert(String sqlId, Map map) {
SqlSession session = MybatisUtil.getSessionFactory().openSession();
try {
session.insert(sqlId, map);
session.commit();
} finally {
session.close();
}
}
public void update(String sqlId, Map map) {
SqlSession session = MybatisUtil.getSessionFactory().openSession();
try {
session.update(sqlId, map);
session.commit();
} finally {
session.close();
}
}
public void delete(String sqlId, Map map) {
SqlSession session = MybatisUtil.getSessionFactory().openSession();
try {
session.delete(sqlId, map);
session.commit();
} finally {
session.close();
}
}
public void callProcedure(String sqlId, Map map) {
SqlSession session = MybatisUtil.getSessionFactory().openSession();
try {
session.selectOne(sqlId, map);
} finally {
session.close();
}
}
}
<?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.zxh.customer.testmap">
<!-- mybatis3 统一用parameterType 传入map时 parameterType可以省略 -->
<!-- resultType="java.util.HashMap" HashMap 使用Map就无需创建实体类了,#参数和map的key相同, 这样很方面,但是对于面向对象编程,就不能表现出领域模型 -->
<select id="selectUserById" parameterType="HashMap" resultType="HashMap">
SELECT CUST_ID, CUST_NAME AS "custName" FROM CUST WHERE
CUST_ID = #{custId}
</select>
<!-- 当返回list时 resultType指定list元素的类型 -->
<select id="selectUsersByName" parameterType="HashMap" resultType="HashMap">
SELECT CUST_ID, CUST_NAME AS "custName" FROM CUST WHERE
CUST_NAME like #{custName}
</select>
<!-- 增加 -->
<!-- useGeneratedKeys 获取由数据库自动生成的主键 keyProperty 获取的主键注入到此属性中 支持主键自动增长的数据库 -->
<insert id="saveUser" parameterType="HashMap">
insert into cust(cust_id,
cust_name) values(seq_cust.nextval, #{custName})
</insert>
<!-- 更新 -->
<update id="updateUserById" parameterType="HashMap">
update cust set cust_name = #{custName} where cust_id = #{custId}
</update>
<!-- 删除 -->
<delete id="deleteUserById" parameterType="HashMap">
delete from cust where
cust_id = #{custId}
</delete>
<!-- 调用存储过程 arg3直接在传入的map使用,可以在程序中直接获取 -->
<select id="callProcedure" statementType="CALLABLE"
parameterType="java.util.HashMap">
CALL P_QUERY_ORDER_TACHE_DETAIL_NUM(#{arg0,
mode=IN,
jdbcType=VARCHAR},
#{arg1, mode=IN, jdbcType=VARCHAR},
#{arg2,
mode=IN, jdbcType=VARCHAR},
#{arg3, mode=OUT,
jdbcType=VARCHAR})
</select>
</mapper>
package com.zxh.customer.testmap.util;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("config2/Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSessionFactory() {
return sqlSessionFactory;
}
}
Configuration.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 当$不起作用时 可以重新创建properties文件 第一次遇到就是此问题导致
属性配置 xml文件中使用 ${} url "/"路径-文件 或 "."-java类文件 -->
<properties resource="config2/jdbc_config.properties">
<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@172.16.1.241:1521:jtcrm" />
<property name="username" value="jtorder" />
<property name="password" value="jtorder" /> -->
</properties>
<!-- 或者 首先读取properties元素内部的子元素的值, 再读取properties配置文件的值 后者覆盖前者 -->
<!-- <properties resource="config/jdbc.properties"> <property name="driver"
value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@172.16.1.241:1521:jtcrm"
/> </properties> -->
<!-- 设置mybatis3 运行时的行为方式 -->
<settings>
<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
<setting name="defaultStatementTimeout" value="60000" />
<!-- 启用或禁用 缓存 -->
<setting name="cacheEnabled" value="false" />
<!-- 启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 允许或不允许多种结果集从一个单独 的语句中返回(需要适合的驱动) 不用考虑 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 使用列标签代替列名。 不同的驱动在这 方便表现不同 不用考虑 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许 JDBC 支持生成的键。 需要适合的 驱动。 如果设置为 true 则这个设置强制 生成的键被使用 -->
<setting name="useGeneratedKeys" value="false" />
<!-- 等等 -->
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@172.16.1.241:1521:jtcrm" />
<property name="username" value="jtorder" />
<property name="password" value="jtorder" /> -->
</dataSource>
</environment>
</environments>
<!-- SQL映射文件 -->
<mappers>
<mapper resource="com/zxh/customer/testmap/model/User.xml" />
</mappers>
</configuration>
jdbc_config.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc\:oracle\:thin\:@172.16.1.241\:1521\:jtcrm
username=jtorder
password=jtorder
package com.zxh.customer.testmap.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.zxh.customer.testmap.dao.BaseDaoImpl;
import com.zxh.customer.testmap.dao.IBaseDao;
public class Test {
public static void main(String[] args) {
// 通用Dao层
IBaseDao baseDao = new BaseDaoImpl();
// 构造参数 -- 注意 sqlId 为映射sql的id值 此key必须存在
// Map map = new HashMap();
// map.put("custId", "604763");
// map.put("sqlId", "com.zxh.customer.testmap.selectUserById");
// Map resultMap = baseDao.selectOne(map);
// System.out.println(resultMap.get("CUST_ID").toString() + resultMap.get("custName"));
// Map map = new HashMap();
// map.put("custName", "%中国%");
// map.put("sqlId", "com.zxh.customer.testmap.selectUsersByName");
// List resultList = baseDao.selectList(map);
// System.out.println(resultList.size());
// Map map = new HashMap();
// map.put("custName", "美国-中国-德国-法国-意大利");
// map.put("sqlId", "com.zxh.customer.testmap.saveUser");
// baseDao.insert(map);
// Map map = new HashMap();
// map.put("custId", "611746");
// map.put("custName", "美国-中国-德国-法国-意大利修改");
// map.put("sqlId", "com.zxh.customer.testmap.updateUserById");
// baseDao.update(map);
// Map map = new HashMap();
// map.put("custId", "611746");
// map.put("sqlId", "com.zxh.customer.testmap.deleteUserById");
// baseDao.delete(map);
Map map = new HashMap();
map.put("arg0", "1");
map.put("arg1", "1");
map.put("arg2", "1");
baseDao.callProcedure("com.zxh.customer.testmap.callProcedure", map);
System.out.println(map.get("arg3"));
System.out.println("成功!");
}
}