mybatis_config.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 resource="jdbc.properties">
</properties>
<!--传入的参数的字段为null对象无法获取对应的jdbcType类型,而报的错误。 -->
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 注册别名 别名在這个类中TypeAliasRegistry -->
<typeAliases>
<!-- 单个别名 -->
<typeAlias type="cn.et.day20170614.entity.DeptEntity" alias="dept"/>
<!-- 也可以整包注册列名小写就是它的别名
<package name="cn.et.day20170614.entity"/> -->
</typeAliases>
<!-- 开发坏境 development是开发者坏境-->
<environments default="development">
<!-- 数据配置 -->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${userAccount}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册注释接口 和 xml映射文件 -->
<mapper class="cn.et.day20170609.dao.EmpJaxaDao"/>
<mapper class="cn.et.day20170612.NoteIfDao"/>
<mapper class="cn.et.day20170612.CallFuncInterfaceDao"/>
<mapper class="cn.et.day20170614.anno.EmpMappingDeptDao"/>
<mapper class="cn.et.day20170614.anno.DeptMappingEmpDao"/>
<mapper class="cn.et.day20170615.dao.LabelDao"/>
<mapper resource="cn/et/day20170612/func_mapper.xml"/>
<mapper resource="cn/et/day20170612/selectKey_mapper.xml"/>
<mapper resource="emp_mapper.xml"/>
<mapper resource="cn/et/day20170609/dept_mapper.xml"/>
<mapper resource="cn/et/day20170614/xml/emp_mapper.xml"/>
<mapper resource="cn/et/day20170614/xml/dept_mapper.xml"/>
</mappers>
</configuration>
用注解 实体类一对多用泛型集合 多对一用对象
/**
* @Results 返回的映射 如果数据库名字和实体类的属性名对不上就是可以通过 column指定列名(不区分大小写) property对象属性名(区分大小写)
* 默认的规则是全转小写再匹配的
* 一对多用many(要导包CGLIB)
多对一用one
* fetchType 延时机制(也叫懒机制) 是你用到的时候再加载
* 数据属性名和实体类的名字对不像就通过result设置
property="list"属性名 column="deptno"数据库的列名
* @param empno
* @return
*/
@Results({
@Result(column="deptno",property="list",javaType=java.util.List.class,
many=@Many(select="cn.et.day20170614.anno.DeptMappingEmpDao.queryEmp",fetchType=FetchType.LAZY)
)
}
)
@Select(value="select * from dept where deptno=#{deptno}")
public DeptEntity queryDept(String deptno);
@Select(value="select * from emp where deptno=#{deptno}")
public List<EmpEntity> queryEmp();
xml加实体类
namespace是包名加类名
id是方法名
collection是一对多
association 是多对一
<?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">
<!--
/add.do namespace /user 访问 /user/add.do
/add.do namespace /dept 访问 /dept/add.do
namespace是为了解决相同名字的sql操作问题
-->
<mapper namespace="cn.et.day20170614.xml.DeptMappingEmpDao">
<!-- 标识符 用于唯一标示一条sql语句
resultType 标示单行记录的类型
1 max(列)+1 只允许单线程 不建议在开发坏境中用 开发测试可以用
2 序列 只允许单数据库的情况 next 开发坏境
3 uuid 分布式应用程序 (select sys_guid from dual)
fetchType 延时机制(也叫懒机制) 是你用到的时候再加载 (fetchType="lazy")
数据属性名和是实体的名字对不像就通过result设置
property="list"属性名 column="deptno"数据库的列名
-->
<resultMap type="dept" id="myDept">
<collection property="list" column="deptno" javaType="list"
select="cn.et.day20170614.xml.DeptMappingEmpDao.queryEmp" fetchType="lazy">
</collection>
</resultMap>
<select id="queryDept" resultMap="myDept">
select * from dept where deptno=#{deptno}
</select>
<select id="queryEmp" resultType="cn.et.day20170614.entity.EmpEntity">
select * from emp where deptno=#{deptno}
</select>
</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">
<!--
/add.do namespace /user 访问 /user/add.do
/add.do namespace /dept 访问 /dept/add.do
namespace是为了解决相同名字的sql操作问题
-->
<mapper namespace="cn.et.day20170612.CallFuncDao">
<!-- 标识符 用于唯一标示一条sql语句
resultType 标示单行记录的类型
调用过程
-->
<select id="callPro" parameterType="map" statementType="CALLABLE">
<!-- IN OUT NUMERIC要大写-->
{call pro_add(
#{p1,jdbcType=NUMERIC,mode=IN},
#{p2,jdbcType=NUMERIC,mode=IN},
#{p3,jdbcType=NUMERIC,mode=OUT})
}
</select>
<!-- 调用函数 -->
<select id="callFunc" parameterType="map" statementType="CALLABLE">
<!-- IN OUT NUMERIC要大写-->
{#{p3,jdbcType=NUMERIC,mode=OUT}=call fun_add(
#{p1,jdbcType=NUMERIC,mode=IN},
#{p2,jdbcType=NUMERIC,mode=IN}
)
}
</select>
</mapper>
@Select(value="<script>{call pro_add("+
"#{p1,jdbcType=NUMERIC,mode=IN},"+
"#{p2,jdbcType=NUMERIC,mode=IN},"+
"#{p3,jdbcType=NUMERIC,mode=OUT})"+
"}</script>")
@Options(statementType=StatementType.CALLABLE )
public void callPro(Map<String, Integer> map);
@Select(value="<script>{#{p3,jdbcType=NUMERIC,mode=OUT}=call fun_add("+
"#{p1,jdbcType=NUMERIC,mode=IN},"+
"#{p2,jdbcType=NUMERIC,mode=IN}"+
")"+
"}</script>")
@Options(statementType=StatementType.CALLABLE )
public void callFunc(Map<String, Integer> map);
selectKey用法
<?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">
<!--
/add.do namespace /user 访问 /user/add.do
/add.do namespace /dept 访问 /dept/add.do
namespace是为了解决相同名字的sql操作问题
-->
<mapper namespace="cn.et.day20170612.SelectKeyDao">
<!-- 标识符 用于唯一标示一条sql语句
resultType 标示单行记录的类型
1 max(列)+1 只允许单线程 不建议在开发坏境中用 开发测试可以用
2 序列 只允许单数据库的情况 next 开发坏境
3 uuid 分布式应用程序 (select sys_guid from dual)
-->
<insert id="selectKey" parameterType="map">
<selectKey order="BEFORE" keyProperty="deptno" resultType="int">
select max(deptno)+10 from dept
</selectKey>
insert into dept(deptno,dname) values(#{deptno},#{dname})
</insert>
</mapper>
/**
* @Results 返回的映射 如果数据库名字和实体类的属性名对不上就是可以通过 column指定列名(不区分大小写) property对象属性名(区分大小写)
* 默认的规则是全转小写再匹配的
* 一对多用many(要导包CGLIB)
* fetchType 延时机制(也叫懒机制) 是你用到的时候再加载
* 数据属性名和实体类的名字对不像就通过result设置
property="list"属性名 column="deptno"数据库的列名
* @param empno
* @return
*/
@Results({
@Result(column="deptno",property="list",javaType=java.util.List.class,
many=@Many(select="cn.et.day20170614.anno.DeptMappingEmpDao.queryEmp",fetchType=FetchType.LAZY)
)
}
)
@Select(value="select * from dept where deptno=#{deptno}")
public DeptEntity queryDept(String deptno);
@Select(value="select * from emp where deptno=#{deptno}")
public List<EmpEntity> queryEmp();