Javaweb框架 Mybatis
Mybatis入门
三层架构:
表现层:展示数据
业务层:处理业务需求
持久层:和数据库交互
Mybatis是java持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,不需要花费精力去处理加载驱动创立连接等
ORM:Object Relational Mapping对象关系映射,就是把数据库表和实体类及实体类属性对应起来
Mybatis可以使得无需再写dao实现类,由dao的代理对象实现dao操作,如下
public class MybatiesTest {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂,把xml配置传给工厂构造类,此为“构造者模式”,优势:隐藏对象的构建细节,使用者直接调用方法即可
SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象,此为“工厂模式”,优势:不需要使用new,解耦,降低类之间的依赖关系
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dap接口代理对象,此为"代理模式",优势:不修改源码的基础上对已有方法增强
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<Student> stus = userDao.findall();
for(Student stu:stus){
System.out.println(stu);
}
//6.释放资源
session.close();
in.close();
}
}
1.构造者模式:隐藏对象的构建细节,使用者直接调用方法即可
2.工厂模式:不需要使用new,解耦,降低类之间的依赖关系
3.代理模式:不修改源码的基础上对已有方法增强
XML方式环境配置错误及解决方式:
1.Maven包导入问题:设置maven为idea默认的maven,并且在.m2目录下添加settings.xml文件,修改settings.xml其源为阿里云
2."http://mybatis.org/dtd/mybatis-3-config.dtd"显示为红色,则在DTD中加入网址
注解方式配置和XML方式配置的区别,注解开发不需要映射配置的XML即DAO类的XML,在Mybatis的SQL配置文件SqlMapConfig中mappers需将xml地址由resource改为类
Mybatis具体实现方式
Mybatis通过构建sql中的表与本地class的映射,把数据库表和实体类及实体类属性对应起来,即ORM(Object Relational Mapping)来实现数据库的增删改查
- IUserDao数据库接口类如下:
public interface IUserDao {
@Select("select * from student")
List<Student> findall();
@Insert("insert into student(sno,sname,ssex)values(#{sno},#{sname},#{ssex})")
void saveUser(Student stu);
@Delete("delete from student where sno = #{sno}")
void deleteUser(Integer sno);
@Select("select * from student where sno=#{sno}")
Student findbySno(Integer sno);
}
- 本地class类,包括其get,set方法
public class Student implements Serializable {
private Integer sno;
private String sname;
private String ssex;
private Date sbirthday;
public Integer getSno() {
return sno;
}
public void setSno(Integer sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public Date getSbirthday() {
return sbirthday;
}
public void setSbirthday(Date sbirthday) {
this.sbirthday = sbirthday;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", sname='" + sname + '\'' +
", ssex='" + ssex + '\'' +
", sbirthday=" + sbirthday +
'}';
}
}
- 使用构造者模式、工厂模式和代理模式构造本地类和数据库表的映射
public class AnnotationCURDTest {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Before
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlMapConfig.XML");
factory =new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
userDao=session.getMapper(IUserDao.class);
}
@After
public void destroy() throws IOException {
session.commit();
session.close();
in.close();
}
@Test
public void testSave(){
Student stu = new Student();
stu.setSno(110);
stu.setSname("张四");
stu.setSsex("男");
userDao.saveUser(stu);
}
@Test
public void delete(){
userDao.deleteUser(110);
}
@Test
public void find(){
Student stu= userDao.findbySno(101);
System.out.println(stu);
}
@Test
public void findall(){
List<Student> stu=userDao.findall();
System.out.println(stu);
}
}