Mybatis学习记录(2)
1.mybatis与hibernate不同
Mybatis和hibernate,mybatis不完全是一个ORM框架,因为Mybatis需要程序员自己编写sql语句。mybatis可以通过xml或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行结果再映射生成java对象。
Mybatis可严格控制sql执行性能,灵活度高,但是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象关系映射能力好,数据库无关性好,对于关系模型要求高的软件,采用hibernat开发可以节省很多代码,提高效率,但是灵活性很低。
2.原生Dao开发
(1)新建Dao包
UserDao.java
import com.javaweb.mybatis.model.User; public interface UserDao { public User selectUserById(String id); }
userDaoImpl.java
import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.javaweb.mybatis.dao.UserDao; import com.javaweb.mybatis.model.User; /** * Dao * @author fyk * */ public class UserDaoImpl implements UserDao { //注入 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory){ this.sqlSessionFactory=sqlSessionFactory; } /*
*根据id查询用户
*
*/ public User selectUserById(String id){ SqlSession sqlSession=sqlSessionFactory.openSession(); return sqlSession.selectOne("test.findUserById", id); } public SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } }
Junit单元测试
public class MybatisDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void before() throws Exception { //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); } @Test public void testDao() throws Exception{ UserDao userDao=new UserDaoImpl(sqlSessionFactory); User user = userDao.selectUserById("2"); System.out.println(user); } }
3.使用Mapper动态代理方式
Mapper接口开发方法只需要编写Mapper接口(相当于Dao接口),有Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法。
Mapper.xml映射文件
Mapper.xml配置文件
UserMapper.java
import com.javaweb.mybatis.model.User; //与dao是一个意思 public interface UserMapper { /** * 遵循四个原则 * 1.接口方法名 ==User.xml中的id名 * 2.返回值类型与Mapper.xml的返回值类型一致 * 3.方法的入参类型与Mapper.xml中的入参类型一致 * 4.命名空间绑定此接口,即Mapper.xml的namespace是此接口的路径 */
public class MybatisMapperTest { @Test public void testMapper() throws Exception{ //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //SqlSession帮我生成一个实现类 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=userMapper.findUserById("3"); System.out.println(user); } }
public User findUserById(String id); }
Junit单元测试