一、mybatis如何执行数据增删改操作的
mybatis通过一个sqlSession类来执行增删改操作的,sqlSession类包含了所有执行SQL操作的方法如
session.selectList("findAll"); session.update("update"); 等
那如何得到sqlSession类呢?mybatis提供了SqlSessionFacotry 工厂类
SqlSessionFacotry :每一个MyBatis的应用程序都以一个SqlsessionFactory对象为核心,该对象负责创建SqlSession对象实例
而SqlSessionFactoryBuild有提供了SqlSessionFacotry
SqlSessionFactoryBuild:该对象负责根据配置文件SqlMapConfig.xml构建SqlSessionFactory实例
所以我们要引入一个SqlMapConfig.xml文件
下面测试一下是否得到了sqlSession类了
package core.test;
import java.io.IOException;
import java.io.Reader;
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 MyBatisTest {
public static void main(String[] args) throws IOException {
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = builder.build(reader);
SqlSession session = sessionFactory.openSession();
System.out.println(session);
}
}
二 、成功后我们来一个小练习
编写一个实体类Emp
package core.entity;
public class Emp {
private String empno;
private String ename;
private Double sal;
public String getEmpno() {
return empno;
}
public void setEmpno(String empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
}
然后添加一个sqlMap.xml定义Sql语句
insert into emp(empno,ename,sal)values(#{empno},#{ename},#{sal})
select * from emp where empno=#{empno}
接下来可以使用sqlsession调用方法实现对应的怎删改查如
package core.test;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import core.entity.Emp;
public class MyBatisInsertTest {
public static void main(String[] args) throws IOException {
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = builder.build(reader);
SqlSession session = sessionFactory.openSession();
Emp emp = new Emp();
emp.setEmpno("1001");
emp.setEname("zhangsan");
emp.setSal(10000.0);
session.insert("addEmp",emp);
session.commit();
session.close();
}
}
三、接下来说说Mapper映射器
还是上面的例子,我们在项目中使用增删改一般会写成一个Dao
package core.dao;
import java.util.List;
import core.entity.Emp;
public interface EmpDao {
public void delete(Integer id);
public void addEmp(Emp emp);
public List
findAll();
Emp findById(int empno);
}
package core.dao;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import core.entity.Emp;
public class EmpDaoIm implements EmpDao {
@Override
public void addEmp(Emp emp) {
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
Reader reader=null;
try {
reader = Resources.getResourceAsReader("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sessionFactory = builder.build(reader);
SqlSession session = sessionFactory.openSession();
session.insert("addEmp",emp);
session.commit();
session.close();
}
}
Mapper映射器是开发者创建绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得
所以我们只需要提供一个按照MyBtis规范的接口,MyBtis会自动为我们创建一个对应的实现类,当然这是个代理实现类,映射器接口的实例可以从SqlSession中获得
如我们写了一个接口
package core.dao;
import java.util.List;
import core.entity.Emp;
public interface EmpDao {
public void delete(Integer id);
public void addEmp(Emp emp);
public List
findAll();
Emp findById(int empno);
}
package core.dao;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import core.entity.Emp;
public class EmpDaoIm implements EmpDao {
@Override
public void addEmp(Emp emp) {
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
Reader reader=null;
try {
reader = Resources.getResourceAsReader("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sessionFactory = builder.build(reader);
SqlSession session = sessionFactory.openSession();
session.insert("addEmp",emp);
session.commit();
session.close();
}
}
package core.test;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import core.dao.EmpDao;
import core.entity.Emp;
public class EmpDaoTest {
public static void main(String[] args) throws IOException {
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = builder.build(reader);
SqlSession session = sessionFactory.openSession();
EmpDao dao = session.getMapper(EmpDao.class);
Emp emp = new Emp();
emp.setEName("zs");
emp.setEmpno("1002");
emp.setSal(10000.0);
dao.addEmp(emp);
session.commit();
session.close();
}
}
四、如何实现spring整合mybatis
第一步引入mybatis-spring.jar其提供了下面几个与整合相关的API
1 SqlSessionFacoryBean
为整合应用提供了SqlSession对象资源其相当于做了SqlSessionUtil 的工作即如下代码
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = builder.build(reader);
SqlSession session = sessionFactory.openSession();
2 MapperFactoryBean(每一个Mapper接口都要配一个MapperFactoryBean)
根据指定Mapper接口生成Bean实例 其封装了原有session.getMapper()功能实现,即如下代码
EmpDao dao = session.getMapper(EmpDao.class);
3 MapperScannerConfigure(一个MapperScannerConfigure可以对应多个Mapper接口)
根据指定包批量扫描Mapper接口并生成实例,Dao实例名为接口名首字母小写
MapperScannerConfigure一般取代了MapperFactoryBean
第二步在applicationContext.xml中定义SqlSessionFacoryBean,和MapperScannerConfigure
现在当我们想用dao的方法时,可以到spring容器中取,默认dao的名字为接口名首字母小写,或者自动装配到service中
package core.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import core.dao.EmpDao;
import core.entity.Emp;
@Component
public class EmpService {
@Resource
private EmpDao dao;
public Emp getEmpInfo(){
Emp emp = dao.findById(1001);
return emp;
}
}
终于写完了~~