发表于: 2020-05-01 21:55:39
1 1254
今天完成的事情:Mybaits框架的初步学习
一、框架
框架是软件发开的一套解决方案,不同框架解决不同的问题 。框架封装了很多细节,方便开发者使用,提高开发效率。
三层架构
表现层:展示数据
业务层:处理业务需求
持久层:和数据交互
二、Mybatis
Mybatis是基于java的持久层框架,用于和数据库交互(CRUD操作)使开发者只需要关注sql本身!
工作原理:
mybaits通过xml 或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生辰最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射为java对象并返回,采用ORM思想实现结果集的封装
ORM Object Relational Mappging 对象关系映射
1. 将数据库属性与实体类属性对应起来,让开发者操作实体类实现操作数据库表,例如:
user qiaozhaonnian
qq 1589690721
city 郑州
2.mybatis环境搭建
①.创建maven工程POM写好依赖(注意红色标记地方要写mybatis,默认是mybatis-parent 这样的话就找不到导入的jar包了)
②.创建实体类和dao的接口
在src/main/java/com/itxzy/dao 下创建接口类 IUserDao
public interface IUserDao {
/**
* 查询所有操作
*/
List<User> findAll();
}
在src/main/java/com/itxzy/domain下创建实体类 User
在这里了解到 int 与 Ingeter 的区别
Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)
Integer 是类,默认值为null,int是基本数据类型,默认值为0
Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。
getter和setter方法的作用
封装数据,对私有属性进行封装,只是暴露出public方法来访问。保护属性本身不被篡改。只能单一方向被访问
Serializable
在这里用到了Serializable这个接口。它是启用其序列化功能的接口,序列化的作用就是方便远程调用
public class User implements Serializable {
private Integer ID;
private String name;
private Integer QQ;
public Integer getID() {
return ID;
}
public void setID(Integer ID) {
this.ID = ID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getQQ() {
return QQ;
}
public void setQQ(Integer QQ) {
this.QQ = QQ;
}
@Override
public String toString() {
return "User{" +
"ID=" + ID +
", name='" + name + '\'' +
", QQ=" + QQ +
'}';
}
}
最后生成一个 toString
③.在src/main/resource创建mybits的主配置文件 SqlMapConifg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mysql的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源()连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306//student"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/itxzy/dao/IUserDao.xml"/>
</mappers>
</configuration>
④.在src/main/resource/com/itxzy/dao 下创建映射配置文件 IUserDao.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">
<mapper namespace=" com.itxzy.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.itxzy.domain.User">
select * from jojo
</select>
</mapper>
注意事项:IUserDao 和 IUserMapper 一样;
mybatis的映射配置文件必须和dao接口的包结构相同;
配置包结构 接口包结构
映射配置文件的mapper 标签namespace属性的取值必须是dao接口的全限定类名;
映射配置文件的操作配置(select),id 属性的取值必须是dao接口的方法名;
接口方法名 配置id属性
做到注意事项红色所说部分,那么在开发的时候就不需要写dao的实现类
代码如下
public class MybatisTest {
public static void main(String[] args) throws Exception{
//1.读取配置文件
InputStream in = Resources.class.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
在完成代码的编写之后 点击运行出现了空指针异常,显示在23行,我查看了23行的代码,没问题,然后就去网上查找关于空指针的有关知识
空指针产生原因
(1)当一个对象不存在时又调用其方法会产生异常 例如:obj.method() // obj对象不存在
(2)当访问或修改一个对象不存在的字段时会产生异常 例如:obj.method() // method方法不存在
(3)字符串变量未初始化
空指针的解决办法:
重点关注报错发生的所在行,通过空指针异常产生的两条主要原因诊断具体的错误。同时为了避免空指针的发生,最好在做判断处理时将“null”或者空值放于设定的值之前。
我就根据我的代码来排除 ,我先看23行,我去查找SqlSessionFactory,发现我这样使用是可以的,因为我已经new了一个对象 原因1排除
然后就是方法使用方式不对,我看向了下边这行代码,由于在网上找到原文的后半段是 Resources.getResourceAsStream("xxx")
InputStream in = Resources.class.getResourceAsStream("SqlMapConfig.xml");这 但是我直接输入get 没有出现后边的模块,我意识到这样不对,然后在网上找到了正确的用法 Resources.class.getResourceAsStream( / "xxx")
InputStream in = Resources.class.getResourceAsStream("/SqlMapConfig.xml")
!!!!!!!!!!!!!!斜杠!!!!!!!!!!!!!!!!
终于完成,圆满结束
三、注解把IUser.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
明天计划的的事情:Mybaits CRUD
评论