MyBatis的Dao层开发有两种方式:1. 传统开发方式 2. 代理开发方式
1. 传统开发方式(直接访问映射xml文件的方式)
具体操作顺序:
1. 首先创建工具类 MyBatisUtils ,减少重复代码
2在 UserMapper.xml 中写下需要的sql语句
3. 在UserDaoImpl中写具体的实现类,同时创建UserDao接口(主要是规范)
4. 在MyBatisTest(即增删改查处)调用接口 UserDao 中的方法。
MyBatisUtils
工具类
public class MyBatisUtils {
static private SqlSessionFactory sqlSessionFactory = null ;
static {
try {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
}catch (Exception e){
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession() ;
}
}
根据用户名查询
实现类
//根据用户名查询信息
public User queryByName(String username){
SqlSession ss = MyBatisUtils.getSession(false);
User user = ss.selectOne("userMapper.findByName",username);
ss.close();
return user;
}
测试类
public void test3() throws IOException {
UserDaoImpl ud = new UserDaoImpl();
Scanner input = new Scanner(System.in);
System.out.println("用户名:");
String username = input.nextLine();
User user = ud.queryByName(username);
System.out.println(user);
}
增加用户操作
实现类
//增加用户
public int insertUser(User user){
Scanner input = new Scanner(System.in);
System.out.println("用户名:");
String username = input.nextLine();
System.out.println("密码:");
String password = input.nextLine();
user.setUsername(username);
user.setPassword(password);
SqlSession ss = MyBatisUtils.getSession(true);
int row1 = ss.insert("userMapper.save",user);
ss.close();
return row1;
}
测试类
@Test
public void test4() throws IOException {
UserDaoImpl ud = new UserDaoImpl();
User user = new User();
int row = ud.insertUser(user);
System.out.println(row);
}
2. 代理开发方式(接口代码+映射规则+xml映射文件)
采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是企业开发的主流。
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根 据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper 接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的全限定名相同
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
具体操作顺序:
1. 首先在 UserMapper2.xml 中写下需要的sql语句
2. 创建UserMapper接口
3. 在MyBatisTest(即增删改查处)调用接口 UserMapper 的方法
遇到的问题:
1. 代理开发中 由于接口 UserMapper 没有对应的实现类,如何知道接口 UserMapper 中的方法就是在 UserMapper2.xml的方法
解决办法:在 UserMapper2.xml 中的
2. 在用户修改操作中控制台显示用户信息更改成功,但是在数据库中信息却没有被修改
解决办法:在最后没有写执行事务操作 sqlSession.commit();
修改操作updateUser
@Test
public void test5() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper um = sqlSession.getMapper(UserMapper.class); //根据类类型获取实例
Scanner input = new Scanner(System.in);
System.out.println("ID:");
String id = input.nextLine();
System.out.println("用户名:");
String username = input.nextLine();
System.out.println("密码:");
String password = input.nextLine();
User user = new User();
user.setId(Integer.parseInt(id));
user.setUsername(username);
user.setPassword(password);
int row2 = um.updateUser(user);
sqlSession.commit();//执行事务操作
System.out.println(row2);
sqlSession.close();
}
删除操作 delUser
@Test
public void test6() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper um = sqlSession.getMapper(UserMapper.class); //根据类类型获取实例
Scanner input = new Scanner(System.in);
System.out.println("用户名:");
String username = input.nextLine();
User user = new User();
user.setUsername(username);
um.delUser(username);
sqlSession.commit();//执行事务操作
sqlSession.close();
}



