》 实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,经过SqlSessionFactory获取SqlSession来获取数据库操做对象。》java
package com.ts.dao; import com.ts.domain.Users; public interface UsersDao { //根据ID查询用户信息 Users findUserById(int id) throws Exception; }
package com.ts.dao.impl; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.ts.dao.UsersDao; import com.ts.domain.Users; public class UsersDaoImpl implements UsersDao { private SqlSessionFactory sqlSessionFactory; //构造函数注入SqlSessionFactory public UsersDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory =sqlSessionFactory; } /** * 1和3是模板代码 * 1.SqlSession sqlSession = getSqlSession(); * 2.业务逻辑 * 3.sqlSession.close(); */ @Override public Users findUserById(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); Users user = sqlSession.selectOne("Users.findUserById", id); sqlSession.close(); return user; }
缺点: 1.代码冗余,重复代码不少。sql
2.根据Users.xmlMapper映射文件的id获取SQL语句(Users.findUserById),硬编码在Java代码里了。数据库
3.调用SqlSession方法时,传入的参数编译期间不报错,不能及时发现错误。(如:sqlSession.selectOne("Users.findUserById","123");apache
根据接口编写规范:Mybatis能够自动生成Mapper接口实现类的代理对象session
1.编写UserMapper.java接口和UserMapper.xml的SQL映射文件app
package com.ts.dao; public interface UserMapper { public Users findUserById(int id) throws Exception; }
<mapper namespace="com.ts.dao.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.ts.domain.Users"> select * from Users where id = #{id} </select> </mapper>
2.Mybatis自动生成代理实现类须要遵循的规范
dom
->Mapper.xml的namespace 和 mapper.xml接口全限定名一致( 观察上面代码 )ide
->Mapper.java接口中的方法名和mapper.xml中每一个SQL的ID一致函数
->Mapper.java接口中的输入参数类型和mapper.xml中每一个SQL的输入参数指定的类型一致测试
->Mapper.java接口中的返回值参数类型和mapper.xml中每一个SQL的返回值指定的类型一致
3.测试( 不要忘记把mapper.xml添加到SqlMapConfig.xml中)
package com.ts.dao.test; 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; import org.junit.Before; import org.junit.Test; import com.ts.dao.UserMapper; import com.ts.domain.Users; public class UserMapperTest { private static SqlSessionFactory sqlSessionFactory; @Before public void before() throws IOException{ //经过输入流读取全局配置信息建立工厂 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //生成代理实现类 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Users user = userMapper.findUserById(1); //==>Users [id=1, name=田硕, sex=男, birth=Sat Apr 02 00:00:00 CST 2016, address=河南商丘] System.out.println(user); } }