发表于: 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




返回列表 返回列表
评论

    分享到