您的位置:首页 > 编程语言 > Java开发

java实训笔记_使用MyBatis进行简单查询

2020-07-29 00:36 21 查看

上一篇写了java实训笔记_Spring MVC使用json
因为SpringMVC的内容都比较偏实际应用,所以就没有做总结 ,直接进入MyBatis的使用了。

1 本篇内容

本篇介绍了MyBatis的使用,包含引入、主配置文件的编写、一个简单的查询。

2 引入

引入mybatis和连接数据库所需的包。

<!-- MyBastis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>

3 准备工作

使用前先准备pojo包和mapper包,pojo包以后会放实体类,mapper包会放映射的接口和类。

4 主配置文件的编写

项目的主配置文件名为

SqlMapConfig.xml
,放在
src/main/resources
目录下

4.1 头声明

头声明直接复制即可,后续的声明需要写在

<configuration></configuration>
标签中。

<?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>

</configuration>

4.2 配置文件 properties标签

4.2.1 作用与写法

properties
标签用于引入配置文件,在此用来引入数据库连接的配置信息,写法如下,如何引用配置文件 中的信息见下文环境信息

<!-- 配置文件 -->
<properties resource="db.properties"></properties>

4.2.2 db.properties文件

在同目录下新建

db.properties
文件,在该文件中写入连接数据库的配置信息

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssm
name=root
password=

4.3 别名 typeAliases标签

别名标签用于自定义别名,可以单列自定义,也可以批量自定义,但都需要定义在

<typeAliases></typeAliases>
标签之中,定义别名以后可以通过别名指代pojo类,简化代码。

<typeAliases>
</typeAliases>

4.3.1 单列自定义

单列自定义需要使用

<typeAlias type="" alias=""></typeAlias>
进行定义,
type
指向想要自定义的类,
alias
是想要自定义的别名,下面是一个例子。

<typeAlias type="com.test.pojo.user" alias="User"></typeAlias>

4.3.2 批量自定义

批量自定义需要试用

<package name=""></package>
进行自定义,
name
指向想要自定义的包,会自动为该包下的所有类声明别名,声明的别名就是类名,在后续使用时可以直接使用类名,首字母大小写都可以,这个是比较常用的方式。

<package name="com.test.pojo"/>

4.3.3 最终声明

<typeAliases>
<package name="com.test.pojo"/>
</typeAliases>

4.4 环境信息 environments标签

environments
标签用于配置数据库的连接信息,可以用多个
environment
子标签来配置连接不同数据库的连接信息,配置了多个
environment
标签的话在创建
sqlSessionFactory
时需要指定环境参数,不指定的话会加载默认环境。
<environments default=""></environments>
中的
default
指定默认环境,值是子标签的id属性值

<environments default="">
</environments>

4.4.1 environment 子标签

environment
子标签的
id
属性指定该
environment
的id,创建
SqlSessionFactory
时传入该值创建使用对应的环境参数创建连接,它有事务管理器
transactionManager
子标签和数据源
dataSource
子标签

<environment id="">
<transactionManager type="">
</transactionManager>
<dataSource type="">
</dataSource>
</environment>

4.4.2 事务管理器 transactionManager

MyBatis中有两种事务管理器,

  • JDBC:直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
  • MANAGED:它从不提交或回滚一个连接,而是让容器来管理整个事务的声明周期,默认情况下会关闭连接,可以将closeConnection设置为false来阻止默认关闭行为。

注:使用Spring+MyBatis开发没有必要配置事务管理器,Spring会使用自带的管理器来覆盖配置。
也可以使用

TransactionFactory
Transaction
两个接口来自定义MyBatis的事务处理。

4.4.3 数据源 dataSource

dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象的资源。
有三种内建的数据源类型

  • UNPOOLED:每次请求时打开和关闭连接需要配置driver、url、username和password。
  • POOLED:利用“池”的概念将JDBC连接对象组织起来,避免创建新的连接实例所必须的初始化和认证时间,是一种使得并发Web应用快速响应请求的流行处理方式。
  • JNDI:为了能在如EJB或应用服务器这类容器中使用,这类容器可以集中或在外部配置数据源,在这里放置一个JNDI上下文的引用它就会去引用中找。

引用配置文件的值创建一个环境信息

<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${name}" />
<property name="password" value="${password}" />
</dataSource>
</environment>

注:

environments
标签必须包含
environment
标签,
environment
必须包含
transactionManager
dataSource
标签

4.5 映射文件 mapper标签

mapper
标签用于找到
*Mapper.xml
所在的位置,有多种配置方式,常用的是最下面那种使用package的那种

<mappers>
<!-- resource 相对路径 起始地址在src/main/resources -->
<!--  <mapper resource="config/mapper/userMapper.xml"/> -->
<!-- url 绝对路径   D:/ -->
<!--     <mapper url=""/> -->
<!-- class 包名全限命名(全类名) com.test.pojo -->
<!--     <mapper class=""/> -->
<!-- package 注册指定包下的所有映射文件  将xml与java类放一起  该方法要求mapper接口与mapper映射
文件名称一样且在同一目录下 -->
<package name="com.test.mapper"/>
</mappers>

4.6 最终成品

<?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>
<!-- 配置文件 -->
<properties resource="db.properties"></properties>
<!-- 自定义别名 -->
<typeAliases>
<!-- 对单个列名的定义 -->
<!-- <typeAlias type="edu.zhku.pojo.user" alias="User"></typeAlias> -->
<!-- 批量定义列名 -->
<!-- package:指定包的名称,为该包下的pojo类声明别名,所有定义的别名就是类名(首字母大小写都可以) -->
<package name="com.test.pojo" />
<package name="com.test.vo" />
</typeAliases>

<!-- 环境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${name}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

<mappers>
<!-- package 注册指定包下的所有映射文件,该方法要求mapper接口与mapper映射文件名称一样且在同一目
录下 -->
<package name="com.test.mapper"/>
</mappers>

</configuration>

还有一些其它的配置如 参数设置setting 类型处理器typeHandler 、插件plugins、对象工厂objectFactory 就不讲了

5 查询

5.1 准备文件

首先在pojo包和mapper包中建立文件

5.2 表

在数据库中建表,id是自增的。

插入一个数据

5.3 Admin类

编写Admin类

public class Admin {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

5.4 AdminMapper.xml

首先在navicat中检查语句写法是否正确。

有结果,语句正确。
mapper的namespace属性可以有三种写法,具体的区别见参考链接2,使用查询语句,所以是select标签,返回值是String,所以resultType设置为java.lang.string,最终如下所示

<?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.test.mapper.AdminMapper">

<select id="findAdminById" resultType="java.lang.String">
select name from admin where id ='1';
</select>

</mapper>

5.5 AdminMapper接口

要注意方法名和xml中的id相同

public interface AdminMapper {
public String findAdminById();
}

5.6 主方法

public class Test {
public static void main(String[] args) {
//配置文件名称
String resource="SqlMapConfig";
try {
//读取配置文件
InputStream inputStream=Resources.getResourceAsStream(resource);
//实例化会话工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//打开会话
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行查询
String name=sqlSession.selectOne("findAdminById");
System.out.println(name);
//关闭会话
sqlSession.close();

} catch (Exception e) {
// TODO: handle exception
}
}
}

5.7 运行

5.7.1 第一次运行

现象:控制台一点结果都没有
分析:catch语句块中没有处理。
解决办法:在catch语句块中加入e.printStackTrace();

5.7.2 第二次运行

现象:Could not find resource SqlMapConfig
分析:找不到配置文件
解决办法:将

String resource="SqlMapConfig";
改为String resource=“SqlMapConfig.xml”;

5.7.3 第三次运行

现象:unknow column ‘name’ in field list
分析:SQL语句错误,可能是name是关键字
解决办法:查阅资料(参考链接3)后将name前后加上反引号,在此运行后仍是报错,加单引号后再次运行

5.7.4 第四次运行

现象:ClassCastException
分析:转型错误
解决办法:修改

Admin admin=sqlSession.selectOne("findAdminById");
String admin=sqlSession.selectOne("findAdminById");
,并修改输出语句为
System.out.println(admin);

5.7.5 第五次运行

现象:控制台输出name
分析:有结果,但是结果不对,说明sql语句错了,在navicat中执行

select name
运行结果也是找到name,说明不可以放单引号。
解决办法:将数据库中的表和xml文件中的字段名重命名,再次运行

5.7.6 最终解决

修改回去以后还是找不到列名,最后找了半天想起来换了一个数据库没改db.properties中的内容,修改完就可以了重试

6 结语

1.本来想写成一篇,但是内容实在太多,就分篇写了,下一篇具体介绍一下MyBatis的查询。
2.eclipse生成的try catch可能不会输出错误信息,要自己修改catch中的语句。
3.有时候错误往往就藏在细枝末节里面,找半天还找不出来那种,这时候重新按照项目流程走一遍,细心检查各项参数可能就找到解决办法了。
4.这一篇编写时间太长,中间因为一些事情耽误了,如果有什么问题的话欢迎在评论区指正。

7 参考链接

1.MyBatis environments(配置环境)元素标签及其属性、设置
2.Mybatis的mapper标签 namespace方法说明
MySQL字段命名不能使用的MySQL关键字
3.Mybatis 出现The error may involve defaultParameterMap

2020-08-03 更新
如果是增删改则需要提交事务

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: