zoukankan      html  css  js  c++  java
  • mybatis入门案例

    1. mybatis简介
    • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
    • 在mybatis的文件中,提供了一个pdf文档,全英文版的,这里有个中文版的文档http://www.mybatis.org/mybatis-3/zh/index.html

      2. 入门案例

    • 环境准备:博主用的mybatis版本是mybatis-3.4.1、MySQL5.7、jdk1.8。
    • 首先在数据库中建一个表

      

    • 建立一个对应的java类
    public class Student {
    
        private int studentID;
        private String studentName;
        private String studentSex;
    
        public int getStudentID() {
            return studentID;
        }
    
        public void setStudentID(int studentID) {
            this.studentID = studentID;
        }
    
        public String getStudentName() {
            return studentName;
        }
    
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
    
        public String getStudentSex() {
            return studentSex;
        }
    
        public void setStudentSex(String studentSex) {
            this.studentSex = studentSex;
        }
    }
    •  新建一个全局的配置文件,在src下 mybatis-config.xml;配置了一些数据库连接的信息,还有配置了另外一个mappers,studentMapper.xml是针对student的增删改查的SQL配置。这里提供了两种方式配置。第一种是直接把连接数据库的信息放在全局的mybatis-config.xml中;另外一种是将数据库的连接信息放到另外一个properties配置文件中,再在mybatis-config.xml中引用。
    1. 第一种,把连接数据库的信息放在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="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/test" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments>
    
        <mappers>
            <!-- 注册studentMapper.xml文件, studentMapper.xml位于com.test.bean这个包下,所以resource写成com/test/bean/studentMapper.xml -->
            <mapper resource="com/test/bean/studentMapper.xml" />
        </mappers>
    </configuration>

      2.把连接数据的信息放在db.properties中,在mybatis-config.xml中引用db.properties; 新建一个db.properties,和mybatis-config.xml在同一目录。内容如下:

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.username=root
    jdbc.password=root

      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>
    
    <!-- 导入db.properties -->
        <properties resource="db.properties"></properties>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
    
        <mappers>
            <!-- 注册studentMapper.xml文件, studentMapper.xml位于com.test.bean这个包下,所以resource写成com/test/bean/studentMapper.xml -->
            <mapper resource="com/test/bean/studentMapper.xml" />
        </mappers>
    </configuration>
    •  新建一个studentMapper.xml,这个配置文件的内容是配置SQL,并且配置输入输出类型;这里配置的SQL都是通用的,比较灵活,会有一些占位符{# } (这种方式是通过占位符的方式将参数传入SQL语句)和{$ }(这种写法是进行SQL的字符串拼接,可能会导致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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
    
    <mapper namespace="com.test.bean.studentMapper">
        <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getStudent,id属性值必须是唯一的, 不能够重复 
            使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型 resultType="com.test.bean.Student"
            表示将查询结果封装成一个User类的对象返回 
            User类就是users表所对应的实体类 -->
        <!-- 根据id查询得到一个student对象 -->
        <select id="getStudent" parameterType="int" resultType="com.test.bean.Student">
            select *
            from tb_student where studentID=#{id}
        </select>
    
        <!-- 通过姓名模糊查询,返回结果可能为多个,但是这里的结果类型还是对应一个Java类 -->
        <select id="findStudentByName" parameterType="java.lang.String" resultType="com.test.bean.Student">
            select * from tb_student where studentName like #{value}
        </select>
        
        <!-- 插入一条记录 , 如果tb_student中的主键是自增的,那这里就不用管主键,系统会自动分配-->
        <insert id="insertStudent" parameterType="com.test.bean.Student">
            insert into tb_student (studentName,studentSex) values(#{studentName},#{studentSex})
        </insert>
    </mapper>
    •  配置文件写完之后开始编码,读取配置文件,这里写了一个工具类,专门来读取全局的mybatis配置文件,并获取sqlsession
    public class DBTools {
        public static SqlSessionFactory sessionFactory;
    
        static {
            try {
                // 使用MyBatis提供的Resources类加载mybatis的配置文件
                Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
                // 构建sqlSession的工厂
                sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        // 创建能执行映射文件中sql的sqlSession
        public static SqlSession getSession() {
            return sessionFactory.openSession();
        }
    
    }
    •  然后写一个DAO来实现基本的操作。值得注意的是这里的 String statement="com.test.bean.studentMapper.getStudent";// 映射sql的标识字符串 这里的字符串是和studentMapper.xml中配置的SQL语句是一一对应的,在配置文件中配置mapper的时候有一个namespace=" com.test.bean.studentMapper" 然后加上select的SQL对应的id,构成了这里的statement完整的字符串;
    • 在模糊查询部分,和其他的SQL不太一样,这里模糊查询可能会返回多条数据,前面在studentMapper.xml中已经配置了resultType="com.test.bean.Student" 返回的结果是单个的student对象,实际上是返回了一个结果集,但是每个单独的记录都是对应一个student,所以这里返回多条数据的时候resultType还是为单个的Java对象,但是问题又来了,如果结果是只返回了一条数据可以用list接收吗? 当然是可以的,这样list中就只有一个对象了;
    • 从下面的代码也可以看出,当结果是单条数据的时候,用得是session.selectOne()方法,而结果可能有多条的时候,用的是session.selectList();而且这里的模糊查询手动地在传入的参数前后各加了一个%来进行模糊匹配,从这里也可以很明显地感受到mybatis和hibernate的区别,mybatis给程序员非常大的空间让其设计SQL;
    public class StudentDAO {
    
        // 通过ID查询student
        public void findStudentById(int studentID) {
            SqlSession session = DBTools.getSession();
            /**
             * 映射sql的标识字符串,
             * com.test.bean.studentMapper是studentMapper.xml文件中mapper标签的namespace属性的值,
             * getStudent是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
             */
            String statement = "com.test.bean.studentMapper.getStudent";// 映射sql的标识字符串
            Student stu1 = session.selectOne(statement, 1);
            System.out.println(stu1.getStudentID() + "
    " + stu1.getStudentName() + "
    " + stu1.getStudentSex());
            session.close();
        }
    
        // 通过姓名模糊查询
        public void findStudentByName(String studentName) {
            SqlSession session = DBTools.getSession();
            String statement = "com.test.bean.studentMapper.findStudentByName";// 映射sql的标识字符串
            // 这里不能使用selectOne,因为返回的结构可能是多条
            List<Student> list = session.selectList(statement, "%" + studentName + "%");
            System.out.println(list.get(0).getStudentName());
            session.close();
        }
    
        // 插入一条学生信息
        public void insertStudent(Student student) {
            SqlSession session = DBTools.getSession();
            String statement = "com.test.bean.studentMapper.insertStudent";
            session.insert(statement, student);
            session.commit();
            System.out.println("插入成功");
            session.close();
        }
    }
  • 相关阅读:
    一、docker安装CentOS7
    c#使用资源文件完成国际化
    .netcore 读取ansi编码
    省市区数据库
    .netcore2.0发送邮件
    使用py,根据日志记录自动生成周报
    mysql监控每一条执行的sql语句
    根据json生成c#实体类
    使用.net core efcore根据数据库结构自动生成实体类
    winform,同个程序只允许启动一次
  • 原文地址:https://www.cnblogs.com/hello-daocaoren/p/6793428.html
Copyright © 2011-2022 走看看