MyBatis3---Dao开发方法
Dao开发方法
- 有两种:传统Dao方法和Mapper代理
- 基本不用传统Dao方法—>因为麻烦
- 推荐使用Mapper代理
1.传统Dao方式
- UserDao接口
package com.neuedu.Dao;
import com.neuedu.entity.User;
public interface UserDao {
void insertUser(User user);
}
- UserDaoImpl 类,实现UserDao接口
package com.neuedu.Dao;
import com.neuedu.entity.User;
import com.neuedu.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class UserDaoImpl implements UserDao{
private SqlSessionFactory sqlSessionFactory;
@Override
public void insertUser(User user) {
sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
// using
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
int insert = sqlSession.insert("com.neuedu.mapper.UserMapper.insertUser", user);
System.out.println(insert);
sqlSession.commit();
}
}
}
- MyBatisUtils
package com.neuedu.utils;
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 MyBatisUtils {
public static SqlSessionFactory getSqlSessionFactory(){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
SqlSessionFactory sqlSessionFactory=null;
try {
// 读取配置文件
inputStream = Resources.getResourceAsStream(resource);
// 通过SqlSessionFactoryBuilder对象 来获取一个SqlSessionFactory对象
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
return sqlSessionFactory;
}
public static SqlSession getSqlSession(){
return getSqlSessionFactory().openSession();
}
}
- UserDaoImplTest 测试
package com.neuedu;
import com.neuedu.Dao.UserDaoImpl;
import com.neuedu.entity.User;
import org.junit.Test;
public class UserDaoImplTest {
@Test
public void insertUser(){
UserDaoImpl userDao = new UserDaoImpl();
User user = new User();
user.setUsername("小宋");
userDao.insertUser(user);
}
}
拓展:什么是Dao层,Entity层,Service层,Utils层?
Dao层
- DAO(Date Access Object)模型就是写一个类,把访问数据库的代码封装起来,DAO在数据库与业务逻辑(Service)之间.
- Dao是数据访问层,Dao的作用是封装对数据库的访问---->增删改查,不涉及业务逻辑,只是达到某个条件获得指定数据的要求
Entity层
- Entity层—>就是实体层,放置一个个实体,以及相应的set,get方法.
- 如果想要对数据库进行一些操作(比如说读取)的话,就要先写entity层.
Service层
- Service被称为业务逻辑层,就是处理逻辑上的业务,而不去考虑具体的实现
- Service层通常使用接口来定义,为什么?
- java中接口是多继承的,而类是单继承的,如果需要一个类实现多个service,就可以用接口来实现,用类定义service就没那么灵活
- 要提供不同的数据库的服务时,我们只需要面对接口用不同的类实现即可,而不用重复地定义类
Servlet层
- Servlet(Server Applet)是java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容
- Servlet实现过程
- (1)客户端发送请求至服务器端
- (2)服务器将请求信息送至Servlet
- (3)Servlet生成响应内容并将其传给服务器.响应内容动态生成,通常取决于客户端的请求
- (4)服务器将响应返回客户端
- Servlet可以完成以下任务
- (1)动态生成HTML文档
- (2)将请求转发给Servlet组件
- (3)读取客户端的Cookie,以及向客户端写入Cookie
- (4)访问服务器的资源,如数据库,XML,文件对象等
- Servlet的特点
- (1)Servlet对象,有Servlet容器(Tomcat)创建
- (2)Servlet是一个接口,位于javax.servlet包中
- (3)service方法用于接受用户的请求并返回响应
- (4)用户访问时多次被执行(可以统计网站的访问量)
Utils层
- Util是utility的缩写,是一个多功能,基于工具的包.
- 如字符串处理,日期处理等,(建立数据库之间的连接),是通用的,与业务无关的,可以独立出来的,可供其他项目使用
2.Mapper代理
-
(1)编写Mapper接口
接口定义有如下特点:
1.Mapper接口方法名和Mapper.xml中定义的statement的id相同
2.Mapper接口方法的输入参数类型和Mapper.xml中定义的statement的parameterType的类型相同
3.Mapper接口方法的输出参数类型和Mapper.xml中定义的statement的resultType的类型相同 -
也就是说,Mapper接口的编写格式是:resultType id(parameterType)
-
UserMapper 接口
package com.neuedu.mapper;
import com.neuedu.entity.User;
public interface UserMapper {
/**
* insertUser:现在要调用UserMapper.xml中的insertUser(注意:方法名一定是UserMapper.xml文件中有的)
* void:UserMapper.xml中的insertUser方法,没有要输出的值-->所以返回类型resultType为void
*User user:与UserMapper.xml中的parameterType相同
*/
void insertUser(User user);
void updateUser(User user);
User findById(Integer id);
void deleteById(Integer id);
}
- UserMapperTest2 测试
package com.neuedu;
import com.alibaba.fastjson.JSON;
import com.neuedu.entity.User;
import com.neuedu.mapper.UserMapper;
import com.neuedu.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Before;
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class UserMapperTest2 {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setup(){
sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
}
@Test
public void insertUser(){
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("李小四");
user.setSex("女");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
user.setBirthday(sdf.parse("2023-1-1"));
userMapper.insertUser(user);
sqlSession.commit();
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Test
public void updateUser(){
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(9);
user.setUsername("赵四");
user.setSex("男");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
user.setBirthday(sdf.parse("2023-1-1"));
user.setAddress("东北");
userMapper.updateUser(user);
sqlSession.commit();
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Test
public void findById(){
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user=mapper.findById(9);
System.out.println(JSON.toJSONString(user));
sqlSession.commit();
}
}
@Test
public void deleteById(){
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
mapper.deleteById(12);
sqlSession.commit();
}
}
}