从0到1学JAVA之第六天–Mybatis入门学习

By | 11月 18, 2017

今天完成的任务:

1.ORM模型是什么?

ORM模型是Object  Relational Mapping,意为对象关系映射。所有的ORM模型都是在JDBC的基础上进行了封装,对JDBC存在的缺陷加以弥补。

ORM模型是数据库的表和简单Java对象(POJO)的映射关系模型,解决数据库数据与POJO对象之间的相互映射。这种模型提高了数据库数据与POJO之间转化的效率。

知名的两个框架Hibernate和MyBatis都是ORM模型。

2.Hibernate框架的优点和缺点?

优点

  • 消除代码的映射规则,配置位置被分离到了XML或者注解里。
  • 数据库连接也是在XML中配置。
  • 在会话中操作的知识Session对象,不需要操作多个对象。
  • 关闭资源时只需要关闭一个Session。

缺点

  • 全表映射,更新数据需要发送全部字段。
  • 无法根据不同的条件组装不同 的SQL。
  • 多表联查和复杂SQL查询时需要自己写SQL语句,数据返回后需要自己组装为POJO。
  • 不能有效支持存储过程。
  • HQL性能较差。大型互联网系统需要优化SQL的问题Hibernate无法解决。

3.MyBatis是什么?

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的持久层框架。MyBatis需要手工匹配POJO、SQL和映射关系,弥补了Hibernate的不足,当然也具有自动映射的功能,大大提高开发效率和灵活性。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

4.入门学习:利用Mybatis连接数据库并从数据库查询数据。

(1)数据库结构:

(2)JAVA文件结构:

(3)Config.xml    #Mybatis配置文件#

<?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">
<configuration>
     <typeAliases>
     		<typeAlias alias="job" type="pers.testMybatis.Job"/>
     </typeAliases>
     <environments default="development">
		<environment id="development">
			<!-- 采用jdbc事务管理 -->
			<transactionManager type="JDBC"/>
			<!-- 配置数据库连接 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ylxjava"/>
				<property name="username" value="root"/>
				<property name="password" value=""/>
			</dataSource>
		</environment>
	</environments>
     <mappers>
      	<mapper resource="pers/testMybatis/JobMapper.xml"/>
     </mappers>
</configuration>

   (4)Job.java   #创建对应yl_job表中的各个字段操作的相关类,各包含get和set两种方法。#创建包pers.testMybatis,并在其目录下创建Job.java#

package pers.testMybatis;

public class Job {
     private long jid;
     private String jname;
     private int number;
     private long create_at;
     private long update_at;
     
     public long getJid(){
    	 return jid;
     }
     public void setJid(long jid){
    	 this.jid = jid;
     } 
     public String getJname(){
    	 return jname;
     }
     public void setJname(String jname){
    	 this.jname = jname;
     }
     public int getNumber(){
    	 return number;
     }
     public void setNumber(int number){
    	 this.number = number;
     }
     public long getCreate_at(){
    	 return create_at;
     }
     public void setCreate_at(long create_at){
    	 this.create_at = create_at;
     }
     public long getUpdate_at(){
    	 return update_at;
     }
     public void setUpdate_at(long update_at){
    	 this.update_at = update_at;
     }
}

   (5)JobMapper.xml    #Job类对应的映射文件#

<?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="pers.testMybatis.JobMapper">
	<select id="getJob" parameterType="long" resultType="job">
	    select * from yl_job where jid = #{jid}
	</select>
</mapper> 

   (6)Test.java    #测试Mybatis的配置以及Job类等各个文件是否正确#

package pers.testMybatis;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.Date;

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 pers.testMybatis.*;

public class Test {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;
    
    static{
    	try{
    		reader = Resources.getResourceAsReader("Config.xml");
    		sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    }
    public static String TimeToDate(Long t){
            String res;
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date(t);
            res = simpleDateFormat.format(date);
            return res;
    }
    
    public static void main(String[] args){
    	SqlSession session = sqlSessionFactory.openSession();
    	try{
    		Job job = (Job) session.selectOne("pers.testMybatis.JobMapper.getJob", 12);
    		if(job != null){
    			String jobinfo = "ID: "+job.getJid()+" "+"职位名称: "+job.getJname()+" 数目: "
    		+job.getNumber()+" 创建时间: "+TimeToDate(job.getCreate_at());
    			System.out.println(jobinfo);
    			System.out.println("查询成功");
    		}
    	}catch(Exception e){
    		e.printStackTrace();
    	}finally{
    		session.close();
    	}
    }
}

(7)测试结果:

至此,Mybatis已经配置成功并且完成了从数据库查询数据。

明天进行的任务

1.学习junit相关知识。

遇到的问题

1.错误原因是Config.xml文件的位置和内容本身。

org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 40; 必须声明元素类型 "enviroment"。
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:51)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:35)
	at TestMybatis.Test.<clinit>(Test.java:15)
Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 40; 必须声明元素类型 "enviroment"。
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:253)
	at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:117)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.<init>(XMLConfigBuilder.java:60)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:48)
	... 2 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 40; 必须声明元素类型 "enviroment"。
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:396)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(XMLDTDValidator.java:1906)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:742)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1359)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:251)
	... 5 more
Exception in thread "main" java.lang.NullPointerException
	at TestMybatis.Test.main(Test.java:21)

2.错误提示如下,原因是Job类的映射文件JobMapper.xml文件中的mapper标签下namespace目录空间指向错误,因此在写配置文件一定要注意细节。

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for pers.testMybatis.jobMapper.getJob
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for pers.testMybatis.jobMapper.getJob
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:62)
	at pers.testMybatis.Test.main(Test.java:24)
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for pers.testMybatis.jobMapper.getJob
	at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:791)
	at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:631)
	at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:624)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:103)
	... 3 more

具体报错图片如下:

收获

1.学习了如何使用Mybatis对数据库进行操作,同时也掌握了如何将时间戳转化为时间。