DBUtil工具类
package com.abc.mybatis.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DBUtil {
private static SqlSessionFactory sessionFactory;
static {
try{
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
sessionFactory=new SqlSessionFactoryBuilder().build(is);
}catch(IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sessionFactory.openSession();
}
}
mybatis主配置文件
<?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>
<!-- – configuration 配置
• properties 属性
• settings 设置
• typeAliases 类型命名
• typeHandlers 类型处理器
• objectFactory 对象工厂
• plugins 插件
• Environments 环境
• mappers 映射器 -->
<!-- 加载属性文件 -->
<typeAliases>
<package name="com.abc.mybatis.domain"/>
</typeAliases>
<!-- 对数据库做个映射 -->
<environments default="armbank">
<environment id="armbank">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="pooled">
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="scott"/>
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 映射文件写好之后一定要告诉主配置文件,否则报错 -->
<mapper resource="mapper/EmpMapper.xml"/>
</mappers>
</configuration>
映射配置文件
<?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="emp">
<select id="queryEmp" parameterType="Integer" resultType="emp">
select empno,ename,hiredate,sal from emp where empno=#{empno}
</select>
<select id="queryAll" resultType="emp">
select empno,ename,hiredate,sal from emp
</select>
<!-- insert时最好判断一下数据是否为空,如果为空,那么该字段不给值
或者不判断,调用sql语句之前,提前校验好 -->
<insert id="insertEmp" parameterType="emp">
insert into emp(empno,ename,hiredate,sal)
values(#{empno},#{ename},#{hiredate},#{sal})
</insert>
<delete id="deleteEmp" parameterType="integer">
delete from emp where empno=#{empno}
</delete>
<update id="updateEmp" parameterType="emp">
update emp
<set>
<if test="ename!=null and ename!=''">
ename=#{ename},
</if>
<if test="hiredate!=null">
hiredate=#{hiredate},
</if>
<if test="sal>0">
sal=#{sal},
</if>
</set>
where empno=#{empno}
</update>
</mapper>
Emp实体类
package com.abc.mybatis.domain;
import java.util.Date;
public class Emp {
private Integer empno;
private String ename;
private Date hiredate;
private Double sal;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", hiredate=" + hiredate + ", sal=" + sal + "]\n";
}
}
EmpDaoIfac.java增删改查方法接口
package com.abc.mybatis.dao.ifac;
import java.util.List;
import com.abc.mybatis.domain.Emp;
public interface EmpDaoIfac {
//增删改查方法
public Emp queryEmp(Integer empno);
public List<Emp> queryAll();
public Integer insertEmp(Emp emp);
public Integer updateEmp(Emp emp);
public Integer deleteEmp(Integer empno);
}
EmpDaoImpl.java接口实现类
package com.abc.mybatis.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.abc.mybatis.dao.ifac.EmpDaoIfac;
import com.abc.mybatis.domain.Emp;
import com.abc.mybatis.util.DBUtil;
public class EmpDaoImpl implements EmpDaoIfac {
@Override
public Emp queryEmp(Integer empno) {
SqlSession session=DBUtil.getSqlSession();
Emp emp=session.selectOne("emp.queryEmp", empno);
session.close();
return emp;
}
@Override
public List<Emp> queryAll() {
SqlSession session=DBUtil.getSqlSession();
List<Emp> emps=session.selectList("emp.queryAll");
session.close();
return emps;
}
@Override
public Integer insertEmp(Emp emp) {
SqlSession session=DBUtil.getSqlSession();
int rows=session.insert("emp.insertEmp", emp);
session.commit();
session.close();
return rows;
}
@Override
public Integer updateEmp(Emp emp) {
SqlSession session=DBUtil.getSqlSession();
int rows=session.update("emp.updateEmp", emp);
session.commit();
session.close();
return rows;
}
@Override
public Integer deleteEmp(Integer empno) {
SqlSession session=DBUtil.getSqlSession();
int rows=session.delete("emp.deleteEmp", empno);
session.commit();
session.close();
return rows;
}
}
测试类
package com.abc.mybatis.dao.impl;
import java.util.Date;
import java.util.List;
import com.abc.mybatis.domain.Emp;
public class TestEmpDaoImpl {
public static void main(String[] args) {
//Emp emp=new EmpDaoImpl().queryEmp(6666);
//System.out.println(emp);
// Emp emp=new Emp();
// emp.setEmpno(0000);
// emp.setEname("牛顿");
// emp.setHiredate(new Date());
// emp.setSal(23000.00);
// Integer rows=new EmpDaoImpl().insertEmp(emp);
// Integer rows=new EmpDaoImpl().deleteEmp(0);
// System.out.println("rows:"+rows);
Emp emp=new Emp();
emp.setEmpno(6666);
emp.setSal(16000.0);
Integer rows=new EmpDaoImpl().updateEmp(emp);
List<Emp> emps=new EmpDaoImpl().queryAll();
System.out.println(emps.toString());
}
}
原始dao的开发方式存在问题:
1.dao接口中存在大量模板方法,能否把这些代码抽取出来,不用程序员写了,程序自动生成,减轻工作量;
2.调用sqlSession的方法时,传入参数statement的id时硬编码了,写死了;
3.调用sqlSession的方法时,传给sql语句的参数即使传入错误,在编译阶段也不会报错。