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

    Mybatis入门程序

    1. 创建java工程, 导入jar包

    其中:mybatis-3.2.7.jar为mybatis的主要jar包, 剩下的为一些依赖的jar包、日志记录的jar包和数据库驱动jar包

    2.配置log4j日志记录文件

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    ### direct messages to file hibernate.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=D:/hibernate.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    ### set log levels - for more verbose logging change 'info' to 'debug' ###

    log4j.rootLogger=info, stdout

    3. 配置Mybatis核心配置文件sqlMapConfig.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>
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理-->
                <transactionManager type="JDBC" />
            <!-- 数据库连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                    <property name="username" value="root" />
                    <property name="password" value="123" />
                </dataSource>
            </environment>
        </environments>


        <!-- 配置mapper映射文件 -->
        <mappers>
            <mapper resource="sqlmap/User.xml"/>
        </mappers>
    </configuration>

    4.配置pojo数据java类

    package cn.rodge.entity;

    import java.util.Date;

    public class User {
        private int id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        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;
        }
    }

    5.配置实体类的映射文件

    在根目录下,某个包内创建sql映射文件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="demo">
        <!-- 根据id获取用户信息
            parameterType:定义输入到sql中的映射类型,
            #{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
            resultType:定义结果映射类型。    
         -->
        <select id="findUserById" parameterMap="int" resultMap="cn.rodge.entity.User">
            SELECT * from `user` where id = #{id}
        </select>
    </mapper>

    6.加载映射文件

    在Mybatis核心配置文件sqlMapConfig.xml中添加映射文件的引用

        <!-- 配置mapper映射文件 -->
        <mappers>
            <mapper resource="sqlmap/User.xml"/>
        </mappers>

    7.在User.xml中添加查询信息

        <!-- 根据id获取用户信息
            parameterType:定义输入到sql中的映射类型,
            #{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
            resultType:定义结果映射类型。    
         -->
        <select id="findUserById" parameterMap="int" resultMap="cn.rodge.entity.User">
            SELECT * from `user` where id = #{id}
        </select>

    注:如果parameterMap中的值是基本数据类型, 那么#{}中的变量名可以为任意值;

      如果parameterMap中的值是POJO,那么#{}中的变量名必须为POJO的属性名

    8.创建java测试类

    package cn.rodge.mybatis.firstDemo;

    import java.io.IOException;
    import java.io.InputStream;

    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 cn.rodge.entity.User;

    public class MybatisFirstDemo {
        
        @Test
        public void demo1 () throws IOException {
            //1创建sessionfactorybuilder对象
            SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
            //2获取核心配置文件输入流
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //3加载核心配置文件,创建sessionfactory
            SqlSessionFactory sessionFactory = factoryBuilder.build(inputStream);
            //4创建sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            //5执行查询
            User user = sqlSession.selectOne("findUserById", 1);
            //6释放资源
            System.out.println(user);
            sqlSession.close();
        }
    }

    9. 代码抽取

     package cn.rodge.mybatis.firstDemo;

    import java.io.IOException;
    import java.io.InputStream;

    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.Before;
    import org.junit.Test;

    import cn.rodge.entity.User;

    public class MybatisFirstDemo {
        private SqlSessionFactory sessionFactory = null;
        @Before
        public void init () throws IOException {
            //1创建sessionfactorybuilder对象
            SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
            //2获取核心配置文件输入流
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //3加载核心配置文件,创建sessionfactory
            sessionFactory = factoryBuilder.build(inputStream);
        }
        
        @Test
        public void findUserById () {
            //4创建sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            //5执行查询
            User user = sqlSession.selectOne("findUserById", 1);
            //6释放资源
            System.out.println(user);
            sqlSession.close();
        }
    }

    10.模糊查询

         <!-- 模糊查询
            ${}是用作字符串的拼接的
            如果parameterType的值为简单数据类型,那么${} 变量名必须为value
            如果parameterType的值为自定义POJO,那么${}的变量名必须为pojo的属性名
        -->
        <select id="findUserByName" parameterType="string" resultType="cn.rodge.entity.User">
            SELECT * FROM `user` where username LIKE '%${value}%'
        </select>

    注:${}存在sql注入的风险,而#{}不存在这种问题

        @Test
        public void findUserByName () {
            //获取sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            //调用sqlsession中的方法进行查询
            List<User> list = sqlSession.selectList("findUserByName", "张");
            //打印结果
            System.out.println(list);
            //释放资源
            sqlSession.close();
        }

    11. #{}和${}

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

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

    12. parameterType和resultType

    parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

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

    13. 添加用户

    user.xml中的配置

      <!-- 插入数据  -->
         <insert id="insertUser" parameterType="cn.rodge.entity.User">
             INSERT INTO user (username, birthday, sex, address) VALUES (#{username}, #{birthday}, #{sex}, #{address})
         </insert>

    java代码

        @Test
        public void insertUser () {
            //获取sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            User user = new User();
            user.setUsername("小乔");
            user.setBirthday(new Date());
            user.setSex("2");
            user.setAddress("动物");
            //执行插入操作
            sqlSession.insert("insertUser", user );
            //提交事务
            sqlSession.commit();
            //释放资源
            sqlSession.close();
        }

    14. 主键返回

     User.xml中配置参数

        <!-- 插入数据  -->
         <insert id="insertUser" parameterType="cn.rodge.entity.User">
             <!--
                 主键返回
                 keyProperty:返回的主键存储在pojo中的哪个属性
                 resultType:返回的主键类型;
                 order:BEFORE表示在插入之前查询主键(UUID)
                         AFTER表示在插入之后查询主键(主键自增长)
              -->
             <selectKey keyProperty="id" resultType="int" order="AFTER">
                 SELECT LAST_INSERT_ID()
             </selectKey>
             INSERT INTO user (username, birthday, sex, address) VALUES (#{username}, #{birthday}, #{sex}, #{address})
         </insert>

     Java代码

        @Test
        public void insertUser () {
            //获取sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            User user = new User();
            user.setUsername("王昭君");
            user.setBirthday(new Date());
            user.setSex("2");
            user.setAddress("西安");
            //执行插入操作
            sqlSession.insert("insertUser", user );
            //打印插入的主键
            System.out.println(user.getId());
            //提交事务
            sqlSession.commit();
            //释放资源
            sqlSession.close();
        }

    15.删除操作

          <!-- 删除数据 -->
         <delete id="deleteUser" parameterType="int">
             DELETE FROM user WHERE id = #{id}
         </delete>

         @Test
        public void deleteUser () {
            //获取sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            //执行删除
            sqlSession.delete("deleteUser", 40);
            //提交事物
            sqlSession.commit();
            //释放资源
            sqlSession.close();
        }

    16. 更新操作

         <!-- 更新操作 -->
         <update id="updateUser" parameterType="cn.rodge.entity.User">
             UPDATE user SET username = #{username} WHERE id = #{id}
         </update>

        @Test
        public void updateUser () {
            //获取sqlsession
            SqlSession sqlSession = sessionFactory.openSession();
            //创建待跟新的数据
            User user = new User();
            user.setId(27);
            user.setUsername("张角");
            //更新操作
            sqlSession.update("updateUser", user );
            //提交事务
            sqlSession.commit();
            //释放资源
            sqlSession.close();
        }

  • 相关阅读:
    linux项目部署学习(1) pyhton3的虚拟环境virtualenv和virtualenvwrapper详解
    linux下pip查看安装包的路径、和指定安装目录
    python+selenium实现长截图
    selenium设置chrome浏览器保持登录方式两种options和cookie
    linux中离线安装django
    理解 bashrc 和 profile
    Django部署阿里云服务时候报错:SQLite 3.8.3 or later is required (found 3.7.17)
    Django的django-admin工具详解
    Yum Install --Downloadonly 离线下载依赖包研究
    分治法求n个点中的最近距离
  • 原文地址:https://www.cnblogs.com/rodge-run/p/6528411.html
Copyright © 2011-2022 走看看