MyBatis学习【二】CRUD测试

1099 篇文章 1 订阅
1030 篇文章 9 订阅
既然Mybatis也是一种ORM框架,所以,肯定也有两类配置文件。第一类,用来配置MyBatis环境,比如数据库连接等。第二类,用来配置对象到数据库表的映射。在MyBatis中,不光要配置对象到数据库表的映射,包括对应的SQL,也需要自己来完成(相当于自己来完成hibernate生成对象CRUDsql的过程要自己来完成)。在学习mybatis的过程当中,要对比着hibernate来思考,可以更容易的理解。而且,mybatis在ibatis的基础上面,更多的吸收了标准ORM的一些思想,所以,在API的设计上面和Hibernate还是有相似的地方,可以辅助学习。
首先任意创建一个对象User:

package cd.itcast.mybatis.domain;
public class User {
private Long id;
private String name;
private Date hireDate;
//getter & setter
}

下面就使用Mybatis完成对这个对象的CRUD的测试。
首先创建一个Mybatis的配置文件,我们在classpath下面创建一个xml文件,任意起名为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="default">
        <environment id="default">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

这就是mybatis的一个典型的配置文件。在这个配置文件中,我们可以清楚得看到一些关键信息。第一,有一个environments这个元素,在这个元素里面配置的是一个一个的environment元素,每一个environment元素有一个id做为名字,而environments元素上面有一个default属性,引用environment元素的名称,很容易想象出他们之间的关系。在environments里面可以定义多个enviroment元素,使用default属性指定一个默认的environment。而在environment里面,定义了一组数据库相关的东西,包括transactionManager,这个元素代表着怎么去管理事务,后面还会详细讲到。而下面的dataSource就很明显了,代表连接数据库的相关信息。在这里,dataSource有一个属性type,这里我们写的是POOLED,很明显,使用连接池来做mybatis的连接提供。在 dataSource里面,配置了四个属性,做为数据库连接信息配置。
接下来,就是为我们的User对象完成映射了。前面说了,在mybatis中,需要自己去控制sql,所以,我们的配置文件会像下面这样。在User的同级包下,添加一个XML文件,起名为UserMapper.xml,代表这个文件是User对象的映射文件:

<?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="cd.itcast.mybatis.domain.UserMapper">
    <insert id="save" keyProperty="id" parameterType="cd.itcast.mybatis.domain.User"useGeneratedKeys="true">
        INSERT INTO user(name,hiredate) values (#{name},#{hireDate})
    </insert>
</mapper>

Mapper:代表这是一个对象的映射关系
namespace:为当前映射关系创建的命名空间,要引用这个映射关系里面定义的东西,需要带上这个命名空间。还有其他非常重要的作用,之后会看到。

insert:代表定义了一个插入操作(即SQL的insert操作)
id:为这个插入操作起一个名字,以后要保存user这个对象,其实就是要调用这个插入操作。
keyProperty:代表主键对应对象的属性名称。有点像hibernate里面那个id元素。
parameterType:mybatis里面非常重要的一个元素,代表这个insert操作对应的方法需要传入一个什么类型的对象。这里,我们就是要把User这个对象保存到数据库中,所以,我们这个插入方法的参数就是一个User类型的对象实例。
useGeneratedKeys:代表告诉mybatis,使用autoGeneratedKey来获取数据库帮我们自动生成的ID。(这个方法在jdbc中讲过)
INSERT INTO user(name,hiredate) values (#{name},#{hireDate}):非常重要的东西。这就是一条完整的把USER对象插入到user表的SQL语句。但是在这个SQL语句里面,最重要的就是#{name},#{hireDate}这两个占位参数。这两个参数的意思就是:使用传入对象(parameterType)中的name,hireDate两个属性的值来填充这两个参数内容。

完成映射文件之后,在mybatis-config.xml中加入映射文件:


插入操作的测试。1,首先创建一个USER表:

CREATE TABLE user (
id bigint(11) NOT NULL AUTO_INCREMENT,
name varchar(50) DEFAULT NULL,
hiredate date DEFAULT NULL,
PRIMARY KEY (id)
)

然后创建一个UserTest类:

@Test
public void testSave() throws Exception{
SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(Resources .getResourceAsStream(“mybatis-config.xml”));
SqlSession session = factory.openSession();
try {
User u = new User();
u.setName(“itcasT”);
u.setHireDate(new Date());
session.insert(“cd.itcast.mybatis.domain.UserMapper.save”, u);
session.commit();
} finally {
session.close();
}
}

1,Resources .getResourceAsStream(“mybatis-config.xml”):使用Reources类的静态方法getResourceAsStream,从classpath:mybatis-config.xml位置读入配置文件,并装成inputStream。
2,SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(inputStream):使用读入的流,创建SqlSessionFactory。可以从名字上类比hibernate。
3,SqlSession session = factory.openSession();使用factory开启一个SqlSession。SqlSession即是在mybatis中操作实体对象的主要的类了。
4,User u = new User();创建一个需要保存的实体类。
5,session.insert(“cd.itcast.mybatis.domain.UserMapper.save”, u):非常重要的方法,使用session的insert方法,对比上面的映射文件,即告诉mybatis现在调用的是一个标记到insert元素中的SQL语句,接着传入cd.itcast.mybatis.domain.UserMapper.save,很明显这个就是namespace+id拼成的,意思就是我要调用的是定义在cd.itcast.mybatis.domain.UserMapper这个映射关系中的名字为save的insert语句。这个语句需要传入一个cd.itcast.mybatis.domain.User对象实例做为参数,所以把创建的User实体做为参数传入。
6,session.commit():很明显,即提交事务。
7,session.close():和hibernate一样,使用完后,都必须要关闭session。
从整个代码上面可以很明显的猜测到mybatis的创建过程。执行测试,保存成功。但是看不到mybatis执行的sql,怎么办?日志:
在classpath中建立一个名叫log4j.properties的文件,内容如下:

Global logging configuration

log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.cd.itcast.mybatis=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

很明显,log4j.logger.cd.itcast.mybatis意思就是要监控cd.itcast.mybatis包下面的所有mapper的动作。再次运行:

DEBUG [main] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@79a2e7]
DEBUG [main] - ==>  Preparing: INSERT INTO user(name,hiredate) values (?,?) 
DEBUG [main] - ==> Parameters: itcasT(String), 2012-09-12 15:10:16.812(Timestamp)

可以很清楚的看到执行的sql和执行sql使用的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值