MyBatis学习

 

目录

 

  1. 总结jdbc出现的问题
  2. mybatis介绍
  3. mybatis入门程序
  4. 占位符#{}与字符串拼接符${}区别
  5. mybatis框架的原理
  6. 别名配置与映射文件加载方式
  7. mybatis与hibernate的比较

 

一、总结jdbc出现的问题

 

 

1、准备数据库,执行mysql语句。


 
 
  1. -- ----------------------------
  2. -- Table structure for `orders`
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `orders`;
  5. CREATE TABLE `orders` (
  6. `id` int( 11) NOT NULL AUTO_INCREMENT,
  7. `user_id` int( 11) NOT NULL COMMENT '下单用户id',
  8. `number` varchar( 32) NOT NULL COMMENT '订单号',
  9. `createtime` datetime NOT NULL COMMENT '创建订单时间',
  10. `note` varchar( 100) DEFAULT NULL COMMENT '备注',
  11. PRIMARY KEY ( `id`),
  12. KEY `FK_orders_1` ( `user_id`),
  13. CONSTRAINT `FK_order_id` FOREIGN KEY ( `user_id`) REFERENCES `user` ( `id`) ON DELETE NO ACTION ON UPDATE NO ACTION
  14. ) ENGINE= InnoDB AUTO_INCREMENT= 6 DEFAULT CHARSET=utf8;
  15. -- ----------------------------
  16. -- Records of orders
  17. -- ----------------------------
  18. INSERT INTO `orders` VALUES ( '3', '1', '1000010', '2015-02-04 13:22:35', null);
  19. INSERT INTO `orders` VALUES ( '4', '1', '1000011', '2015-02-03 13:22:41', null);
  20. INSERT INTO `orders` VALUES ( '5', '10', '1000012', '2015-02-12 16:13:23', null);
  21. -- ----------------------------
  22. -- Table structure for `user`
  23. -- ----------------------------
  24. DROP TABLE IF EXISTS `user`;
  25. CREATE TABLE `user` (
  26. `id` int( 11) NOT NULL AUTO_INCREMENT,
  27. `username` varchar( 32) NOT NULL COMMENT '用户名称',
  28. `birthday` date DEFAULT NULL COMMENT '生日',
  29. `sex` char( 1) DEFAULT NULL COMMENT '性别',
  30. `address` varchar( 256) DEFAULT NULL COMMENT '地址',
  31. PRIMARY KEY ( `id`)
  32. ) ENGINE= InnoDB AUTO_INCREMENT= 35 DEFAULT CHARSET=utf8;
  33. -- ----------------------------
  34. -- Records of user
  35. -- ----------------------------
  36. INSERT INTO `user` VALUES ( '1', '王五', null, '2', null);
  37. INSERT INTO `user` VALUES ( '10', '张三', '2014-07-10', '1', '北京市');
  38. INSERT INTO `user` VALUES ( '16', '张小明', null, '1', '河南郑州');
  39. INSERT INTO `user` VALUES ( '22', '陈小明', null, '1', '河南郑州');
  40. INSERT INTO `user` VALUES ( '24', '张三丰', null, '1', '河南郑州');
  41. INSERT INTO `user` VALUES ( '25', '陈小明', null, '1', '河南郑州');
  42. INSERT INTO `user` VALUES ( '26', '王五', null, null, null);

 

2、创建工程

   

3、配置pom.xml文件,加入数据库依赖驱动


 
 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0 </modelVersion>
  5. <groupId>com.liwei </groupId>
  6. <artifactId>mybatis01 </artifactId>
  7. <version>0.0.1-SNAPSHOT </version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  10. <!-- mysql版本 -->
  11. <mysql.version>5.1.30 </mysql.version>
  12. <!-- junit版本 -->
  13. <junit.version>4.12 </junit.version>
  14. </properties>
  15. <dependencies>
  16. <!-- mysql数据库依赖 -->
  17. <dependency>
  18. <groupId>mysql </groupId>
  19. <artifactId>mysql-connector-java </artifactId>
  20. <version>${mysql.version} </version>
  21. </dependency>
  22. <!-- junit依赖 -->
  23. <dependency>
  24. <groupId>junit </groupId>
  25. <artifactId>junit </artifactId>
  26. <version>${junit.version} </version>
  27. <scope>test </scope>
  28. </dependency>
  29. </dependencies>
  30. </project>


4、编写代码


 
 
  1. package com.liwei.jdbc;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. /**
  7. * @ClassName: JdbcTest
  8. * @Description:jdbc问题总结
  9. * @author: Li_Wei
  10. * @date: 2018年6月27日 上午10:13:52
  11. */
  12. public class JdbcTest {
  13. public static void main(String[] args) {
  14. Connection con = null;
  15. PreparedStatement psmt = null;
  16. ResultSet set = null;
  17. try {
  18. // 1.加载驱动
  19. Class.forName( "com.mysql.jdbc.Driver");
  20. // 2.创建数据库的连接对象
  21. con = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/liwei", "root", "root");
  22. // 3.定义sql语句
  23. String sql = "select * from user where id = ?";
  24. // 4.创建statement对象
  25. psmt = con.prepareStatement(sql);
  26. // 5.设置参数
  27. psmt.setInt( 1, 1);
  28. // 6.执行
  29. set = psmt.executeQuery();
  30. // 7.处理结果集
  31. while (set.next()) {
  32. System.out.println( "用户Id:" + set.getInt( "id") + ",用户名称:" + set.getString( "username"));
  33. }
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. } finally {
  37. try {
  38. //8.释放资源
  39. if (set != null)set.close();
  40. if (psmt != null)psmt.close();
  41. if (con != null)con.close();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47. }

5、测试结果

    

6、总结jdbc开发出现的问题

  • 频繁创建数据库连接对象、释放、容易造成系统资源浪费,影响系统性能。企业项目中可以使用连接池解决这个问题,但是使用Jdbc需要自己实现连接池。mybatis框架已经提供连接池。
  • sql语句定义、参数设置、结果集处理存在硬编码。企业项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
  • 结果集处理存在重复代码,处理麻烦。如果可以映射成为java对象会比较方便。

二、mybatis介绍

 

        mybatis是Apache软件基金会下的一个开源项目,前身是Ibatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis。2013年11月又迁移到了github(https://github.com/mybatis/mybatis-3/releases)。

        mybatis是一个持久层的框架,是对JDBC操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建statement语句对象、参数设置、结果集处理等一系列繁杂的过程代码。

        mybatis通过xml或注解进行配置,将java对象与sql语句中的参数自动映射生成最终执行的sql语句,并将sql语句执行结果自动映射成java对象,返回给业务层(service)应用。

三、mybatis的入门程序

    

需求:实现用户表(user)增、删、改、查操作。

1、配置pom.xml文件


 
 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0 </modelVersion>
  5. <groupId>com.liwei </groupId>
  6. <artifactId>mybatis01 </artifactId>
  7. <version>0.0.1-SNAPSHOT </version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  10. <!-- mysql版本 -->
  11. <mysql.version>5.1.30 </mysql.version>
  12. <!-- junit版本 -->
  13. <junit.version>4.12 </junit.version>
  14. <!-- mybatis版本号 -->
  15. <mybatis.version>3.4.5 </mybatis.version>
  16. <!-- log4j日志包版本 -->
  17. <slf4j.version>1.7.7 </slf4j.version>
  18. <log4j.version>1.2.17 </log4j.version>
  19. </properties>
  20. <dependencies>
  21. <!-- mysql数据库依赖 -->
  22. <dependency>
  23. <groupId>mysql </groupId>
  24. <artifactId>mysql-connector-java </artifactId>
  25. <version>${mysql.version} </version>
  26. </dependency>
  27. <!-- mybatis核心包 -->
  28. <dependency>
  29. <groupId>org.mybatis </groupId>
  30. <artifactId>mybatis </artifactId>
  31. <version>${mybatis.version} </version>
  32. </dependency>
  33. <!-- log4j日志包 -->
  34. <dependency>
  35. <groupId>log4j </groupId>
  36. <artifactId>log4j </artifactId>
  37. <version>${log4j.version} </version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.slf4j </groupId>
  41. <artifactId>slf4j-api </artifactId>
  42. <version>${slf4j.version} </version>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.slf4j </groupId>
  46. <artifactId>slf4j-log4j12 </artifactId>
  47. <version>${slf4j.version} </version>
  48. </dependency>
  49. <!-- junit依赖 -->
  50. <dependency>
  51. <groupId>junit </groupId>
  52. <artifactId>junit </artifactId>
  53. <version>${junit.version} </version>
  54. <scope>test </scope>
  55. </dependency>
  56. </dependencies>
  57. </project>

2、sqlMapConfig.xml配置文件,是mybatis框架的核心配置文件。


 
 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 运行环境配置 -->
  7. <!--default属性:指定使用哪一个运行环境 -->
  8. <environments default="development">
  9. <!--id属性:唯一标识一个运行环境 -->
  10. <environment id="development">
  11. <!-- 事务管理器配置,type="JDBC":mybatis框架默认使用jdbc事务 -->
  12. <transactionManager type="JDBC" />
  13. <!--数据源配置,type="POOLED":mybatis框架提供的连接池 -->
  14. <dataSource type="POOLED">
  15. <property name="driver" value="com.mysql.jdbc.Driver" />
  16. <property name="url" value="jdbc:mysql://127.0.0.1:3306/liwei" />
  17. <property name="username" value="root" />
  18. <property name="password" value="root" />
  19. </dataSource>
  20. </environment>
  21. </environments>
  22. <!-- 加载映射文件 -->
  23. <mappers>
  24. <mapper resource="mybatis/UserMapper.xml"/>
  25. </mappers>
  26. </configuration>

3、log4j.properties日志文件

   


 
 
  1. # Global logging configuration
  2. log4j.rootLogger=DEBUG, stdout
  3. # Console output...
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  6. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

4、实体类User.java文件


 
 
  1. package com.liwei.mybatis.domain;
  2. import java.util.Date;
  3. public class User {
  4. private Integer id; // 主键id
  5. private String username; // 用户名称
  6. private Date birthday; // 生日
  7. private String sex; // 性别
  8. private String address; // 地址
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. public String getUsername() {
  16. return username;
  17. }
  18. public void setUsername(String username) {
  19. this.username = username;
  20. }
  21. public Date getBirthday() {
  22. return birthday;
  23. }
  24. public void setBirthday(Date birthday) {
  25. this.birthday = birthday;
  26. }
  27. public String getSex() {
  28. return sex;
  29. }
  30. public void setSex(String sex) {
  31. this.sex = sex;
  32. }
  33. public String getAddress() {
  34. return address;
  35. }
  36. public void setAddress(String address) {
  37. this.address = address;
  38. }
  39. @Override
  40. public String toString() {
  41. return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
  42. + address + "]";
  43. }
  44. }

5、UserMapper.xml文件


 
 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mybatis">
  6. <!-- 新增用户 -->
  7. <insert id="addUser" parameterType="com.liwei.mybatis.domain.User">
  8. insert into user (id,username,birthday,sex,address)
  9. values (#{id},#{username},#{birthday},#{sex},#{address})
  10. </insert>
  11. <!-- 根据用户id删除用户 -->
  12. <delete id="deleteUser" parameterType="int">
  13. delete from user where id = #{id}
  14. </delete>
  15. <!-- 根据用户id修改用户 -->
  16. <update id="updateUserById" parameterType="com.liwei.mybatis.domain.User">
  17. update user set username=#{username},sex=#{sex} where id=#{id}
  18. </update>
  19. <!-- 根据id查询 -->
  20. <select id="queryUserById" parameterType="int" resultType="com.liwei.mybatis.domain.User">
  21. select id,username,birthday,sex,address from user where id = #{id}
  22. </select>
  23. <!-- 方式一:根据用户名称模糊查询用户 -->
  24. <select id="queryUserByName1" parameterType="string" resultType="com.liwei.mybatis.domain.User">
  25. select id,username,birthday,sex,address from `user` where username like #{username}
  26. </select>
  27. <!-- 方式二:根据用户名称模糊查询用户 -->
  28. <select id="queryUserByName2" parameterType="string" resultType="com.liwei.mybatis.domain.User">
  29. select id,username,birthday,sex,address from `user` where username like '%${value}%'
  30. </select>
  31. </mapper>

 

6、MyBatisTest测试类


 
 
  1. package com.liwei.mybatis.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Date;
  5. import java.util.List;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.Test;
  11. import com.liwei.mybatis.domain.User;
  12. public class MyBatisTest {
  13. /**
  14. * @Title: getSqlSessionFactory
  15. * @Description: 将增、删、改、查公共使用的部分提出来
  16. * @param: @return
  17. * @param: @throws
  18. * IOException
  19. * @return: SqlSession
  20. * @throws @author
  21. * Li_Wei
  22. */
  23. public SqlSessionFactory getSqlSessionFactory() throws IOException {
  24. // 1.加载核心配置文件
  25. InputStream inputStream = Resources.getResourceAsStream( "sqlMapConfig.xml");
  26. // 2.读取配置文件的内容
  27. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  28. SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
  29. return sqlSessionFactory;
  30. }
  31. /**
  32. * @Title: addUser
  33. * @Description: 新增用户
  34. * @param:
  35. * @return: void
  36. * @throws IOException
  37. * @throws @author
  38. * Li_Wei
  39. */
  40. @Test
  41. public void addUser() throws IOException {
  42. // 3.使用sqlSessionFactory对象,创建SqlSession对象,开启自动提交事务
  43. SqlSession sqlSession = this.getSqlSessionFactory().openSession( true);
  44. // 调用方法执行
  45. User user = new User();
  46. user.setId( 4);
  47. user.setUsername( "林诗音");
  48. user.setBirthday( new Date());
  49. user.setSex( "女");
  50. user.setAddress( "来自大明朝");
  51. sqlSession.insert( "mybatis.addUser", user);
  52. // 事务提交
  53. // sqlSession.commit();
  54. // 释放资源
  55. sqlSession.close();
  56. }
  57. /**
  58. * @Title: deleteUser
  59. * @Description: 根据用户id删除用户
  60. * @param:
  61. * @return: void
  62. * @throws IOException
  63. * @throws @author
  64. * Li_Wei
  65. */
  66. @Test
  67. public void deleteUser() throws IOException {
  68. // 创建SqlSession对象
  69. SqlSession sqlSession = this.getSqlSessionFactory().openSession( true);
  70. // 调用方法执行
  71. sqlSession.delete( "mybatis.deleteUser", 3);
  72. // 释放资源
  73. sqlSession.close();
  74. }
  75. /**
  76. * @Title: updateUser
  77. * @Description: 根据用户id修改用户
  78. * @param:
  79. * @return: void
  80. * @throws IOException
  81. * @throws @author
  82. * Li_Wei
  83. */
  84. @Test
  85. public void updateUserById() throws IOException {
  86. // 创建SqlSession对象
  87. SqlSession sqlSession = this.getSqlSessionFactory().openSession( true);
  88. // 调用方法执行
  89. // 创建用户对象
  90. User user = new User();
  91. user.setId( 1);
  92. user.setUsername( "林诗音和小李飞刀");
  93. user.setSex( "1");
  94. sqlSession.update( "mybatis.updateUserById", user);
  95. // 释放资源
  96. sqlSession.close();
  97. }
  98. /**
  99. * @Title: queryUserById
  100. * @Description: 根据id查询用户(查询)
  101. * @param:
  102. * @return: void
  103. * @throws IOException
  104. * @throws @author
  105. * Li_Wei
  106. */
  107. @Test
  108. public void queryUserById() throws IOException {
  109. // 3.使用sqlSessionFactory对象,创建SqlSession对象
  110. SqlSession sqlSession = this.getSqlSessionFactory().openSession();
  111. // 4.使用sqlSession对象,调用方法执行
  112. Object user = sqlSession.selectOne( "mybatis.queryUserById", 24);
  113. System.out.println(user);
  114. // 5.释放资源
  115. sqlSession.close();
  116. }
  117. /**
  118. * @Title: queryUserNameLike
  119. * @Description: 方式一:根据用户名称模糊查询用户
  120. * @param:
  121. * @return: void
  122. * @throws IOException
  123. * @throws @author
  124. * Li_Wei
  125. */
  126. @Test
  127. public void queryUserByName1() throws IOException {
  128. // 3.使用sqlSessionFactory对象,创建SqlSession对象
  129. SqlSession sqlSession = this.getSqlSessionFactory().openSession();
  130. // 4.使用sqlSession对象,调用方法执行
  131. List<Object> userList = sqlSession.selectList( "mybatis.queryUserByName1", "%小明%");
  132. for (Object object : userList) {
  133. System.out.println(object);
  134. }
  135. // 5.释放资源
  136. sqlSession.close();
  137. }
  138. /**
  139. * @Title: queryUserNameLike
  140. * @Description: 根据用户名称模糊查询用户
  141. * @param:
  142. * @return: void
  143. * @throws IOException
  144. * @throws @author
  145. * Li_Wei
  146. */
  147. @Test
  148. public void queryUserByName2() throws IOException {
  149. // 3.使用sqlSessionFactory对象,创建SqlSession对象
  150. SqlSession sqlSession = this.getSqlSessionFactory().openSession();
  151. // 4.使用sqlSession对象,调用方法执行
  152. List<Object> userList = sqlSession.selectList( "mybatis.queryUserByName2", "小明");
  153. for (Object object : userList) {
  154. System.out.println(object);
  155. }
  156. // 5.释放资源
  157. sqlSession.close();
  158. }
  159. }

 

7、打印结果如下

新增用户:

            

    

删除:根据用户id删除用户

 

修改:根据用户id修改用户

 

查询:根据id查询

    

根据用户名称模糊查询:

方式一:使用#{}

方式二:使用${}

方式一与方式二具体看上面的代码。

在方式一与方式二中,我们使用到了#{}与${}两种方式,name这两种方式用什么区别呢?

 

四、占位符#{}与字符串拼接符${}区别

  1. 占位符#{},相当于jdbc中的问号?,当参数类型传递的是java简单类型的时候,花括号中的内容可以是任意字符串。
  2. 字符串拼接符${},当参数传递的是java简单类型的时候,花括号中的内容只能是:value
  3. sql语句中使用字符串拼接,可能引起sql注入的问题。但是mybatis框架中字符串拼接符可以放心使用。原因是mybatis是后端dao层开发,参数在前端表现层(action)和业务层(service)已经处理好。

五、mybatis框架的原理

    

六、别名配置与映射文件加载方式

别名有两种方式:

映射文件加载:两种方法

注意:包扫描需要将映射文件放在相应的包下面

七、mybatis与hibernate的比较

相同点
都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。

不同点

  1. hibernate对sql语句做了封装,提供了HQL语句操作数据库,数据库无关性支持好,在项目需要支持多种数据库的情况下,代码开发量较少,sql语句优化困难。mybaits是直接使用sql语句操作数据库,不支持数据库无关性,在项目需要支持多种数据库的情况下,代码开发量较多,sql语句优化容易。
  2. hibernate配置java对象与数据库表的对应关系,多表关联关系配置复杂。mybatis是配置java对象与sql语句的对应关系,多表关联关系配置简单。
  3. hibernate是一个重量级的框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自动化系统(OA)。mybatis是一个轻量级的框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网项目。目前企业项目中,mybatis框架使用更多。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值