【MyBatis学习02】走进MyBatis的世界
mybatis是个持久层的框架,用来执行数据库操作的,无外乎增删改查,上一节对mybatis有了宏观上的了解后,这一篇博客主要通过一个小示例来入门mybatis,先看一下要写的示例需求:
- 根据用户id查询用户信息
- 根据用户名称模糊查询用户信息
- 添加用户、删除用户、更新用户
其实也就是增删改查,掌握这些,基本上就掌握了mybatis的基本操作了,下面一个个模块来完成。
1.MyBatis环境准备
毫无疑问,砍柴得有把刀才行,环境的搭建是开发中必需的一个流程,mybatis的环境我分成以下几个部分来总结:
1.1 mybatis运行环境
mybatis运行环境主要是指mybatis的jar包,mybatis已经将它的各个版本托管到github上了,大家可以去github上下载,(如果觉得不方便)也可以去CSDN下载频道下载,我已经上传上去了,我用的是mybatis-3.3.0版本,csdn搜索下
从mybatis的jar包中就可以看出,mybatis和hibernate有着强烈的对比,mybatis的jar包很简洁,不像hibernate有很多jar包,mybatis的jar包包括一个核心包和几个依赖包,我们全部导入到工程中即可。然后就是MySQL的驱动包,也要导入到工程中。下面看一下总共需要导入的jar包:
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <!-- mybatis支持 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.3.0</version>
- </dependency>
- <!--mysql支持 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.26</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.7.12</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.12</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-api</artifactId>
- <version>2.2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <version>2.2</version>
- </dependency>
- <dependency>
- <groupId>org.javassist</groupId>
- <artifactId>javassist</artifactId>
- <version>3.17.1-GA</version>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>cglib</groupId>
- <artifactId>cglib</artifactId>
- <version>3.1</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm</artifactId>
- <version>4.2</version>
- </dependency>
- </dependencies>
喜欢用maven的也可以使用上面的
1.2 log4j配置文件
从上面的jar包中可以看出,mybatis的依赖包中有很多日志包,既然mybatis依赖log4j,那我们首先要建立一个log4j.properties文件,这个可以在官方的文件中拷贝下,如下:
- # Global logging configuration
- # developer-->DEBUG productor-->INFO or ERROR
- 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
在开发环境下日志级别要设置成DEBUG,产品模式下可以设置成INFO或者ERROR
1.3 全局配置文件
mybatis需要配置一个全局配置文件SqlMapConfig.xml,这个文件是用来配置mybatis的运行环境,即数据源、事务等。我们也可以从官方的例子中拷贝一份,然后做一下修改:
- <?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>
- <!-- 和Spring整合后environment配置都会被干掉 -->
- <environments default="development">
- <environment id="development">
- <!-- 使用jdbc事务管理,目前由mybatis来管理 -->
- <transactionManager type="JDBC" />
- <!-- 数据库连接池,目前由mybatis来管理 -->
- <dataSource type="POOLED">
- <property name="driver" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
- <property name="username" value="root" />
- <property name="password" value="root" />
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="sqlmap/User.xml" />
- </mappers>
- </configuration>
以上这些环境配置(<environments>
标签中的内容在以后和spring整合后,都会交给Spring来管理,现在暂时交给 mybatis来管理)中,修改成自己数据库相对应的情况即可,<mapper>
标签用来配置映射文件的,这些映射文件是针对不同的pojo的,这个示例中只操作一个User对象,所以只有一个配置文件,在sqlmap目录下的User.xml,在下文中可以看到。最后来看一下整个环境的结构:
接下来就开始开发示例程序了。
2.程序的编写
首先我们得有一个pojo,在mybatis.po包中新建一个User.Java类:
- public class User {
- private Integer id;
- private String username;
- private Date birthday;
- private String sex;
- private String address;
- public User(String username, Date birthday, String sex, String address) {
- this.username=username;
- this.birthday=birthday;
- this.sex=sex;
- this.address=address;
- }
- //省略get set
- use mybatis
- drop table if exists user;
- create table user
- (
- id int primary key not null auto_increment,
- username varchar(40),
- birthday date,
- sex char(1),
- address varchar(255)
- );
- insert into user(username,birthday,sex,address) values("张三1","1990-09-19","男","山河");
- insert into user(username,birthday,sex,address) values("张三2","1990-09-19","男","山河");
对应数据库的建表语句如上
下面开始写代码,完成示例程序。
2.1 根据用户id查询用户信息
首先得创建配置文件User.xml,并在配置文件中创建sql语句,如下:
- <?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="test">
- <!-- 需求:通过id查询用户 -->
- <select id="findUserById" parameterType="int" resultType="mybatis.po.User">
- select * from user where id = #{id}
- </select>
- </mapper>
来简单解释下该配置文件中一些参数的作用:
<select>
标签:用于执行数据库查询的,所有关于查询的都使用该标签。- id属性:标识映射文件中的sql,将sql语句封装到mappedStatement对象中,即statement的id,下面执行数据库的时候需要用到这个id。
- #{}:表示一个占位符,用来接收输入参数的。
- #{id}:id标识接收输入的参数,参数名称就是id,如果输入参数是简单类型,那么#{}中的参数名可以任意,可以value或者其他名称。
- parameterType:指定输入参数的类型,这个要和数据库中的保持一致。
- resultType:指定输出结果的类型,即查询结果所映射的java对象。
有了User.xml配置文件后,需要在全局配置文件SqlMapConfig.xml中添加这个映射,上面已经添加过了,即:
- <mappers>
- <mapper resource="sqlmap/User.xml" />
- </mappers>
接下来就是写测试类了:
- public class MybatisFirst {
- //因为接下来的测试代码中,获取sqlSession这部分都相同,所以抽取成一个方法
- public SqlSession getSession() throws IOException {
- String resource = "SqlMapConfig.xml"; //mybatis配置文件
- //得到配置文件的流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- //创建会话工厂SqlSessionFactory,要传入mybaits的配置文件的流
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- //通过工厂得到SqlSession
- SqlSession sqlSession = sqlSessionFactory.openSession();
- return sqlSession;
- }
- //根据id查询用户的信息,得到一条记录的结果
- @Test
- public void findUserById() throws IOException {
- SqlSession sqlSession = getSession(); //调用上面的方法获取sqlSession
- //通过SqlSession操作数据库
- //第一个参数:映射文件中statement的id,= namespace + statement的id
- //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
- //selectOne表示查询出一条记录进行映射
- User user = sqlSession.selectOne("test.findUserById", 1);
- System.out.println(user);
- //释放资源,最好放在finally中,这里只是测试程序,就不弄了
- sqlSession.close();
- }
- }
从java程序中可以看出,这个流程很明确,就是上一节我画的那个mybatis的流程图,而且mybatis有个特点,就是要执行什么语句,都写在配置文件中,需要传入或者输出什么参数类型也写在配置文件中,在java中只要对应那个配置传入我们想要的参数或者接受输出参数即可,很方便。
2.2 根据用户名称模糊查询用户信息
有了上面的过程,接下来就比较简单了,使用mybatis开发,流程都一样,先在User.xml中添加配置:
- <mapper namespace="test">
- <!-- 省略其他 -->
- <!-- 根据用户名称模糊查询用户信息,可能返回多条 -->
- <select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.po.User">
- select * from user where username like '%${value}%'
- </select>
- </mapper>
来解释下部分参数的作用:
- 1.resultType:这里虽然是查询多条记录,但是resultType指定的就是单条记录所映射的java对象类型。
- 2.${}:表示拼接sql串,将接收到的参数的内容不加任何的修饰拼接在sql中,${}中只能使用value,但是使用${}来拼接sql,可能会引起sql注入,所以不建议使用这种方法。
这里使用${}来拼接sql是为了后面java程序中直接输入方便(比如我模糊查询“张三”,就不用输入“%张三%”了),但是有sql注入的隐患。如果安全一点,还是使用#{}来接收参数,不过此时的话,java程序中输入参数就得是“%张三%”了。
下面看下java程序:
- public class MybatisFirst {
- //省略不相关代码
- //根据用户名称模糊查询用户列表
- @Test
- public void findUserByName() throws IOException {
- SqlSession sqlSession = getSession();
- //selectList表示查询出一个列表(多条记录)进行映射
- List<User> list = sqlSession.selectList("test.findUserByName", "张三");
- System.out.println(list);
- //释放资源,最好放在finally中,这里只是测试程序,就不弄了
- sqlSession.close();
- }
- }
处理流程和上面一模一样,不在赘述。
2.3 添加用户
首先完成添加用户的配置文件:
- <mapper namespace="test">
- <!-- 省略不相关配置 -->
- <!-- 添加用户 -->
- <insert id="insertUser" parameterType="mybatis.po.User">
- insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
- <!-- 将插入数据的主键返回,返回到user对象中 -->
- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
- select last_insert_id()
- </selectKey>
- <!--
- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
- select uuid()
- </selectKey>
- -->
- </insert>
- </mapper>
下面解释下部分属性的作用:
- <insert>标签:用于执行数据库查询的,所有关于查询的都使用该标签。
- parameterType:要传入一个具体的pojo(包括用户信息)
- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值。
- <selectKey>标签:用来返回插入数据的主键的,实际中如果有获得主键的需要就可以使用它。
- select last_insert_id():是sql函数,表示得到刚刚insert进去记录的主键值,只适用于自增主键。
- keyProperty:表示将查询到主键值设置到上面parameterType指定的对象的哪个属性。
- order:表示select last_insert_id()的执行顺序,是相对于insert语句来说的。
- resultType:表示select last_insert_id()的结果类型。
下面看下java代码:
- public class MybatisFirst {
- //省略不相关代码
- //添加用户信息
- @Test
- public void insertUser() throws IOException {
- SqlSession sqlSession = getSession();
- User user = new User("倪升武", new Date(), "男", "同济大学");
- sqlSession.insert("test.insertUser", user); //添加一项
- //提交事务
- sqlSession.commit();
- System.out.println(user.getId()); //获取刚刚添加的id
- //释放资源,最好放在finally中,这里只是测试程序,就不弄了
- sqlSession.close();
- }
- }
2.4 更新用户和删除用户
接下来都比较简单了,基本参数的使用在上面都有涉及,我放在一起写了:
- <mapper namespace="test">
- <!-- 省略不相关配置 -->
- <!-- 删除用户 -->
- <delete id="deleteUser" parameterType="java.lang.Integer">
- delete from user where id=#{id}
- </delete>
- <!-- 更新用户 -->
- <update id="updateUser" parameterType="mybatis.po.User">
- update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
- </update>
- </mapper>
下面看一下java代码:
- public class MybatisFirst {
- //删除用户信息
- @Test
- public void deleteUser() throws IOException {
- SqlSession sqlSession = getSession();
- //传入id,删除用户
- sqlSession.delete("test.deleteUser", 16);
- //提交事务
- sqlSession.commit();
- //释放资源,最好放在finally中,这里只是测试程序,就不弄了
- sqlSession.close();
- }
- //更新用户信息
- @Test
- public void updateUser() throws IOException {
- SqlSession sqlSession = getSession();
- User user = new User("倪升武", new Date(), "男", "同济大学");
- user.setId(9);
- //更新用户
- sqlSession.update("test.updateUser", user);
- //提交事务
- sqlSession.commit();
- //释放资源,最好放在finally中,这里只是测试程序,就不弄了
- sqlSession.close();
- }
- }
好了,到这里mybatis的入门程序就写完了,从上面的程序来看,mybatis的基本操作还是挺简便的。主要要搞清楚mybatis的一个执行流程就比较好理解了。入门就总结这么多吧,希望这篇博文能代领mybatis的初学者走进mybatis的世界,包括我~~
【MyBatis学习02】走进MyBatis的世界的更多相关文章
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- 【转】MyBatis学习总结(一)——MyBatis快速入门
[转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...
- 转:MyBatis学习总结(Mybatis总结精华文章)
http://www.cnblogs.com/xdp-gacl/tag/MyBatis%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/ 当前标签: MyBatis学习总结 ...
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- Mybatis学习笔记(一) —— mybatis介绍
一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...
- Mybatis学习第一天——Mybatis的安装配置以及基本CURD操作
1.Mybatis下载 Mybatis是开源的持久层框架,能够度jdbc进行简单的封装,但其并不是完全的ORM(Object Relational Mapping,对象关系映射),无法脱离数据库进行适 ...
- Mybatis学习笔记(八) —— Mybatis整合spring
一.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...
- MyBatis学习笔记一:MyBatis最简单的环境搭建
MyBatis的最简单环境的搭建,使用xml配置,用来理解后面的复杂配置做基础 1.环境目录树(导入mybatis-3.4.1.jar包即可,这里是为后面的环境最准备使用了web项目,如果只是做 my ...
随机推荐
- int 与 String 与 char 之间的互相转换
int 转 String: //方式一: int i1 = 888; String s1 = Integer.toString(i1); //方式二: int i2 = 888; String s2 ...
- 哈希+Bfs【P2730】 魔板 Magic Squares
没看过题的童鞋请去看一下题-->P2730 魔板 Magic Squares 不了解康托展开的请来这里-->我这里 至于这题为什么可以用康托展开?(瞎说时间到. 因为只有8个数字,且只有1 ...
- 51nod 最长单增子序列(动态规划)
最长单增子序列 (LIS Longest Increasing Subsequence)给定一个数列,从中删掉任意若干项剩余的序列叫做它的一个子序列,求它的最长的子序列,满足子序列中的元素是单调递增的 ...
- 母亲的牛奶(milk) (BFS)
问题 A: 母亲的牛奶(milk) 时间限制: 1 Sec 内存限制: 64 MB提交: 14 解决: 8[提交][状态][讨论版] 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C ...
- 基础认证伪造工具phishery
基础认证伪造工具phishery 基础认证(Basic Authentication)被广泛应用内部网站.路由器等Web应用中.用户必须填写对应的用户名.密码才能访问Web资源.Kali Linu ...
- [HDU5739]Fantasia(圆方树DP)
题意:给一张无向点带有权无向图.定义连通图的权值为图中各点权的乘积,图的权值为其包含的各连通图的权和.设z_i为删除i点后图的权值,求$S = (\sum\limits_{i=1}^{n}i\cdot ...
- [xsy2962]作业
题意:$f_0=1-\dfrac1e,f_n=1-nf_{n-1}$,求$f_n(n\leq10000)$,保留四位小数 这题代码只有⑨行但是题解很神... 因为递推式中有乘法,所以直接按题目来推肯定 ...
- 【set】bzoj3715 [PA2014]Lustra
对每种属性开一个set,只要某个厂家符合该属性的最值,就加进set,最后判断是否有某个厂家在4个set里都存在即可. #include<cstdio> #include<set> ...
- 6.6(java学习笔记)文件分割(IO综合例子)
基本思路: 文件分割:将一个文件分割成若干个独立的文件. 设置分割后小文件文件的字节数,然后读取被分割文件, 将对应的字节数写入分割后的小文件中. 使用seek定位下一次读取位置. 文件 ...
- 【译】PHP中的Session及其一些安全措施
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...