• MyBatis--学习第一天


    Mybatis概念引入
    为什么要使用mybatis框架
    传统JDBC开发持久层存在的问题
    1. JDBC 原生代码 比较繁琐 加载驱动 获得连接等动作比较频繁 手动封装查询结果方法 从resultSet结果集中封装代码考虑欠妥 后期代码修改和维护比较麻烦
    2. 虽然使用了连接池 DButil BaseDao 等方式对上述问题进行了优化 但是仍然存在
    3. sql语句和代码的耦合度高,修改业务逻辑引发修改各种代码和SQL语句的问题 进而需要重新编译

    mybatis框架的好处
    1. 降低了SQL语句和代码之间的耦合 SQL语句以配置文件的形式存在 修改SQL语句不需要重新编译项目
    2. 连接数据库使用高性能连接池 考虑到了线程并发等问问题 使用缓存优化 提高效率
    3. 结果集数据封装也已经大大优化 减少了结果集数据转化javaObject对象的问题
    4. 优化性能 通过各种手段提升DAO层的响应速度

    ORM

    O Object java中的对象
    R Relation 关系型数据库
    M Mapping 映射关系
    其实就是 Object对象与关系型数据库表格之间的映射 关系 通过SQL语句体现

    mybatis 是一种半自动的ORM框架
    半自动 SQL语句体现映射关系 SQL语句还是要字节写的 框架中并没有给我们完全提供
    虽然偶尔使用逆向工程工具 但是也不是mybatis中封装的

    全自动 hibernat 全自动持久层框架 但是饱受赞誉和诟病
    赞誉 不用写SQL语句
    诟病 封装的SQL没有办法更好的处理 特殊业务逻辑 框架比较臃肿 运行开销大

    模式1 基于传统DAO层开发 简化版图解 没有接口

    二.框架搭建

    创建项目

    创建项目 testMybatis
    在项目下创建 lib目录用于存放 mybatis jar包
    导入mybatis 依赖的jar文件
    1 mybatis 核心包

     2 mybatis 依赖的其他jar包

     

     3 导入jar包

    添加实体类

     在项目中添加mybatis核心配置文件 配置文件为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>
        <!--引入properties 属性配置文件 使用相对路径方式-->
        <properties resource="jdbc.properties"></properties>
        <!--设置日志的处理方式 默认 是log4j 也可以写出来-->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
        <!--扫描实体类包 给所有实体类自动生成别名  生成的别名就是 类名首字母小写-->
        <typeAliases>
            <package name="com.bjsxt.pojo"></package>
        </typeAliases>
        <!--environment 代表mybatis框的配置信息-->
        <environments default="mysql"> <!--指定默认使用哪个连接信息 如果指定的不存在 那么就使用第一个-->
            <environment id="mysql"><!--可以配置mysql连接信息-->
                <transactionManager type="JDBC"/><!--事务管理器-->
                <dataSource type="POOLED"><!--以连接池形式管理连接对象 连接池配置信息-->
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
    
        </environments>
        <mappers>
            <mapper resource="com/bjsxt/mapper/EmpMapper.xml"/><!--用于指定 ORM映射文件位置信息-->
            <mapper resource="com/bjsxt/mapper/EmpMapper2.xml"/>
            <mapper resource="com/bjsxt/mapper/EmpMapper3.xml"/>
        </mappers>
    </configuration>

    注意 这里的包层次使用 / 不是用 .

    配置xml文件按照官方文档顺序配置

    书写对象映射文件 将SQL语句转移到映射文件 通过sql语句体现Object和数据库之间的映射关系
    EmpMapper.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="emp">
        <!--namespace 名称空间 通过该命名空间来寻找要执行的SQL语句的范围
            当前映射文件主要体现Emp对象和 emp表格的映射关系 暂时可以简单写成emp
            多个mapper 映射文件中的 namespace 属性值不能相同
        -->
        <!--
                public Emp findEmpByEmpno(int empno);
        select  用于指定该语句是查询语句  还有 insert delete update
        id      用于指定 给SQL语句的编号 和接口中的方法名对应  public List<Emp> findAllEmp();
        parameterType 用于定义SQL语句中需要的参数类型 如果没有参数可以不写 对应接口方法中的参数列表
        resultType 用于指定SQL语句执行后返回的结果数据类型   对应接口中的 返回值 类型
                如果返回值类型是集合 那这里书写集合中元素类型的全限定名即可 例如 com.bjsxt.pojo.Emp
        -->
        <!--<select id="selectBlog" parameterType="int" resultType="Blog">
            select * from Blog where id = #{id}
        </select>-->
        <!--查询所有emp信息  获取Emp对象集合的写法-->
        <select id="findAllEmp"  resultType="com.bjsxt.pojo.Emp">
            select * from emp
        </select>
    </mapper>

    定义测试类  使用mybatis框架 查询数据

    import com.bjsxt.pojo.Emp;
    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 java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) throws IOException {
            //获取输入流,配置文件--mybatis.xml
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);
            //使用工厂打开一个session
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //使用SqlSession进行增删改查
            List<Emp> empList = sqlSession.selectList("findAllEmpMap");
            for (Emp emp : empList
            ) {
                System.out.println(emp);
            }
            //sqlSession.close();
            System.out.println("----------------------------------------------");
            Emp emp = sqlSession.selectOne("findByEmp",7566);
            System.out.println(emp);
    
            sqlSession.close();
        }
    }

    在src下  添加log4j日志文件 即可  文件名为 log4j.properties

    # 这里控制日志的打印级别 和打印方式
    log4j.rootCategory=debug,CONSOLE  
    # ,LOGFILE  暂时可以不用向配置文件中打印
    # 这里是向控制台打印信息
    log4j.logger.com.bjsxt.mapper=debug
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n
    # 这里是向文件中打印日志信息
    log4j.appender.LOGFILE=org.apache.log4j.FileAppender
    log4j.appender.LOGFILE.File=d:/axis.log
    log4j.appender.LOGFILE.Append=true
    log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

    mybatis 支持properties 属性配置文件的读取
    可以将 数据库连接信息 进一步抽取出来 单独放入一个文件
    好处
    1避免在mybatis核心配置文件中配置的信息太过密集,mybatis 配置文件不至于太臃肿
    2可以让配置文件形成更明确的分工 便于项目结构的观察和解析

    jdbc.properties 属性配置文件

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false
    username=root
    password=root

    MyBatis查询方式

    <?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="emp2">
        <!--查询所有emp信息  获取Emp对象集合的写法-->
        <select id="findAllEmp" parameterType="int" resultType="emp">
            select * from emp where empno=#{empno}
        </select>
    
        <select id="findByEmpno" parameterType="int" resultType="emp">
            select * from emp where deptno=#{deptno}
        </select>
    
        <select id="findAllEmpMap"  resultType="emp">
            select * from emp
        </select>
    import com.bjsxt.pojo.Emp;
    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 java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    import java.util.Map;
    
    public class Test2 {
        public static void main(String[] args) {
            SqlSession sqlSession = getSqlSession();
            /*查询的3中方式*/
            Emp emp = sqlSession.selectOne("emp2.findAllEmp", 7566);
            System.out.println(emp);
            System.out.println("----------------------------");
    
    
            List<Emp> empno = sqlSession.selectList("findByEmpno", 20);
            for (Emp e : empno
            ) {
                System.out.println(e);
            }
            System.out.println("=============================");
    
    
            Map<Integer, Emp> maps = sqlSession.selectMap("emp2.findAllEmpMap", "empno");
            System.out.println(maps.get(7566));
            //关闭
            sqlSession.close();
        }
    
        public static SqlSession getSqlSession() {
            SqlSession sqlSession = null;
            try {
                InputStream is = Resources.getResourceAsStream("mybatis.xml");
                SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
                SqlSessionFactory factory = factoryBuilder.build(is);
                sqlSession = factory.openSession();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sqlSession;
        }
    }

    MyBatis的参数传递查询

    <?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.bjsxt.mapper.EmpMapper2">
        
        <select id="findEmpByEmpNo" resultType="emp" parameterType="int" >
            <!-- 根据参数列表中多个参数的索引取出 参数的值  0代表参数列表中的第一个参数-->
            <!-- 当且仅当参数只有一个 name #{}中的参数名其实是可以随便写的-->
            <!--select  * from emp where empno =#{0}-->
            select  * from emp where empno =#{asdfasdf}
        </select>
        <!--第二种参数类型 如果需要传递多个参数 可以将多个参数封装进一个对象 作为属性传入
            #{} 中放的是传入对象的属性名
        -->
        <select id="findEmpByEmpnoAndEname" resultType="emp" parameterType="emp">
            select * from emp where empno =#{empno} and ename = #{ename}
        </select>
        <!--第三种参数方式 使用map集合 当多个参数不属于同一个对象时 可以使用map集合传入
       
        -->
        <select id="findEmpByEmpnoAndEname2" resultType="emp" parameterType="map">
            select * from emp where empno =#{a} and ename = #{b}
        </select>
        <!--
                parameterType 可以写 也可以不写 但是如果写了 就要写对
                #{} 可以取值 代表使用preparedStatement对象 使用 ?作为占位
                ${} 可以取值 代表使用 Statement 对象 代表字符串的拼接 没有 ?占位
                以后基本使用 #      $不推荐使用 字符串拼接问题和注入攻击问题
        -->
        <!--<select id="findEmpByEmpnoAndEname2" resultType="emp" parameterType="map">
            select * from emp where empno =${a} and ename = '${b}'
        </select>
    -->
    </mapper>
    import com.bjsxt.pojo.Emp;
    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 java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    /*
    多个参数,查询
     */
    public class Test3 {
        public static void main(String[] args) {
            Emp emp = new Emp();
            emp.setEmpno(7499);
            emp.setEname("fasf");
            SqlSession sqlSession = getSqlSession();
            Emp emps = sqlSession.selectOne("emp2.findEmpByEmpnoAndEname", emp);
            System.out.println(emps);
            System.out.println("---------------------------------------------");
    
    
            Map<String, Object> map = new HashMap<>();
            map.put("a", 7566);
            map.put("b", "JONES");
            Object o = sqlSession.selectOne("emp2.findEmpByEmpnoAndEname2", map);
            System.out.println(o);
            System.out.println("----------------------------------------");
            Map<String, Object> map2 = new HashMap<>();
            map2.put("empno", 7566);
            map2.put("ename", "JONES");
            Object oo = sqlSession.selectOne("emp2.findEmpByEmpnoAndEname3", map2);
            System.out.println(oo);
        }
    
        public static SqlSession getSqlSession() {
            SqlSession sqlSession = null;
            try {
                InputStream is = Resources.getResourceAsStream("mybatis.xml");
                SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
                SqlSessionFactory factory = factoryBuilder.build(is);
                sqlSession = factory.openSession();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sqlSession;
        }
    }

    MyBatis中增删改查

    <?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="emp3">
        <!--增删改查写法-->
        <insert id="addEmp" parameterType="emp">
            insert into emp values (default,#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})
        </insert>
        
        <update id="updateEmpByEmpno" parameterType="emp">
            update emp set
            ename =#{ename},
            job=#{job},
            mgr=#{mgr},
            hiredate=#{hiredate},
            sal=#{sal},
            comm=#{comm},
            deptno=#{deptno}
            where empno=#{empno}
        </update>
        
        <delete id="deleteEmpByEmpno" parameterType="string">
            delete from emp where ename =#{ename}
        </delete>
        
        <select id="findEmpByEname" parameterType="string" resultType="emp">
            select * from emp where ename like '%${value}%'
        </select>
    </mapper>
    import com.bjsxt.pojo.Emp;
    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 java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    public class Test4 {
    
        public static void main(String[] args) {
            SqlSession sqlSession = getSqlSession();
            Emp emp = new Emp();
            /*增加*/
            /*emp.setEname("哈哈哈");
            emp.setJob("xxxx");
            emp.setMgr(5321);
            emp.setHiredate(new Date());
            emp.setSal(400);
            emp.setComm(3000);
            emp.setDeptno(20);
            int addEmp = sqlSession.insert("emp3.addEmp", emp);
            System.out.println(addEmp);
            sqlSession.commit();*/
    
            /*修改*/
            /*emp.setEname("哈哈哈");
            emp.setJob("aaaa");
            emp.setMgr(4321);
            emp.setHiredate(new Date());
            emp.setSal(400);
            emp.setComm(3000);
            emp.setDeptno(20);
            emp.setEmpno(7935);
            int updateEmpByEmpno = sqlSession.update("emp3.updateEmpByEmpno", emp);
            System.out.println(updateEmpByEmpno);
            sqlSession.commit();*/
    
    
            /*删除*/
            /*int deleteEmpByEmpno = sqlSession.delete("emp3.deleteEmpByEmpno","哈哈哈");
            System.out.println(deleteEmpByEmpno);
            sqlSession.commit();*/
    
            /*模糊查询*/
            List<Emp> emps = sqlSession.selectList("emp3.findEmpByEname", "s");
            for (Emp e : emps
            ) {
                System.out.println(e);
            }
    
    
        }
    
    
        public static SqlSession getSqlSession() {
            SqlSession sqlSession = null;
            try {
                InputStream is = Resources.getResourceAsStream("mybatis.xml");
                SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
                SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);
                sqlSession = sqlSessionFactory.openSession();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sqlSession;
        }
    }

    项目路径

  • 相关阅读:
    [非技术]简单预测中美关系未来的走向
    权限系统模型和常用权限框架
    [Tomcat]了解Tomcat,从它的结构开始
    [Mybatis]用AOP和mybatis来实现一下mysql读写分离
    [MQ]说一说MQ消息积压
    [MQ]再谈延时队列
    [Web] 浅谈Cookie,Session,Token
    k8s搭建
    微信公众平台开发(2)扫描二维码添加公众账号
    微信公众平台开发模式
  • 原文地址:https://www.cnblogs.com/zimo-bwl1029-s/p/11449039.html
Copyright © 2020-2023  润新知