mybatis框架是一个基于Java的持久层框架,支持自定义框架,本篇文章主要是了解mybatis框架,对mybatis框架做一个简单的入门,了解mybatis框架是如何实现java持久层的操作的,比对于传统的jdbc操作mybatis框架的优势在哪里
知识是用来共享的,但是希望转载的时候能注明原地址,本文作者雷雨
软件的半成品,解决了软件过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率
- ORM(Object Relational Mapping)对象关系映射,将程序中一个对象和表中中的一行数据一一对应
- ORM框架提供了持久化类与表的映射关系,在运行时参照文件的信息,把队象持久化到数据库中
- 存在大量的冗余代码(加载驱动,获取连接,释放连接)
- 手工创建Connection.Statement等
- 手工将结果集封装成实体队象
- 查询效率低,没有对数据库访问进行过优化(Not Cache)
- MyBatis本是Apache软件基金会的一个开源项目iBatis,2010年这个项目由apache asoftware foundation 迁移到了Goole Code,并且改名为MyBatis,2013年11月迁移到GitHub
- Mybatis是一个优秀的基于Java的持久层框架,支持自定义SQL,存储过程和高级映射
- Mybatis对原有JDBC操作进行了封装,几乎消除了所有JDBC代码,使开发者只需关注SQL本身
- MyBatis可以使用简单的XML或Annotation来配置执行SQL,并且自动完成ORM操作,将执行结果返回
构建好maven项目后再pom.xml的配置信息中
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>per.leiyugroupId>
<artifactId>Mybatis1artifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.6version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.26version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<target>1.8target>
<source>1.8source>
<encoding>UTF-8encoding>
configuration>
plugin>
plugins>
build>
project>
除了在pom.xml中写相关配置,还需要在配置文件中提供一个mybatis的配置文件(写详细的关于数据库和mybatis的配置信息)一般为了见名知意—mybatis-config.xml
<configuration>
<environments default="leiyu_mybaits">
<environment id="leiyu_mybaits">
<transactionManager type="JDBC">transactionManager>
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root" />
<property name="password" value="123456" />
dataSource>
environment>
environments>
<mappers>
<mapper resource="UserDaoMapper.xml"/>
mappers>
configuration>
create datebase mybatis default charset = uff8;
use mybatis;
create table t_user(
id int parmary key auto_increment,
username varchar(50),
passward varchar(50),
gender tinyint,
regist_time datetime
)defaault charset=utf8;
在数据库可视化工具或者IDea中集成的mysql来创建数据库和表 |
---|
package per.leiyu;
import java.util.Date;
/**
* @author 雷雨
* @date 2020/6/11 10:03
*/
public class User {
private Integer id;
private String username;
private String passward;
private Boolean gender;
private Date registTime;
public User() {
super();
}
public User(Integer id, String username, String passward, Boolean gender, Date registTime) {
this.id = id;
this.username = username;
this.passward = passward;
this.gender = gender;
this.registTime = registTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", passward='" + passward + '\'' +
", gender=" + gender +
", registTime=" + registTime +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassward() {
return passward;
}
public void setPassward(String passward) {
this.passward = passward;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Date getRegistTime() {
return registTime;
}
public void setRegistTime(Date registTime) {
this.registTime = registTime;
}
}
package per.Dao;
import per.leiyu.User;
/**
* @author 雷雨
* @date 2020/6/11 10:06
*/
public interface UserDao {
User queryUserById(Integer id);
}
告诉mybatis中的UserDao接口中方法执行的sql语句是什么,返回值是什么,需要的参数怎么提供给mybatis
mybatis框架中我们不再需要为dao层的抽象的接口创建实体类,而是使用xml文件来管理jdbc的操作
mybatis框架为我们把原本的注册驱动,获取连接,释放资源等等的方法进行了封装,简化我们的开发,我们只需要通过配置和调用封装好的方法就可以实现对jdbc的操作(内含了对数据库操作的优化)
<mapper namespace="per.Dao.UserDao">
<select id="queryUserById" resultType="per.leiyu.User">
select * from t_user where id =#{arg0}
select>
mapper>
仔细观察这个配置文件,你会发现我们把创建dao实现类,执行sql语句,把结果集封装为用户对象都交给mybatis为我们解决
我们写好了mapper的配置文件需要在mybatis-config的配置文件中对我们写好的mapper的配置文件启用
package per.leiyu.UserDao;
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 per.Dao.UserDao;
import per.leiyu.User;
import java.io.IOException;
import java.io.InputStream;
/**
* @author 雷雨
* @date 2020/6/11 10:21
*/
public class TestUserDao {
public static void main(String[] args) throws IOException {
//1.加载配置文件
InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
//2.构建 SqlSessionFactory的对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.通过SqlSession获取DAO实现类对象
//之前我们讲DAO的实现类不是我们亲自做的做的,是mybatis通过配置文件动态的早内存中通过反射为我们做动态的,
//我们看不到这个类,但是需要这个类完成我么的DAO的功能
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user1 = mapper.queryUserById(1);
User user2 = mapper.queryUserById(1);
System.out.println(user1);
System.out.println(user2);
}
}
获取到了数据库中的结果 (说明我们通过mybatis对数据库操作成功) |
---|
从上面测试类,我们可以看出,我们通过id值获取到了一个User对象,那么mybatis是如何将结果集封装为User对象的呢?
mybatis是如何将结果集封装为对象? |
---|
由于regist_time和registTime的属性名,列名不相同,导致了没有将查询结果集中的相关数据进行赋值.
解决方式可以在查询时使用别名,别名为在java类中想要对应的属性名.
select id,username,passward,gender,regist_time as registTime from t_user where id=#{arg0}
在mybatis-config.xml文件中修改mapper文件的路径
在pom.xml文件最后追加标签,以便可以将文件复制到classes中,并在程序运行时正常读取
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>*.xmlinclued>
<include>**/*.xmlinclude>
includes>
<filtering>truefiltering>
resource>
resources>
之前我们把数据库相关的配置封装在了mybatis的配置文件中,因为mybatis的确是要来帮助我们操作数据库,但是关于数据库的账号密码这些关于数据库的细节配置是时常会修改的,因此期望能把数据库的细节配置和mybatis的配置分离开.
在配置文件中添加数据库的配置:jdbc.properties
#jdbc.properties
jdbc.driver =com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true
jdbc.username=root
jdbc.passward=123456
修改后的mybatis-config.xml的配置
需要引入数据的配置文件jdbc.properties并且把其中的值赋给xml配置文件
这里赋值使用了$
<configuration>
<properties resource="jdbc.properties" />
<environments default="leiyu_mybaits">
<environment id="leiyu_mybaits">
<transactionManager type="JDBC">transactionManager>
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.passward}" />
dataSource>
environment>
environments>
<mappers>
<mapper resource="per/Dao/UserDaoMapper.xml"/>
mappers>
configuration>
这样mybatis-config.xml中相关于数据库的配置就和数据库的配置jdbc.proerties相关联了,jdbc.properties的配置发生改变,在mybatis-config.xml中相关的配置也会发生改变
我们之前要通过mybatis操作数据库在结果集的返回类型,我们将其包装为我们的一个实体类的类型
没起别名之前,我们需要写这个实体类的全路径 |
---|
每次都写实体类的全路径避免不要写写很多热冗余的代码,我们期望给实体类起一个别名,那么就需要在mybatis-config.xml中进行配置
<configuration>
<typeAliases>
<package name="per.leiyu"/>
typeAliases>
configuration>
在pom.xml中导入依赖
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
给log4j创建一个配置文件:名字必须为log4j.properties
#Global logging configuration
log4j.rootLogger=DEBUG,stdout
#Mybatis logging configuration
log4j.logger.org.mybatis.example.BlogMapper=TRACE
#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
项目结构 |
---|