在demomybatis的基础上,新建dao包,持久层,其中有IUserDao接口:
package com.bit.dao;
import com.bit.po.user;
//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exception
public interface IUserDao {
public int addUser(user user1) throws Exception;
public int modifyUser(int id,user user2)throws Exception;
public int delUser(int id)throws Exception;
public user queryUser(int id)throws Exception;
}
并写其实现类UserDaoImpl:(部分方法略,只体现查找)
package com.bit.dao;
import com.bit.po.user;
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 java.io.IOException;
import java.io.InputStream;
public class UserDaoImpl implements IUserDao {
//需要使用sqlSessionFactory和sqlSession
private SqlSessionFactory sqlSessionFactory=null;
//无参构造,new UserDaoImpl时也能new SqlSessionFactory
public UserDaoImpl()
{
String mybatisConfigFile="sqlMapConfig.xml";
InputStream is=null;
try {
is=Resources.getResourceAsStream(mybatisConfigFile);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public user queryUser(int id) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
user user1=sqlSession.selectOne("test.queryUserById",id);
return user1;
}
}
新建一个测试类MyBatisTest2,它相当于客户端,此时的测试类中不需要new SqlSessionFactory和SqlSession了:
package com.bit;
import com.bit.dao.IUserDao;
import com.bit.dao.UserDaoImpl;
import com.bit.po.user;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MybatisTest2 {
//只需要Dao
//此时没有Spring,自行创建
private IUserDao iUserDao=new UserDaoImpl();
@Test
public void queryUser()
{try {
user user1 = iUserDao.queryUser(2);
System.out.println(user1);
}
catch (Exception ex)
{ex.printStackTrace();}
}
}
运行结果为:
要用mapper代理的方式开发Mybatis:
静态代理 动态代理 AOP???
接口修改方法如下:
package com.bit.dao;
import com.bit.po.user;
import java.util.List;
//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exception
public interface IUserDao {
public user queryUserById(int myid)throws Exception;
public List<user> queryUserByName(String name)throws Exception;
public void modifyUser(user user1) throws Exception;
public void delUser(int id)throws Exception;
public user queryUser(int id)throws Exception;
}
如果用户有很多个订单,难道需要很多个Impl类? 利用动态代理,代理对象,像反射一样,运行期创建。因此不再需要UserDaoImpl。
那么只剩下接口,没有实现类。——通过代理Proxy,动态代理需要实现一些规则。约定优于配置。
在mapper包下新建user.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">
<!--namespace需要和接口名一致-->
<mapper namespace="com.bit.dao.IUserDao">
<!--statement 的id需要与方法名一致-->
<!--parameterType需要与方法参数类型一致-->
<!--resultType需要与方法返回类型一致-->
<select id="queryUserById" parameterType="int" resultType="com.bit.po.user">
select *from user where userid=#{value};
</select>
<select id="queryUserByName" parameterType="String" resultType="com.bit.po.user">
select * from user where username=#{value};
</select>>
<update id="modifyUser" parameterType="com.bit.po.user">
update user set username=#{userName} where userid=#{userID};
</update>
<delete id="delUser" parameterType="int">
delete from user where userid=#{value};
</delete>
</mapper>
新建单元测试MybatisTest3:
package com.bit;
import com.bit.dao.IUserDao;
import com.bit.po.user;
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 java.io.IOException;
import java.io.InputStream;
public class MybatisTest3 {
private SqlSessionFactory sqlSessionFactory;
@Before
public void testInit()
{
String mybatisConfigFile="sqlMapConfig.xml";
InputStream is=null;
try {
is=Resources.getResourceAsStream(mybatisConfigFile);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
//测queryById
//使用mapper动态代理
@Test
public void test()
{SqlSession sqlSession=sqlSessionFactory.openSession();
//代理对象与被代理对象实现同一接口,所以生成的代理对象也实现了IUserDao这个接口
try
{
IUserDao userDao=sqlSession.getMapper(IUserDao.class);
user user1=userDao.queryUserById(3);
System.out.println(user1);
}
catch (Exception ex)
{ex.printStackTrace();}
finally {
sqlSession.close();
}
}
}
再把user.xml的名字改成与接口名一致,并且放在同一个包下:
就可以通过包扫描;
<!--需要添加核心信息-->
<mappers>
<package name="com.bit.dao"/>
</mappers>
可以将dao层改名为mapper层。(现在改名叫mapper了。)
总结:
动态代理实现Mybatis的七个规则
规则1:workspace一致,
2:方法名与id名一致
3.方法参数与ParameterType一致
4.方法返回值与ResultType一致
5.接口与xml名字一致
6.接口与xml在同一个包下
7.通过包扫描