mybatis框架的使用 maven+mybatis 通过数据库访问数据

mybatis框架

ORM 框架:    Object Relationship Model 对象关系模型
    持久层框架 (数据持久化)

MyBatis 本是apache的一个开源项目iBatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

新建一个maven project ,项目资源结构如下

首先我们开始配置maven:pom.xml    导入mybatis框架的依赖jar包

<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.0</modelVersion>
  <groupId>com.bwf</groupId>
  <artifactId>maven01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>maven01</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
  	<!-- 单元测试 -->
    <!-- https://mvnrepository.com/artifact/junit/junit -->
	<dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit</artifactId>
	    <version>4.12</version>
	    <scope>test</scope>
	</dependency>
	<!-- 日志 -->
	<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-simple</artifactId>
	    <version>1.8.0-beta2</version>
	    <scope>test</scope>
	</dependency>
	<!-- mybatis框架 -->
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.6</version>
	</dependency>
	<!-- mysql依赖 -->
	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
	<dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	    <version>8.0.12</version>
	</dependency>
  </dependencies>
  <!--  定义项目比对JDK版本,至少需要这一个    右键项目 maven >>> update project...
  		可以重新加载jar包  如果没有这个配置,就会将jdk设置成maven默认的jdk而有了这个配置,
  		就会加载我们所需要的jdk -->  
   <build>
  	<plugins>
       	<plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <version>3.5.1</version>  
            <configuration>  
                <source>1.8</source> 
                <target>1.8</target> 
            </configuration>  
        </plugin>
  	</plugins>
  </build>
</project>

要使用mybatis框架,当然要配置mybatis的配置文件  mybatis-config.xml

配置文件中就是一对<configuration>标签中 依次写入三部分:1、模型对象,即java实体类对象,写在<typeAliases>标签中,2、环境配置,包括开发环境、生产环境等,比如配置数据库连接信息,即配置一个数据库事物管理器,写在<environments default="development">标签中,3、ORM配置,即将数据库中的表与java实体类相映射,写在<mappers>标签中;这三个部分的顺序不可乱。

<?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>
    <!--  1. 模型对象   -->
    <typeAliases> 
    	<!-- 定义实体类的地方 -->
        <typeAlias alias="User" type="com.bwf.entity.User"/> 
    </typeAliases> 
    <!--  2. 数据库连接信息   -->
    <environments default="development">
    	<!-- 开发环境 -->
        <environment id="development">
        	<!-- 事务管理器:基于jdbc -->
	        <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
	            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
	            <!-- 
	            	jdbc参数:
	            	user 用户名
	            	password 密码
	            	useUnicode 是否使用Unicode字符集
	            	characterEncoding 当useUnicode为true是,指定字符编码(utf-8\gbk\gb2312)
	            	autoReconnect 当数据库断开时,是否自动连接
	            	autoReconnectForPools 是否使用针对数据库连接池的重连策略
	            	failOverReadOnly 自动重连成功后,连接是否设置为只读?
	            	maxReconnects autoReconnect设置为true时,重试连接的次数
	            	initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒
	            	connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本
	            	socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时   	
	            	timeZone\serverTimezone 设置时区
	            	useSSL 使用ssl协议
	             -->
	            <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis1?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=PRC&amp;useSSL=true" />
	            <property name="username" value="root"/>
	            <property name="password" value="123456"/>
            </dataSource>
        </environment>
        <!--生产环境<environment id="production"></environment>-->
    </environments> 
    <!--  3. ORM   -->
    <mappers>
    	<!-- 通过这个文件 把 数据库中的表 映射到 实体类上去 -->
        <mapper resource="com/bwf/mapper/User.xml"/>
    </mappers> 
</configuration>

既然配置好了模型对象,我们就需要一个User实体对象类 com.bwf.entity.User.class  一个最简单的实体类

package com.bwf.entity;
public class User {	
	private Integer id;
	private String username;
	private String gender;
	private Integer score;
	public User(Integer id, String username, String gender, Integer score) {
		super();
		this.id = id;
		this.username = username;
		this.gender = gender;
		this.score = score;
	}
	public User() {
		super();
	}
	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 getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public Integer getScore() {
		return score;
	}
	public void setScore(Integer score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", gender=" + gender + ", score=" + score + "]";
	}
}

mybatis配置中配置好了ORM,我们当然要配置好映射文件啦  配置  com/bwf/mapper/User.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">

<!-- 对应 dao 中的 接口 -->
<mapper namespace="com.bwf.dao.UserDao">
    
    <!--   根据Id查询一个模型对象   -->
    <!-- 对应 dao接口中的方法
    	id				->	方法名
    	parameterType	->	方法的形参类型
    	resultType		->	方法的返回值类型
      -->
    <select id="getUserById" parameterType="int" resultType="User">
        select * from `user` where id = #{id}
    </select>

</mapper>

上面的配置文件中,提到了UserDao接口,这就是我们调用jdbc的dao的接口,这里只需写接口,无需写实现,这就是mybatis框架为我们做的事,利用类反射来实现jdbc功能,下面根据上面的配置文件来写  com.bwf.dao.UserDao  接口

package com.bwf.dao;
import com.bwf.entity.User;
public interface UserDao {
	User getUserById(int id);
}

没错,就是这么简单,有了上面的这些配置文件、实体类和接口,接下来我们需要一个工具类来通过mybatis的功能来加载这些配置文件,获取数据库连接,并调用我们的接口UserDao中的方法,来得到我们的实体类User对象,他就是  com.bwf.utils.MyBatisUtils.java 

Reader对象用来加载mybatis的配置文件mybatis-config.xml,SqlSessonFactory对象通过reader对象读取的信息创造出SqlSession对象,通过getSession()方法实现

package com.bwf.utils;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtils {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;
	static {
		try {
			reader = Resources.getResourceAsReader("mybatis-config.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static SqlSession getSession() {
		return sqlSessionFactory.openSession();
	}
}

最后进行测试  com.bwf.test.test1.java

第一种方法直接通过SqlSession对象,通过类反射来调用接口UserDao的方法,不推荐使用

package com.bwf.test;
import org.apache.ibatis.session.SqlSession;
import com.bwf.entity.User;
import com.bwf.utils.MyBatisUtils;
public class Test1 {
	public static void main(String[] args) {	
		SqlSession session = MyBatisUtils.getSession();
		//不推荐使用
		User user =  session.selectOne("com.bwf.dao.UserDao.getUserById", 3);
		System.out.println(user);
	}
}

com.bwf.test.test2.java

这种方法通过SqlSession对象得到UserDao对象,再用Userdao对象调用其方法,推荐使用这种方法

package com.bwf.test;
import org.apache.ibatis.session.SqlSession;
import com.bwf.dao.UserDao;
import com.bwf.entity.User;
import com.bwf.utils.MyBatisUtils;
public class Test2 {
	public static void main(String[] args) {
		SqlSession session = MyBatisUtils.getSession();
		//推荐使用的方法
		UserDao userDao = session.getMapper(UserDao.class);
		User user = userDao.getUserById(5);
		System.out.println(user);	
	}
}

.sql文件

# MySQL-Front 5.1  (Build 4.2)

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40101 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;
/*!40103 SET SQL_NOTES='ON' */;


# Host: localhost    Database: mybatis1
# ------------------------------------------------------
# Server version 5.5.20

DROP DATABASE IF EXISTS `mybatis1`;
CREATE DATABASE `mybatis1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mybatis1`;

#
# Source for table user
#

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL DEFAULT '',
  `gender` char(4) NOT NULL DEFAULT '',
  `score` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#
# Dumping data for table user
#

INSERT INTO `user` VALUES (1,'jack','男',90);
INSERT INTO `user` VALUES (2,'Tom','男',60);
INSERT INTO `user` VALUES (3,'张三','男',70);
INSERT INTO `user` VALUES (4,'李四','女',99);
INSERT INTO `user` VALUES (5,'王五','女',60);
INSERT INTO `user` VALUES (6,'赵六','女',80);

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

猜你喜欢

转载自blog.csdn.net/bright_light12345/article/details/82760570