• 关于使用Mybatis的使用说明(一)【未完善待更新】


    (一)搭建Mybatis环境

    (1)先导入常用的jar包:并且需要将lib文件夹下的包导入到项目中

    (2)创建config文件夹,配置log4j.properties文件

    # Global logging configuration
    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
    View Code

    (3)配置数据库连接文件db.properties

    jdbc.driver=oracle.jdbc.driver.OracleDriver
    jdbc.url=jdbc:oracle:thin:@localhost:1521:cmskf
    jdbc.username=cmskf
    jdbc.password=cmskf
    View Code

    (4)配置Mybatis的核心配制文件SqlMapConfig.xml:先暂时配置事务管理器和数据库连接,并加载配制文件:比如db.properties和映射文件mapper.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 resource="db.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>
            <mapper resource="User.xml"/>
        </mappers>
        
    </configuration>
    View Code

    注意:此核心配制文件中标签有一定的顺序呢,在标签<environment></environments>中需要先加载事务管理器,在连接数据库。

    (5)配制pojo对象类:User.java

    package com.dbzhand.pojo;
    
    import java.util.Date;
    
    public class User {
        private int id;
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", sex=" + sex
                    + ", birthday=" + birthday + ", address=" + address + "]";
        }
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        private String sex;
        private Date birthday;
        private String address;
        
    }
    View Code

    (6)配制映射文件User.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="test">
        <!-- 根据用户ID查询用户信息 ,注意返回类型在没有定义别名的时候,使用包.类-->
        <!-- id :sql语句唯一标识符, parameterType是传入参数类型,resultType是返回结果集的类型,
        #{}占位符,起到占位符的作用,当传入的参数类型是基本数据类型的时候,占位符中的变量名可以顺便写
         -->
        <!-- <select id="findUserByID" parameterType="int" resultType="com.dbzhand.pojo.User">
            select * from user1 where id=#{id}
        </select> -->
        <!--(1) 如果输出结果为集合,则可以使用selectList方法 
        (2)若果输入的参数为基本类型,在${}中的值必须为value
        (3)${}为拼接符,有sql注入的风险
        -->
        <!-- <select id="findUserByName" parameterType="String" resultType="com.dbzhand.pojo.User">
            select * from user1 where name like '%${value}%'
        </select> -->
        
        
        <!--
            #{}占位符,如果传入的是占位符,那么#{}中的变量名必须是pojo中对应的属性,属性。。。。。
            如果要返回数据库自增的主键,可以使用SELECT LAST_INSERT_ID()
          -->
        <insert id="insertUser" parameterType="com.dbzhand.pojo.User">
            <!-- 
                执行SELECT LAST_INSERT_ID()数据库函数,返回自增的主键,注意这个函数是MySql数据库的函数,oracle中不能使用
                keyProperty:将返回的主键放入传入参数ID中保存。
                order:当前函数相对于insert语句的执行顺序,在insertt前执行before,在insert之后执行AFTER
                resultType:id的类型,也就是keyproperties中属性的类型
             -->
            <!-- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
                select LAST_INSERT_ID()
            </selectKey> -->
            insert into user1 (name,birthday,sex,address) values(#{name},#{birthday},#{sex},#{address})
        </insert>
        
        <!-- <delete id="delUserById" parameterType="int">
            delete from user where id=#{id}
        </delete>
        
        <update id="updateUserById" parameterType="cn.itheima.pojo.User">
            update user set username=#{username} where id=#{id}
        </update> -->
        
        <delete id="delUserById" parameterType="int">
            delete from user1 where id=#{id}
        </delete>
        <!-- 更新时,传入参数为pojo,而不是id -->
        <update id="updateUserById" parameterType="com.dbzhand.pojo.User">
            update user1 set name=#{name}  where id=#{id}
        </update>
        
    </mapper>
    View Code

    (7)测试类UserTest.java

    package com.dbzhang.test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    import oracle.net.ns.SessionAtts;
    
    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 com.dbzhand.pojo.User;
    /**
     * 关于该类中需要注意的事项:
     * (1)操作数据库的方法中参数:namespace.id
     * (2)关于更新时传参应为:pojo对象
     * (3)Mybatis中默认不会自动提交事务,因此最好手工提交
     * @author Administrator
     *
     */
    public class UserTest {
        /*@Test
        public void findUserByID() throws IOException {
            String resource = "SqlMapConfig.xml";
            // 1.通过流加载配置文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
            System.out.println("
    
    
    "+inputStream);
            // 2.通过核心配置文件输出流创建回话工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                    .build(inputStream);
            // 3.通过 会化工厂创建回话
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 4.开始执行映射文件中国的select
            //此处写法的注意:namespace.id
            User user = (User) sqlSession.selectOne("test.findUserByID", 1);
            System.out.println("
    
    输出:" + user);
            sqlSession.close();
    
        }*/
        /*@Test
        public void findUserByName() throws IOException{
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory  = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession session = sqlSessionFactory.openSession();
            //此处写法的注意:namespace.id
            List<User> list = session.selectList("test.findUserByName", "A");
            System.out.println("
    
    list集合="+list);
            session.close();
            
            
        }*/
        
        /*@Test
        public void testInsertUser() throws Exception{
            String resource = "SqlMapConfig.xml";
            //通过流将核心配置文件读取进来
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //通过核心配置文件输入流来创建会话工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            //通过工厂创建会话
            SqlSession openSession = factory.openSession();
            
            User user = new User();
            user.setUsername("赵四");
            user.setBirthday(new Date());
            user.setSex("1");
            user.setAddress("北京昌平");
            System.out.println("====" + user.getId());
            //此处写法的注意:namespace.id
            openSession.insert("test.insertUser", user);
            //提交事务(mybatis会自动开启事务,但是它不知道何时提交,所以需要手动提交事务)
            openSession.commit();
            
            System.out.println("====" + user.getId());
        }*/
        
        /*插入pojo对象,手动提交事务,针对oracel中,暂时没有实现主键自增,所以插入数据时没有id暂时为空*/
        /*@Test
        public void testInsertUser() throws IOException{
            String resource = "SqlMapConfig.xml";
            //通过流将核心配置文件读取出来
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //通过核心配置文件输入流来创建会话工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //创建会话
            SqlSession sqlSessions = sqlSessionFactory.openSession();
            
            //创建pojo对象User
            User user = new User();
            user.setName("张三丰");
            user.setBirthday(new Date());
            user.setAddress("北京昌平");
            user.setSex("男");
            System.out.println("id1======"+user.getId());
            
            sqlSessions.insert("test.insertUser", user);
            //提交事务(mybatis会自动提交事务,但不知道何时提交,所以需要手动提交事务)
            sqlSessions.commit();
            System.out.println("id2======"+user.getId());
            
        }*/
        
        
        /*执行删除操作,手动提价事务**/
        /*@Test
        public void delUserById() throws IOException{
            String resource = "SqlMapConfig.xml";
            //1.通过流将核心配置文件读取出来
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //2.通过核心输入流创建会话工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //3.打开会话
            SqlSession sqlSession = sqlSessionFactory.openSession();
            sqlSession.delete("test.delUserById", 1);
            //提交事务(mybatis不会自动提交事务,因此需要手动提交)
            sqlSession.commit();
            
            
        }*/
        
        /*是更新操作,根据Id去更新name,需要传入pojo对象**/
        /*@Test
        public void updateUserById() throws IOException{
            String resource = "SqlMapConfig.xml";
            //1.通过流读取配制文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //2.通过核心配制文件输入流创建会话工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //3.打开会话
            SqlSession sqlSession = sqlSessionFactory.openSession();
            
            User user = new User();
            user.setId(1);
            user.setName("李小龙");
            sqlSession.update("test.updateUserById", user);
            //4.提交事务
            sqlSession.commit();
            //5.关闭会话
            sqlSession.close();
            
        }
        */
        
    }
    View Code

    初步完成!!!

     (二)总结:

    (1)区别占位符#{}和拼接符${}的区别:

    #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

    ${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

    (2)关于parameterType和resultType的区别

    parameterType时传入参数的类型,mybatis根据ognl从输入对象中获取参数值并拼接在sql中;

    resultType指定输出类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

    (3)关于selectOne和selectList的区别:

    selectOne是查询一条记录;selectList是查询一条或多条记录。

  • 相关阅读:
    api接口出现Provisional headers are shown,
    yii消息提示扩展
    php中普通类 接口类 抽象类 浅谈
    读韭菜的自我修养
    读李笑来的《把时间当作朋友》
    Spring整合Struts2框架的第二种方式(Action由Spring框架来创建)(推荐大家来使用的)
    Spring整合Struts2框架的第一种方式(Action由Struts2框架来创建)。在我的上一篇博文中介绍的通过web工厂的方式获取servcie的方法因为太麻烦,所以开发的时候不会使用。
    Spring框架整合Struts2框架的传统方法
    ecplice中代码使用快捷键无法格式化,使用其他方法将代码格式化的步骤
    SSH框架整合jar包时的注意事项
  • 原文地址:https://www.cnblogs.com/zdb292034/p/8675766.html
Copyright © 2020-2023  润新知