走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

发布时间:2020-08-11 12:55:16 作者:a724888
来源:ITPUB博客 阅读:171

微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 


                      走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

通过项目逐步深入了解Mybatis(一)

2017-06-12

文章导航

Mybatis 和 SpringMVC 通过订单商品案例驱动

官方中文地址: http://www.mybatis.org/mybatis-3/zh/

官方托管地址: https://github.com/mybatis/mybatis-3

本项目全部代码地址: https://github.com/zhisheng17/mybatis

如果觉得不错的话,欢迎给个 star , 如果你想完善这个项目的话,你也可以 fork 后修改然后推送给我。

基础知识:

对原生态 jdbc 程序(单独使用 jdbc 开发)问题总结

1、环境

java 环境 :jdk1.8.0_77

开发工具 : IDEA 2016.1

数据库 : MySQL 5.7

2、创建数据库

mybatis_test.sql

Tables :items、orderdetail、orders、user

3、JDBC 程序

使用 JDBC 查询 MySQL 数据库中用户表的记录

代码:

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package cn.zhisheng.mybatis.jdbc;
/**
 * Created by 10412 on 2016/11/27.
 */
import java.sql.*;
/**
 *通过单独的jdbc程序来总结问题
 */
public class JdbcTest
{
    public static void main(String[] args)
    {
        //数据库连接
        Connection connection = null;
        //预编译的Statement,使用预编译的Statement可以提高数据库性能
        PreparedStatement preparedStatement = null;
        //结果集
        ResultSet resultSet = null;
        try
        {
            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过驱动管理类获取数据库链接
            connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8", "root", "root");
            //定义sql语句 ?表示占位符(在这里表示username)
            String sql = "select * from user where username = ?";
            //获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "王五");
            //向数据库发出sql执行查询,查询出结果集
            resultSet =  preparedStatement.executeQuery();
            //遍历查询结果集
            while(resultSet.next())
            {
                System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //释放资源
            if(resultSet!=null)
            {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(preparedStatement!=null)
            {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(connection!=null)
            {
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

4、问题总结

Mybatis框架原理(掌握)

1、Mybatis 是什么?

Mybatis 是一个持久层的架构,是 appach 下的顶级项目。

Mybatis 原先是托管在 googlecode 下,再后来是托管在 Github 上。

Mybatis 让程序员将主要的精力放在 sql 上,通过 Mybatis 提供的映射方式,自由灵活生成(半自动,大部分需要程序员编写 sql )满足需要 sql 语句。

Mybatis 可以将向 preparedStatement 中的输入参数自动进行 输入映射 ,将查询结果集灵活的映射成 java 对象。( 输出映射

2、Mybatis 框架

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

注解:

Mybatis入门程序

1、需求

实现以下功能:

2、环境

java 环境 :jdk1.8.0_77

开发工具 : IDEA 2016.1

数据库 : MySQL 5.7

Mybatis 运行环境( jar 包)

MySQL 驱动包

其他依赖包

3、 log4j.properties

在classpath下创建log4j.properties如下:

1
2
3
4
5
6
7
# Global logging configuration
#在开发环境日志级别要设置为DEBUG、生产环境要设置为INFO或者ERROR
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

Mybatis默认使用log4j作为输出日志信息。

4、工程结构

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

5、SqlMapConfig.xml

配置 Mybatis 的运行环境、数据源、事务等

10
11
12
13
14
15
16
17
18
19
20
<?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整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,事务由 Mybatis 控制-->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池,由Mybatis管理,数据库名是mybatis_test,Mysql用户名root,密码root -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
</configuration>

6、创建 po 类

Po 类作为 mybatis 进行 sql 映射使用,po 类通常与数据库表对应,User.java 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package cn.zhisheng.mybatis.po;
import java.util.Date;
/**
 * Created by 10412 on 2016/11/28.
 */
public class User
{
    private int id;
    private String username;            // 用户姓名
    private String sex;                 // 性别
    private Date birthday;              // 生日
    private String address;             // 地址
    //getter and setter
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

7、根据用户 id(主键)查询用户信息

2
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package cn.zhisheng.mybatis.first;
import cn.zhisheng.mybatis.po.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
    /**
* Created by 10412 on 2016/11/28.
*/
public class MybatisFirst
{
   //根据id查询用户信息,得到用户的一条记录
   @Test
   public void findUserByIdTest() throws IOException
   {
       //Mybatis 配置文件
       String resource = "SqlMapConfig.xml";
       //得到配置文件流
       InputStream inputStream = Resources.getResourceAsStream(resource);
       //创建会话工厂,传入Mybatis的配置文件信息
       SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     //通过工厂得到SqlSession
      SqlSession sqlSession = sqlSessionFactory.openSession();
      //通过SqlSession操作数据库
      //第一个参数:映射文件中Statement的id,等于 = namespace + "." + Statement的id
      //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
      //sqlSession.selectOne 结果与映射文件中所匹配的resultType类型的对象
      User user = sqlSession.selectOne("test.findUserById", 1);
      System.out.println(user);
      //释放资源
      sqlSession.close();
  }
}

然后运行一下这个测试,发现结果如下就代表可以了:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

8、根据用户名称模糊查询用户信息列表

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

同样测试一下 findUserByUsernameTest  ,如果运行结果如下就代表没问题:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

提示:

通过这个代码可以发现,其中有一部分代码是冗余的,我们可以将其封装成一个函数。

1
2
3
4
5
6
7
public void createSqlSessionFactory() throws IOException {
		// 配置文件
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

注意:

1、#{ } 和 ${ } 的区别

2、parameterType 和 resultType 区别

3、selectOne 和 selectList 区别

9、添加用户

然后在  MybatisFirst.java  中写一个测试函数,代码如下

11
12
13
14
15
16
17
18
19
20
21
@Test
    public void insetrUser() throws IOException, ParseException {
        //Mybatis 配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入Mybatis的配置文件信息
        SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");
        user.setUsername("田志声");
        user.setSex("男");
        user.setBirthday(sdf.parse("2016-11-29"));
        user.setAddress("江西南昌");
        sqlSession.insert("test.insetrUser", user);
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

然后 run 一下,如果出现的结果如下,那么就是成功了。

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

同时数据库也能查询到刚插入的用户信息:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

10、自增主键返回 与 非自增主键返回

11、删除用户

前面说了这么多了,这里就简单来说明下:

在 User.xml 文件中加入如下代码:

1
2
3
4
<!--删除用户-->
    <delete id="deleteUserById" parameterType="int">
        delete from user where user.id = #{id}
    </delete>

在 MybatisFirst.java 文件中加入如下代码:

4
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//删除用户
    @Test
    public void deleteUserByIdTest() throws IOException
    {
        //Mybatis 配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入Mybatis的配置文件信息
        SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数:映射文件中Statement的id,等于 = namespace + "." + Statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        sqlSession.delete("test.deleteUserById", 26);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

测试结果如下:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

之前的数据库 user 表查询结果:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

执行完测试代码后,结果如下:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

12、更新用户信息

在 User.xml 中加入如下代码:

1
2
3
4
5
6
7
8
9
<!--根据id更新用户
        需要输入用户的id
        传入用户要更新的信息
        parameterType指定user对象,包括id和更新信息,id必须存在
        #{id}:从输入对象中获取id属性值
-->
<update id="updateUserById" parameterType="cn.zhisheng.mybatis.po.User">
        update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where user.id = #{id}
    </update>

然后在 MybatisFirst.java 中加入

8
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//根据id更新用户信息
    @Test
    public void updateUserByIdTest() throws IOException, ParseException {
        //Mybatis 配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入Mybatis的配置文件信息
        SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //为了设置生日的日期输入
        SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");
        User user = new User();
        //根据id更新用户信息
        user.setId(24);
        user.setUsername("张四风");
        user.setBirthday(sdf.parse("2015-01-12"));
        user.setSex("女");
        user.setAddress("上海黄埔");
        //通过SqlSession操作数据库
        //第一个参数:映射文件中Statement的id,等于 = namespace + "." + Statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        sqlSession.update("test.updateUserById", user);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

测试结果如下:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

查看数据库,id 为 24 的用户信息是否更新了:

走进JavaWeb技术世界14:通过项目逐步深入了解Mybatis(一)

啊,是不是很爽,所有的需求都完成了。

没错,这只是 Mybatis 的一个简单的入门程序,简单的实现了对数据库的增删改查功能,通过这个我们大概可以了解这个编程方式了。

期待接下来的 Mybatis高级知识文章吧!

一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)


推荐阅读:
  1. 走进热修复框架AndFix的世界
  2. 一文带你深入了解 redis 复制技术及主从架构

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javaweb 世界 走进

上一篇:试用watir——由喜忧参半到柳暗花明

下一篇:内存对齐,大端字节   序小端字节序验证

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》