zoukankan      html  css  js  c++  java
  • MyBatis入门01

    MyBatis入门

    一、下载地址

    GitHub:
    https://github.com/mybatis/mybatis-3/releases
    Maven:
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

    二、入门级别程序案例

    1、创建Java工程,导入mybatis基本jar包与数据库驱动

    asm-7.1.jar
    cglib-3.3.0.jar
    commons-logging-1.2.jar
    javassist-3.27.0-GA.jar
    log4j-1.2.17.jar
    log4j-api-2.13.3.jar
    log4j-core-2.13.3.jar
    mybatis-3.5.5.jar
    mysql-connector-java-8.0.16.jar
    ognl-3.2.14.jar
    slf4j-api-1.7.30.jar
    slf4j-log4j12-1.7.30.jar

    2、src下创建sqlMapConfig.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC 
    "-//mybatis.org//DTD Config 3.0//EN" 
    "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.cj.jdbc.Driver" />
                    <property name="url"
                        value="jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&amp;useUnicode=true&amp;useSSL=false&amp;serverTimezone=UTC" />
                    <property name="username" value="root" />
                    <property name="password" value="1234" />
                </dataSource>
            </environment>
        </environments>
        
        
        <!-- 引入实体对应的映射文件 -->
        <mappers>
            <mapper resource="entity/User.xml"/>        
        </mappers>
    </configuration>

    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

    数据表

    对应的实体类

    package entity;
    
    import java.util.Date;
    
    //mybatis使用得POJO实体类
    public class User {
    
        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String Address;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public String getAddress() {
            return Address;
        }
        public void setAddress(String address) {
            Address = address;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", Address="
                    + Address + "]";
        }
        
        
    }

    Mabatis与实体类对应的配置文件

    <?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">
        <select id="queryUserById" parameterType="int" resultType="entity.User">
            select * from user where id=#{id}
        </select>
        
        <select id="userList" parameterType="string" resultType="entity.User">
            select * from user where username like'%${value}%'
        </select>
        
        <insert id="addUser" parameterType="entity.User">
            <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>
        
        <update id="updateUser" parameterType="entity.User">
        update user set username=#{username} where id=#{id}
        </update>
        
        <delete id="rmUser" parameterType="int">
            delete from user where id=#{id}
        </delete>
    </mapper>

    junit测试类

    import static org.junit.Assert.*;
    
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    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 entity.User;
    
    public class MytaitsTest {
    
        //查询单个结果
        @Test
        public void fun1() throws Exception {
            //读取配置文件
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //构建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //开启session
            SqlSession session = sqlSessionFactory.openSession();
            
            User user = session.selectOne("test.queryUserById", 10);
            
            System.out.println(user);
            
            //关闭session
            session.close();
        }
        
        //查询多个结果
        @Test
        public void fun2() throws Exception {
            //读取配置文件
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //构建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //开启session
            SqlSession session = sqlSessionFactory.openSession();
            
            List<User> list = session.selectList("test.userList", "王");
            
            for (User user : list) {
                System.out.println(user);
            }
            
            //关闭session
            session.close();
        }
        
        //插入数据
        @Test
        public void fun3() throws Exception {
            //读取配置文件
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //构建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //开启session
            SqlSession session = sqlSessionFactory.openSession();
            
            User user = new User();
            user.setUsername("张三");
            user.setBirthday(new Date());
            user.setAddress("北京");
            user.setSex("男");
            int num = session.insert("test.addUser", user);
            if(num==1) {
                System.out.println("成功添加数据");
                System.out.println("新插入资料的ID:"+user.getId());
            }
            
            //如果不提交事务,则不会添加进数据库
            session.commit();
            //关闭session
            session.close();
        }
        
            //修改资料
            @Test
            public void fun4() throws Exception {
                //读取配置文件
                InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                //构建sqlSessionFactory
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                //开启session
                SqlSession session = sqlSessionFactory.openSession();
                
                User user = new User();
                user.setUsername("张1");
                user.setId(29);
                int num = session.update("test.updateUser", user);
                if(num==1) {
                    System.out.println("修改成功");                
                }
                
                //如果不提交事务,则不会添加进数据库
                session.commit();
                
                //关闭session
                session.close();
            }
            
            
            //删除用户
            @Test
            public void fun5() throws Exception {
                //读取配置文件
                InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                //构建sqlSessionFactory
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                //开启session
                SqlSession session = sqlSessionFactory.openSession();
                
                
                
                int num = session.delete("test.rmUser", 25);
                if(num==1) {
                    System.out.println("删除成功");                
                }
                
                //如果不提交事务,则不会添加进数据库
                session.commit();
                
                //关闭session
                session.close();
            }
    }

    说明

    一、流程

      1、Mybatis核心sqlMapConfig.xml配置文件的配置

      2、实体类的Mapper  及上面User.xml的创建

      3、在sqlMapConfig引入POJO类对应的XML映射文件

    核心基础代码

    参数说明:

      param1:配置文件中的 namespace.id

      param2:sql语句需要的参数

     //读取配置文件
                InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                //构建sqlSessionFactory
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                //开启session
                SqlSession session = sqlSessionFactory.openSession();
                
                
                //此处操作DB
                //session.selectOne("test.queryUserById", 10);
                //session.selectList("test.userList", "王");
                //session.insert("test.addUser", user);
                //session.update("test.updateUser", user);
                //session.delete("test.rmUser", 25);
                
                //如果不提交事务,则不会添加进数据库
                session.commit();
                
                //关闭session
                session.close();        

    使用Mapper动态代理的方式

    Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),
    由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。 Mapper接口开发需要遵循以下规范:4个相同 1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。 2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同 3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同 4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

    UserMapper.xml

    补充说明: #{}为插值表达式,${}为字符串拼接

    不同版本的Insert返回的ID有区别,有的是设置 keyColumn=”id‘’ 有的是设置resultType="int"

    <?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">
    <!-- namespace要与接口的全路径相同 -->
    <mapper namespace="mapper.UserMapper">
        <select id="findUserById" parameterType="int" resultType="entity.User">
            select * from user where id=#{id}
        </select>
        
        <select id="findUserByStr" parameterType="string" resultType="entity.User">
            select * from user where username like "%"#{str}"%"
        </select>
        
        <insert id="addUser" parameterType="entity.User">
            <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>
        
        <update id="updateUser" parameterType="entity.User">
            update user set username=#{username},address=#{address},sex=#{sex} where id=#{id}
        </update>
        
        <delete id="rmUser" parameterType="int" >
            delete from user where id=#{id}
        </delete>
    </mapper>

    UserMapper.java

    package mapper;
    
    import java.util.List;
    
    import entity.User;
    
    public interface UserMapper {
        
        /**
         *根据id获取单个用户
         * @param id
         * @return
         */
        public User findUserById(int id);
        
        
        /**
         * @param str 模糊查询,输入需要查询的字符
         * @return 返回查询的user集合
         */
        public List<User> findUserByStr(String str);
        
        /**
         * 会将加入的主键返回赋值给User对象
         * @param user 添加用户对象
         * @return 返回添加笔数
         */
        public int addUser(User user);
        
        /**
         * @param user  更新的User对象
         * @return 返回更新的笔数
         */
        public int updateUser(User user);
        
        /**
         * 根据id删除用户
         * @param id
         * @return 删除笔数
         */
        public int rmUser(int id);
    }

    测试类

    package mapperTest;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    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 entity.User;
    import mapper.UserMapper;
    
    public class MapperTest {
    
        SqlSessionFactory sqlSessionFactory=null;
        //在测试前的准备项,初始化sqlSessionFactory
        @Before
        public void setMybatis() throws IOException {
            //获取配置文件
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //建立sessionFactory
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);        
        }
        
        //测试查询一个
        @Test
        public void func1() {
            
            //打开session
            SqlSession sqlSession = this.sqlSessionFactory.openSession();
            //让mabatis为我们创建接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //执行查询方法  方法名就是配置文件中的id
            User user = mapper.findUserById(28);
            
            System.out.println(user);
            
            sqlSession.close();
        
        }
        
        /**
         * 测试模糊查询多个用户
         */
        @Test
        public void func2() {
            
            //打开session
            SqlSession sqlSession = this.sqlSessionFactory.openSession();
            //让mabatis为我们创建接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //执行查询方法  方法名就是配置文件中的id
             List<User> list = mapper.findUserByStr("王");
            
            for (User user : list) {
                System.out.println(user);
            }
            
            sqlSession.close();
        
        }
        
        /**
         * 测试插入资料
         */
        @Test
        public void func3() {
            
            //打开session
            SqlSession sqlSession = this.sqlSessionFactory.openSession();
            //让mabatis为我们创建接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //执行查询方法  方法名就是配置文件中的id
             User user = new User();
             user.setUsername("李四");
             user.setAddress("上海");
             user.setBirthday(new Date());
             user.setSex("男");
             int num = mapper.addUser(user);
            System.out.println("成功插入:"+num+"笔资料:------------");
            System.out.println("新插入的用户的主键ID是:"+user.getId());
            
            //必须提交事务
            sqlSession.commit();
            sqlSession.close();
        
        }
        
        /**
         * 测试更新资料
         */
        @Test
        public void func4() {
            
            //打开session
            SqlSession sqlSession = this.sqlSessionFactory.openSession();
            //让mabatis为我们创建接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //执行查询方法  方法名就是配置文件中的id
             User user = new User();
             user.setUsername("王五");
             user.setAddress("北京");
             user.setId(32);
             user.setSex("男");
             int num = mapper.updateUser(user);
            System.out.println("成功更新一笔资料:"+num+"笔资料:------------");
                    
            //必须提交事务
            sqlSession.commit();
            sqlSession.close();
        
        }
        
        /**
         * 测试更新资料
         */
        @Test
        public void func5() {
            
            //打开session
            SqlSession sqlSession = this.sqlSessionFactory.openSession();
            //让mabatis为我们创建接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            
            int rmNum = mapper.rmUser(16);
            
            System.out.println("删除了:"+rmNum+"  笔资料");
            //必须提交事务
            sqlSession.commit();
            sqlSession.close();
        
        }
    }

    核心代码

      SqlSessionFactory sqlSessionFactory=null;
        //在测试前的准备项,初始化sqlSessionFactory
        @Before
        public void setMybatis() throws IOException {
            //获取配置文件
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //建立sessionFactory
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);        
        }
    
    
        //打开session
            SqlSession sqlSession = this.sqlSessionFactory.openSession();
            //让mabatis为我们创建接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //执行查询方法  方法名就是配置文件中的id
    
             User user = mapper.findUserById(28);
             List<User> list = mapper.findUserByStr("王");
            int num = mapper.addUser(user);
            int num = mapper.updateUser(user);
            int rmNum = mapper.rmUser(16);
            
                    
            //必须提交事务
            sqlSession.commit();
            sqlSession.close();

    sqlMapConfig.xml配置说明

    properties(属性)
    settings(全局配置参数)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境集合属性对象)
        environment(环境子属性对象)
            transactionManager(事务管理)
                dataSource(数据源)
    mappers(映射器)
            

    在sqlMapConfig.xml中使用  properties  文件

    <?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>
        <!-- 是用resource属性加载外部配置文件 -->
        <properties resource="db.properties">
            <!-- 在properties内部用property定义属性 -->
            <!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
            <property name="jdbc.username" value="root123" />
            <property name="jdbc.password" value="root123" />
        </properties>
    
        <!-- 和spring整合后 environments配置将废除 -->
        <environments default="development">
            <environment id="development">
                <!-- 使用jdbc事务管理 -->
                <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="sqlmap/User.xml" />
            <mapper resource="mapper/UserMapper.xml" />
        </mappers>
    </configuration>
    MyBatis 将按照下面的顺序来加载属性:
        在 properties 元素体内定义的属性首先被读取。 
        然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。

    别名

     mybatis支持别名:
    别名    映射的类型
    _byte     byte 
    _long     long 
    _short    short 
    _int      int 
    _integer  int 
    _double   double 
    _float    float 
    _boolean  boolean 
    string    String 
    byte      Byte 
    long      Long 
    short     Short 
    int       Integer 
    integer   Integer 
    double    Double 
    float     Float 
    boolean   Boolean 
    date      Date 
    decimal   BigDecimal 
    bigdecimal     BigDecimal 
    map    Map

    自定义类别名

    <typeAliases>
            <!-- 单个别名定义 -->
            <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
            <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
            <package name="cn.itcast.mybatis.pojo" />
            <package name="其它包" />
        </typeAliases>

    mappers映射器

    使用相对于类路径的资源(现在的使用方式)
    如:<mapper resource="sqlmap/User.xml" /><mapper class=" " />
    使用mapper接口类路径
    如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
    注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
    
    <package name=""/>
    注册指定包下的所有mapper接口
    如:<package name="cn.itcast.mybatis.mapper"/>
    注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
  • 相关阅读:
    IOS 开发者账号 (team账号)
    我能否把一个开发者帐号下的app转移到另一个开发者帐号下面?
    Xcode清楚缓存、清理多余证书
    CABasiAnimation的变化属性
    CATransform3DMakeRotation注意
    绘图详解(转摘)
    iOS开发UI篇—核心动画(UIView封装动画)(转摘)
    iOS开发UI篇—核心动画(转场动画和组动画)(转摘)
    iOS开发UI篇—核心动画(关键帧动画)(转摘)
    iOS开发UI篇—核心动画(基础动画)
  • 原文地址:https://www.cnblogs.com/harriets-zhang/p/13657364.html
Copyright © 2011-2022 走看看