zoukankan      html  css  js  c++  java
  • Mybatis

    一、Mybatis介绍

      MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录. 半自动化框架。必须写sql语句。

     mybatis 作用: 帮你封装查询的结果以及占位符的赋值。 替换JDBC。

    二、 mybatis 快速入门

      使用IDEA建maven工程,在pox.xml文件里下载相关依赖。

    在pox.xml配置文件中加载lombok依赖

       <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.20</version>
       </dependency>

    2.1、添加 Mybatis 的配置文件conf.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/mybatis" />
    <property name="username" value="root" />
    <property name="password" value="root" />
    </dataSource>
    </environment>
    </environments>
    </configuration>

    2.2、定义表所对应的实体类

    //lombok依赖,自动封装get、set方法
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    private int id;
    private String name;
    private int age;
    //get,set 方法
    }

    2.3定义操作 user表的 sql 映射文件 userMapper.xml

    <?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="com.ykq.mybatis_test.test1.userMapper">
    <select id="getUser" parameterType="int" resultType="com.ykq.mybatis_test.test1.User">
    select * from users where id=#{id}
    </select>
    </mapper>

    2.4 、在 conf.xml 文件中注册 userMapper.xml 文件

    <mappers>
    <mapper resource="com/ykq/mybatis_test/test1/userMapper.xml"/>
    </mappers>

    2.5、编写测试代码:执行定义的 select 语句

    public class Test {
    public static void main(String[] args) throws IOException {
    String resource = "conf.xml";
    //加载 mybatis 的配置文件(它也加载关联的映射文件)
    Reader reader = Resources.getResourceAsReader(resource);
    //构建 sqlSession 的工厂
    SqlSessionFactory sessionFactory = new
    SqlSessionFactoryBuilder().build(reader);
    //创建能执行映射文件中 sql 的 sqlSession
    SqlSession session = sessionFactory.openSession();
    //映射 sql 的标识字符串
    String statement = "com.atguigu.mybatis.bean.userMapper"+".selectUser";
    //执行查询返回一个唯一 user 对象的 sql
    User user = session.selectOne(statement, 1);
    System.out.println(user);
    }
    }

    3、操作 users 表的 CRUD

      我们的实体类或者数据库表中的字段或参数过多时,可以考虑使用Map

        Map传递参数,直接在sql中取出key即可!

        对象传递参数,直接在sql中取对象的属性即可!

        只有一个基本类型参数的情况下,可以直接在sql中取到!

                  多个参数用Map,或者注解!

     

    模糊查询怎么写?
    1.Java代码执行的时候,传递通配符% %

     List<user> userList = mapper. getuserLike("%李%");


    2.在sql拼接中使用通配符!

    select * from mybatis.user where name like %"#{value] "%""

    3.1、XML的实现

    1). 定义 sql 映射 xml 文件:

    <insert id="insertUser" parameterType="com.ykq.ibatis.bean.User">
    insert into users(name, age) values(#{name}, #{age});
    </insert>
    <delete id="deleteUser" parameterType="int">
    delete from users where id=#{id}
    </delete>
    <update id="updateUser" parameterType="com.ykq.ibatis.bean.User">
    update users set name=#{name},age=#{age} where id=#{id}
    </update>
    <select id="selectUser" parameterType="int" resultType="com.ykq.ibatis.bean.User">
    select * from users where id=#{id}
    </select>
    <select id="selectAllUsers" resultType="com.ykq.ibatis.bean.User">
    select * from users
    </select>

    2). config.xml 中注册这个映射文件

    <mappers>
    <mapper resource="com/ykq/mybatis_test/test1/userMapper.xml"/>
    </mappers>

    通过调用dao层方法定义 sql 映射 xml 文件

    dao层

     /**
         * 查询所有
         * @return
         */
        List<User> selectAllUser();
        //添加
        int insertUser(User user);
        //修改
        int updateUser(User user);
        //删除
        int deleteUser(int id);

    sql 映射 xml 文件

    <mapper namespace="com.fyx.dao.UserDao">
        <select id="selectAllUser" parameterType="int" resultType="com.fyx.entity.User">
           select * from user;
        </select>
        <insert id="insertUser">
            insert into user values(#{id},#{username},#{password});
        </insert>
        <update id="updateUser">
            update user set username=#{username},password=#{password} where id=#{id};
        </update>
        <delete id="deleteUser">
            delete from user where id=#{id};
        </delete>
    </mapper>

    测试

    public class UserTest {
        public static void main(String[] args) throws IOException {
    
            //加载mybatis配置文件
            Reader asReader = Resources.getResourceAsReader("mybatis.xml");
            //构建工厂
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(asReader);
            //创建能执行映射文件中华sql的sqlSession
            SqlSession sqlSession = sessionFactory.openSession();
            //提高反射获取dao查询方法
            UserDao userDao = sqlSession.getMapper(UserDao.class);
            List<User> users = userDao.selectAllUser();
            System.out.println(users);
            int i = userDao.insertUser(new User(3,"1112","1125"));
            System.out.println(i);
            int i1 = userDao.updateUser(new User(2, "hahaha", "55555"));
            System.out.println(i1);
            int i2 = userDao.deleteUser(123128);
            System.out.println(i2);
            sqlSession.commit();//提交事务
    
        }
    }

    4、mybatis的一些优化

    (1)把数据源信息抽取到properties文件中(跟以前使用JDBC一样,连接将数据库信息存放在properties文件中)

     第一步:创建properties文件内容:

     第二步:在配置文件中引入该properties文件

     4.2添加日志信息--打印sql语句

     (1)先引入日志jar包

     (2)创建日志的配置文件 log4j.properties

    log4j.rootLogger=DEBUG, Console
    #Console
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    log4j.logger.java.sql.ResultSet=INFO
    log4j.logger.org.apache=INFO
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG

    (3)测试

    4.3为实体类起别名

    (1)在mybatis配置文件中设置别名

     (2)在映射文件文件中使用别名

     5、实体的属性和数据库表的字段不一致

    (1)为查询的结果起别名-----与属性名一致。

     (2)使用resultMap来创建属性与字段的映射关系

     6、mybatis联表查询

    (1)多对一(表与表之间的关系------->外键【逻辑外键】)

    CREATE TABLE teacher(
    t_id INT PRIMARY KEY AUTO_INCREMENT,
    t_name VARCHAR(20)
    );
    
    //teacher     class  一对多
    CREATE TABLE class(
    c_id INT PRIMARY KEY AUTO_INCREMENT,
    c_name VARCHAR(20),
    teacher_id INT  -- 外键
    );
    ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id)
    REFERENCES teacher(t_id); 
    INSERT INTO teacher(t_name) VALUES('LS1');
    INSERT INTO teacher(t_name) VALUES('LS2');
    INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
    INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);

    (2)java实体类如何维持这种关系。

    Teacher {tid, tname}
    
    Class {cid,cname,Teacher teacher}---->class 只包含老师id号。 多对一 可以在多的实体中添加一的实体类对象。

     1.创建实体类

    2.写映射文件

     通过两次查询得到相应的结果

     一对多

    CREATE TABLE student(
    s_id INT PRIMARY KEY AUTO_INCREMENT,
    s_name VARCHAR(20),
    class_id INT
    );
    INSERT INTO student(s_name, class_id) VALUES('xs_A', 1);
    INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);
    INSERT INTO student(s_name, class_id) VALUES('xs_C', 1);
    INSERT INTO student(s_name, class_id) VALUES('xs_D', 2);
    INSERT INTO student(s_name, class_id) VALUES('xs_E', 2);
    INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);

    要求 根据班级id查询班级信息以及该班级下所有的学生信息。

    1.创建实体类

     

     xml 碰到特殊字符如何处理:

     (1)可以使用转移字符;

     

     (2)使用CDATA

     

    出现异常处理:

    (1)

     使用单元测试@Test

    在pox.xml配置文件加载依赖

     (2)数据库连接时区问题

    (3)异常:映射文件未绑定到配置文件中.

  • 相关阅读:
    《GK101任意波发生器》升级固件发布(版本:1.0.2build306)
    《GK101任意波发生器》升级固件发布(版本:1.0.2build198)
    【液晶模块系列基础视频】3.2fatfs接口函数的使用2
    【液晶模块系列基础视频】3.1.fatfs文件系统的移植及接口函数的使用
    《GK101任意波形发生器》任意波文件格式说明
    【液晶模块系列基础视频】4.5.X-GUI图形界面库-进度条等函数简介
    己椒苈黄汤
    脱发与五苓散证
    女子咽部不适案
    凤翅医话——小青龙加石膏汤
  • 原文地址:https://www.cnblogs.com/axinga/p/14559517.html
Copyright © 2011-2022 走看看