MyBatis连接MySQL数据库

牧云@^-^@ 提交于 2020-02-10 19:56:59

文章内容:使用MyBatis实现Java应用程序与数据库连接

开发环境:Windows10 64位机、Eclipse、jdk1.8、java语言、MySQL数据库

首先创建一个正常的java项目。
在这里插入图片描述
导入如下mybatis所需支持包:
在这里插入图片描述
使用eclipse导入包的过程如下所示
我一般喜欢在项目根目录下创建一个jar文件夹,用于保存所有本项目所导入的额外包
在这里插入图片描述
随后在项目MyBatisTemplate上右击,选择Build Path下的Configure Build Path…
在这里插入图片描述
单击-----添加额外的jar包,找到项目根目录下的jar文件夹,全选所有jar包单击打开即可完成导入。但是这种导入是按照绝对路径导入,所以在项目位置更换的时候需要更改此处配置,并不是多么的方便。
在这里插入图片描述
导入成功后可以在项目中看到所有的jar包的标签左下角都多了一个小标记,这样导入jar包就成功了。
在这里插入图片描述


随后我们开始配置MyBatis所需的一些文件 首先是log4j.properties文件,在项目根目录的src文件夹下创建一个log4j.properties.txt的文本文档,双击打开后填入如下内容
# 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

然后保存退出之后,将此文本文档的后缀“.txt”删去,保存即可。

然后就是SqlMapConfig.xml的配置,我们还是在src文件夹下创建
这次我们直接在项目中选定src文件夹,右击new–>Other…,选择下方XML中的XML File
在这里插入图片描述
然后next之后填写文件名:SqlMapConfig.xml
在这里插入图片描述
创建完成后,我们双击此xml文件,你可能会看到这样的情况,

在这里插入图片描述
这个时候单击左下角的Source,切换界面。就会变成这样的样子。
在这里插入图片描述
在此中替换成如下代码:

<!DOCTYPE configuration 
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd"> 

<configuration> 
   <!-- 和spring整合后 environments配置将废除   数据源-->
   <environments default="development">
       <environment id="development">
       		<!-- 使用jdbc事务管理,事务控制由mybatis管理-->
           <transactionManager type="JDBC" />
       		<!-- 数据库连接池,由mybatis管理-->
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver" />
               <!-- 这之中的value里填写要连接的数据库地址,localhost表示本地,3306表示数据库软件连接端口,smbms表示所要连接的具体数据库名字 -->
               <!-- 可以将localhost:3306,改为公网下的ip地址和端口号,即可实现连接公网下的数据库软件 -->
               <property name="url" value="jdbc:mysql://localhost:3306/smbms" />
               <!-- 表示连接数据库软件所使用的用户名 -->
               <property name="username" value="root" />
               <!-- 表示连接数据库软件所使用的登陆密码 -->
               <property name="password" value="" />
           </dataSource>
       </environment>
   </environments>
</configuration> 

如下图
在这里插入图片描述

随后我们配置mapper映射文件
我们首先创建一个包,包的名字为:com.exercise.mybatis.mapper,这个包我们叫做映射包
然后在这个包里创建一个xml文件,我们叫这个文件为映射文件,因为这次测试的是连接smbms数据库中的一个名为smbms_role的表,所以我们将这个文件的名字命名为roleMapper.xml
在这里插入图片描述
然后我们用如下代码替换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" >
<!-- namespace命名空间  用来区分不同的mapper -->
<!-- 一般我们使用 包名+文件名 的形式命名此命名空间 -->
<mapper namespace="com.exercise.mybatis.mapper.RoleMapper">

</mapper>

随后我们创建一个新的包,com.exercise.mybatis.domain,这个包我们叫做实体包,这个包里面所有的类,都对应着一个数据库中的表,每一个类中的成员变量就对应着数据库表中的字段
根据此次测试,我们创建一个名为Role的java类
在这里插入图片描述
Role文件下的内容为

package com.exercise.mybatis.domain;

public class Role {
	private int id;
	private String roleCode;
	private String roleName;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getRoleCode() {
		return roleCode;
	}
	public void setRoleCode(String roleCode) {
		this.roleCode = roleCode;
	}
	public String getRoleName() {
		return roleName;
	}
	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
}

在这类实体文件下,最好只有字段和get、set方法。而这个实体类里面的所有字段(成员变量),就是所对应的数据库表的字段,名字可以不一样,但是最好保持一致
在这里插入图片描述
随后我们在RoleMapper.xml中添加如下代码

  <!-- 创建一个映射mapper和实体domain相关联的一个Map,type就是实体Role的包+类名 -->
  <resultMap id="BaseResultMap" type="com.exercise.mybatis.domain.Role" >
  	<!-- id表示数据库表中的id字段也就是主键字段 -->
  	<!-- 第一个参数column的值表示为从数据库表中查询到的结果字段,对应着数据库表中的字段 -->
  	<!-- 第二个参数property的值表示实体类中的成员变量,对应着实体中的字段 -->
  	<!-- 第三个参数jdbcType的值表示此字段下值的数据类型,使用的形式为MySQL中的数据类型 -->
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="roleCode" property="roleCode" jdbcType="VARCHAR" />
    <result column="roleName" property="roleName" jdbcType="VARCHAR" />
  </resultMap>

这样我们使用MyBatis所查询到的内容就会按照我们创建的对应关系填入到我们创建的实体类里边,一个实体类就对应着数据库表中的一行数据

接下来我们开始创建一个select查询语句

  <!-- 创建一个select查询语句 -->
  <!-- 第一个参数为这个select选择语句的名字 -->
  <!-- 第二个参数为查询结果如何返回,我们把我们原来设置的关联关系BaseResultMap填入,表示查询的结果会按照我们原来设置的实体关联关系,填入到我们创建的实体类中 -->
  <!-- 第三个参数为此查询语句所需要的参数类型 -->
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    id, roleCode, roleName
    from smbms_role
    <!-- 这之中的#{}表示一个占位符,其中的内容就是我们传入的参数 -->
    where id = #{id,jdbcType=INTEGER}
  </select>

这样我们的Mapper映射就做的差不多了,然后就可以到SqlMapConfig.xml中注册我们创建的映射了。在SqlMapConfig.xml文件下的< configuration > < /configuration > 中添加我们的注册信息

   <mappers>
   	<mapper resource="com/exercise/mybatis/mapper/RoleMapper.xml" />
   </mappers>

可以很容易的发现规则,映射的resource中的值就是 包名+映射文件名

然后我们就可以创建com.exercise.mybatis.test包,来测试我们的MyBatis连接数据库是否成功了
我们在此测试包下创建Test类,然后写入如下内容

	public static void main(String[] args) {
        // 获取配置文件
        String resource = new String("SqlMapConfig.xml");
        // 获取配置文件输入流
        InputStream inputStream;
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
             //创建SqlSessionFactory(sql会话工厂)
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //通过工厂的到sqlsession(会话)
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 执行查询-->关闭会话
            // 第一个参数为要执行的语句,格式为:命名空间名+id名。命名空间就是Mapper文件开始时要填入的内容
            // 第二个参数为执行该语句所需的参数,如果不需要参数也可以不填
            Role role = sqlSession.selectOne("com.exercise.mybatis.mapper.RoleMapper.selectByPrimaryKey",1);
            System.out.println(role.getRoleCode() + " " + role.getRoleName() );  
            
            sqlSession.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
	}

在导入包的时候要注意不要导入错误的包,否则就会报莫名其妙的错误。
在添加如上的代码后,按下 CTRL+SHIFT+O来导入包
在这里插入图片描述
在这里插入图片描述
随后我们运行此Test即可
如下是我运行的结果
在这里插入图片描述
红线部分为System.out.println(role.getRoleCode() + " " + role.getRoleName() ); 这一行所输出的内容,其他的行跟我们最开始配置的log4j.properties有关
查阅数据库表,可以发现
在这里插入图片描述
查询内容正确。

随后列出Mapper中可以写入的增删改查内容模板

// 添加一条数据
// 此种方法为传入一个实体类参数,而#{}中的内容就是Role对象中的不同字段的名字,注意大小写。
<insert id="addRole" parameterType="com.exercise.mybatis.domain.Role">
		insert into smbms_role(roleCode,roleName) values(#{roleCode},#{roleName})
</insert>
// 删除一条数据
<delete id="delRoleById" parameterType="com.exercise.mybatis.domain.Role">
		delete from smbms_role where id = #{id}
</delete>
// 修改一条数据
<update id="updRoleById" parameterType="com.exercise.mybatis.domain.Role">
		update smbms_role set roleCode=#{roleCode},roleName = #{roleName}
</update>
// 查询一个数据
// 这里有resultType参数,而没有resultMap参数,参数的内容就是实体类的 包名+类名。这种表示形式代表着
// 实体类中所有字段的类型和名字均与数据库中的字段和类型一致
// 在这种时候可以不用我们原来设置的那个Map,也能实现从数据库中查询到的值传给实体类
<select id="selRoleById" resultType="com.exercise.mybatis.domain.Role" parameterType="int">
	select * from smbms_role where id = #{id}
</select>

全部代码查看:https://blog.csdn.net/qq_20179227/article/details/104250870








最后我们再进阶一下,我们在com.exercise.mybatis.mapper包下创建一个和xml映射文件名字一样的接口
在这里插入图片描述
在里面写入如下内容

package com.exercise.mybatis.mapper;

import com.exercise.mybatis.domain.Role;

public interface RoleMapper {
	Role selectByPrimaryKey(int id);
}

这个接口中有一个函数,返回值为Role对象,函数名为selectByPrimaryKey,参数为int,
与我们在RoleMapper.xml中添加的查询语句对应

  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    id, roleCode, roleName
    from smbms_role
    <!-- 这之中的#{}表示一个占位符,其中的内容就是我们传入的参数 -->
    where id = #{id,jdbcType=INTEGER}
  </select>

id就是函数名,resultMao就是返回值,parameterType就是参数,这里java.lang.Integer类型就是int基本类型的封装,所以可以将参数设置为int,而标准的应该是设置为Integer类型,要与RoleMapper.xml中保持一致。

随后我们稍微改一下Test中的代码

	public static void main(String[] args) {
        // 获取配置文件
        String resource = new String("SqlMapConfig.xml");
        // 获取配置文件输入流
        InputStream inputStream;
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
             //创建SqlSessionFactory(sql会话工厂)
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //通过工厂的到sqlsession(会话)
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 执行查询-->关闭会话
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Role role = roleMapper.selectByPrimaryKey(1);
            
            // 第一个参数为要执行的语句,格式为:命名空间名+id名。命名空间就是Mapper文件开始时要填入的内容
            // 第二个参数为执行该语句所需的参数,如果不需要参数也可以不填
            // Role role = sqlSession.selectOne("com.exercise.mybatis.mapper.RoleMapper.selectByPrimaryKey",1);
            System.out.println(role.getRoleCode() + " " + role.getRoleName() );  
            
            sqlSession.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
	}

这样就可以更加轻松的使用。
这个过程叫做Mapper的动态代理,他需要满足如下条件
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、Mapper接口方法名和Mapper.xml中定义的每个sql的id相同

3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

然后我们就可以把代码写成这样

package com.exercise.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

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.exercise.mybatis.domain.Role;
import com.exercise.mybatis.mapper.RoleMapper;

public class Test {
	
	static SqlSession sqlSession;
	static RoleMapper roleMapper;
	
	static {
		// 获取配置文件
        String resource = new String("SqlMapConfig.xml");
        // 获取配置文件输入流
        InputStream inputStream;
        try {
            inputStream = Resources.getResourceAsStream(resource);
             // 创建SqlSessionFactory(sql会话工厂)
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 通过工厂的到sqlsession(会话)
            sqlSession = sqlSessionFactory.openSession();
            
            // 在这里可以将所有本Test中所需的Mapper全部注册。
            roleMapper = sqlSession.getMapper(RoleMapper.class);
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
	}
	static void closeSqlSession(){
		sqlSession.close();
	}
	public static void main(String[] args) {
        Role role = roleMapper.selectByPrimaryKey(1);
        // 注意查询结束后要关闭数据库连接
        closeSqlSession();
        System.out.println(role.getRoleCode() + " " + role.getRoleName() );
	}
}

或者我们也可以写成这样

package com.exercise.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

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.exercise.mybatis.domain.Role;
import com.exercise.mybatis.mapper.RoleMapper;

public class Test {
	
	static SqlSession sqlSession;
	
	static <T> Object getMapper(Class<T> t){
		// 获取配置文件
        String resource = new String("SqlMapConfig.xml");
        // 获取配置文件输入流
        InputStream inputStream;
        try {
            inputStream = Resources.getResourceAsStream(resource);
             //创建SqlSessionFactory(sql会话工厂)
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //通过工厂的到sqlsession(会话)
            sqlSession = sqlSessionFactory.openSession();
            
            return sqlSession.getMapper(t);
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
	}
	static void closeSqlSession(){
		if (sqlSession != null) {
			sqlSession.close();
		}
	}
	public static void main(String[] args) {
		RoleMapper roleMapper = (RoleMapper) getMapper(RoleMapper.class);
		if (roleMapper == null) {
			System.out.println("连接数据库出错!");
			closeSqlSession();
			return;
		}
        Role role = roleMapper.selectByPrimaryKey(1);
        // 注意查询结束后要关闭数据库连接
        closeSqlSession();
        System.out.println(role.getRoleCode() + " " + role.getRoleName() );
	}
}

这样的话就可以在你需要的时候,再注册你所需要的Mapper了。注意在使用结束后,将sqlSession关闭。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!