搭建java mybatis框架_搭建一个简单的Mybatis框架

直接进入正题,如何搭建一个纯Mybatis框架?过程中间可能会遇到各种各样的问题,简单整理在此。

准备工作

搭建Mybatis,需要的两个核心jar包,一个是任意Mybatis版本的包,另一个是数据库驱动包。这里的环境如下:

mybatis-3.4.6.jar

mysql-connector-java-8.0.13.jar

二者的pom依赖可去https://mvnrepository.com/查找,然后创建一个简单的java项目,这里以Maven项目为例。

相关配置

1、pom.xml文件

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

com.szh.Mybatis_test

Mybatis_test

war

0.0.1-SNAPSHOT

mybatis Maven Webapp

http://maven.apache.org

UTF-8

com.szh

mysql

mysql-connector-java

8.0.13

org.mybatis

mybatis

3.4.6

Mybatis_test

2、 Mybatis核心配置文件conf.xml

当然,dataSource的四个属性也可以写在一个单独的配置文件里,然后在conf.xml中使用引用即可。

conf.xml是Mybatis的核心配置文件,放在下面一级目录:

207bd78c69b1ee1ea42fd564e48d0844.png

3、Mybatis接口映射文件personMapper.xml

select * from person where id=#{id}

personMapper.xml文件是Mybatis每个实体类对应的接口映射文件,一般统一放在如下目录:

0ba206d6d51908f6a0e70d7c9791d181.png

4、测试主类Test.java

package com.szh;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.szh.po.PersonPo;

public class Test {

public static void main(String[] args) {

//mybatis的配置文件

String resource = "conf.xml";

//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)

InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);

System.out.println(Test.class.getClassLoader().getResource(resource).getFile());

//构建sqlSession的工厂

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

//Reader reader = Resources.getResourceAsReader(resource);

//构建sqlSession的工厂

//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

//创建能执行映射文件中sql的sqlSession

SqlSession session = sessionFactory.openSession();

/**

* 映射sql的标识字符串,

* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,

* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL

*/

//在命名空间“com.szh.mapper.personMapper”中定义了一个名为“getPerson”的映射语句,

//这样它就允许你使用指定的完全限定名“com.szh.mapper.personMapper.getPerson”来调用映射语句,

//格式:命名空间名(namespace)+映射语句名(id)

String statement = "com.szh.mapper.personMapper.getPerson";//映射sql的标识字符串

//执行查询返回一个唯一user对象的sql

PersonPo p = session.selectOne(statement, 1);

System.out.println(p.getId());

System.out.println(p.getName());

System.out.println(p.getAddress());

}

}

以上就是主要配置步骤,接下来run一下工程,看看结果,看看可能出现什么样的问题。

疑难杂症

1、personMapper.xml文件找不到,具体日志如下:

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:

### Error building SqlSession.

### The error may exist in com.szh.mapper.personMapper.xml

### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com.szh.mapper.personMapper.xml

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)

at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)

at com.szh.Test.main(Test.java:20)

com.szh.mapper.personMapper.xml文件明明存在,目录也正确,却报这个异常,这时我们需要确认conf.xml中是否正确定义了每一个mapper,注意mapper接口文件路径要以正斜杠分隔开,正确的写法如下:

2、数据库时区问题,具体日志如下:

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:

### Error querying database. Cause: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

### The error may exist in com/szh/mapper/personMapper.xml

### The error may involve com.szh.mapper.personMapper.getPerson

### The error occurred while executing a query

### Cause: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)

at com.szh.Test.main(Test.java:38)

那么,我们需要给数据库连接url添加以下参数:

3、查询到的某些属性为null,如下:

1

马二

null

去数据库直接查看id为1的person,地址不为null才对。这种情况有可能是mapper接口文件里select标签的resultType属性直接写了实体类的路径,而此实体类的address属性名与表person的列名不对应。例如,列名为addr,而属性名为address。其实熟悉Mybatis,可以使用resultMap来手动映射列与属性名之间的关系,以及级联等等,这里不多赘述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值