zoukankan      html  css  js  c++  java
  • 关于使用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是查询一条或多条记录。

  • 相关阅读:
    Could A New Linux Base For Tablets/Smartphones Succeed In 2017?
    使用libhybris,glibc和bionic共存时的TLS冲突的问题
    6 Open Source Mobile OS Alternatives To Android in 2018
    Using MultiROM
    GPU drivers are written by the GPU IP vendors and they only provide Android drivers
    Jolla Brings Wayland Atop Android GPU Drivers
    How to Use Libhybris and Android GPU Libraries with Mer (Linux) on the Cubieboard
    闲聊Libhybris
    【ARM-Linux开发】wayland和weston的介绍
    Wayland and X.org problem : Why not following the Android Solution ?
  • 原文地址:https://www.cnblogs.com/zdb292034/p/8675766.html
Copyright © 2011-2022 走看看