【资源准备】
【下载】
- 准备一个名为MySource的文件夹,用于存放资源文件。
- 下载MyBatis。选择的是mybatis-3.5.2。
- 官网下载MySql驱动包(java)选择的是mysql-connector-java-8.0.17,点此选择其他版本。
- 为了高效编程,避免编写XML文件时使用不合法的元素,需要用到mybatis-3-config.dtd和mybatis-3-mapper.dtd两个文件。
- 为了更好地监视代码中变量的变化和跟踪代码的运行轨迹,同时充当开发环境中的调试器,会用到日志组件,可选择Apache的log4j组件,点此下载(选择apache-log4j-2.12.1-bin.zip)(最终选择log4j-1.2.17.jar和log4j-2.0版本)。
- 当然,为了让项目性能更加好一点,我们更愿意使用简单记录日志的方法,因此我们还要下载slf4j简单日志门面服务于log4j。
- 下载ASM(java字节码操纵框架,它能动态生成代理类或在装载时修改类),选择asm-6.1.jar。
- 下载CGLIB(代码生成类库。它简化了asm的操作,实现了在运行期动态生成新的class)选择cglib-3.0。
- 下载commons-logging(它是Apache commons类库(通用类库)中的一员。commons-logging具有在不修改源码的基础上,灵活使用选择日志方式的功能)。选择commons-logging-1.2-bin。
- 下载javassist(一种动态字节码生成框架,它支持两种API,Java语言级别和字节码级别。它可以通过配置,在程序运行时,生成临时的java代码,来实现当前需要的特定功能的框架,查看详细介绍)。选择javassist-3.18.0。
- 下载junit( Java编程语言的单元测试框架,查看详细介绍)。选择junit-4.10。
- 下载完成后,如下图所示:
【筛选】
- 将上列下载的压缩包解压,筛选出以下文件,另存在一个名为MyBatisSource的文件夹下,如下图所示:
【数据库准备】
1.建立一个名为hr_management的MySQL数据库,添加一张表结构如下图所示的名为user的数据表:
【插入表数据】
【环境配置】
- 打开eclipse软件,点击Window下拉选择Preferences,在左侧点击Java--->Build Path --->User Libraries,点击右侧New...按钮新建名为MyBatis的Library,单击ok按钮完成建立,如下图所示:
- 点击右侧的Add External JARs...按钮,找到刚才准备好的MyBatisSource文件夹,选中下列文件(除去mysql-connector-java-8.0.17文件以外),添加进去:
- 点击Apply and Close按钮完成Library的配置:
- 新建名为MyBatis01的Java Project项目,右击该项目,选择Build Path --->Configure Build Path。如下图所示添加User Library:
点击Next>按钮,接着,将刚才配置好的MyBatis添加进去,最后点击Apply and Close完成添加:
点击上面的Apply and Close按钮完成。
【部署文件】
项目MyBatis01的文件部署结构如下图所示:
【编辑文件】
mybatis-config.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">
<configuration>
<environments default=""><!-- 定义所有的数据库连接,并指定使用哪一个数据源 -->
<environment id=""><!-- 定义数据源名称 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED"><!-- 定义一个数据源,连接方式为数据库连接池方式 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/hr_management?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="HackerAC@DB2019"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mapper/UserMapper.xml"/>
</mappers>
</configuration>
UserMapper.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.mapper.UserMapper"><!-- 表示声明一个数据库操作包名 -->
<!-- 声明数据库的操作方法 -->
<!-- 查询全部内容 -->
<select id="selectAll" parameterType="int" resultType="com.pojo.User">
select * from user
</select>
</mapper>
User.java:
package com.pojo;
public class User {
private int id;
private String uname,city,sex;
public User() {}
public User(String uname, String city, String sex) {
this.uname = uname;
this.city = city;
this.sex = sex;
}
public int getId() {
return id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", uname=" + uname + ", city=" + city + ", sex=" + sex + ", getId()=" + getId()
+ ", getUname()=" + getUname() + ", getCity()=" + getCity() + ", getSex()=" + getSex() + ", getClass()="
+ getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";
}
}
IUserDAO.java:
package com.mapper;
import java.util.List;
import com.pojo.User;
public interface IUserDAO {
public List<User> selectAll() throws Exception;
}
UserServiceImpl.java:
package com.service.impl;
import java.io.InputStream;
import java.util.List;
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 com.mapper.IUserDAO;
import com.pojo.User;
public class UserServiceImpl implements IUserDAO {
public List<User> selectAll() throws Exception{
//业务逻辑的编写
//1.读取mybatis-config.xml并运行
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.使用is输入流创建SessionFactory
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
//3.创建数据库连接
SqlSession session = build.openSession();
//4.调用Mapper文件中声明的Sql语句
List<User> users = session.selectList("com.mapper.UserMapper.selectAll");
return null;
}
}
Test.java:
package test;
import com.service.impl.UserServiceImpl;
public class Test {
public static void main(String[] args) {
// 调用User的实现类,完成数据库查询
UserServiceImpl userImpl=new UserServiceImpl();
try {
userImpl.selectAll();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【报错解决】
【错误1】:Failed to instantiate SLF4J LoggerFactory
【解决错误1】:
查看我们配置的Library:MyBatis中的文件,发现理论上log4j-api-2.12.1.jar文件和log4j-core-2.12.1.jar文件以及log4j-2.12.1.jar文件三个文件协作才能正常完成日志功能,但是我们下载的log4j-api-2.12.1版本中官方没有给出log4j-2.12.1.jar的文件,目前还不明白是什么原因,但是已经找到一条解决办法,那就是下载较低的版本如log4j-1.2.17.jar版本配合log4j-core-2.0-rc1.jar以及log4j-api-2.0-rc1.jar使用。构建好的名为MyBatis的Library如下图所示:
【错误2】:
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
【解决错误2】:在MyBatis01的文件根目录下创建名为log4j.properties的文件,然后编辑内容为:
# Global logging configuration
log4j.rootLogger=DEBUG,stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
如下图所示:
【错误3】
### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.pojo.User with invalid types () or values (). Cause: java.lang.NoSuchMethodException: com.pojo.User.<init>()
### The error may exist in com/mapper/UserMapper.xml
### The error may involve com.mapper.UserMapper.selectAll-Inline
### The error occurred while setting parameters
### SQL: select * from user
【解决错误3】
由报错内容“java.lang.NoSuchMethodException: com.pojo.User.<init>()”可知,该项目的名为User的pojo没有无参构造(或初始化)方法,向其中添加一个无参构造方法即可。
【运行结果】