zoukankan      html  css  js  c++  java
  • mybatis

    1最原始的mybatis使用方式

    核心配置文件sqlMapConfig.xml文件

    还要注意每个sqlMapConfig.xml文件中的标签的顺序,比如下面的就必须properties放在typeAliases前面

    properties>settings>typeAliases>typeHandlers>objectFactory>objectWrapperFactory>plugins>environments>databaseIdProvider>mappers

    <configuration>
    <properties resource="jdbc.properties"/>   //使用properties文件避免硬编码问题
    <typeAliases>
        <package name="com.wang.mybatis.pojo"/>   //设置别名,对应pojo的mapper类就不用指定类的全路径名,直接写类的名字就可以了,而且不区分大小写
    </typeAliases>
    <!-- 和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="${url}" />
                    <property name="username" value="${username}" />
                    <property name="password" value="${password}" />
                </dataSource>
            </environment>
        </environments>
        
        <mappers>
            <mapper resource="sqlmap/User.xml"/>
        </mappers>
    </configuration>

    usermapper.xml文件每个小的mapper.xml文件配置对应的一种pojo

    在里面编写对应的pojo操作

    <mapper namespace="user">
        <select id="finduerbyid" parameterType="Integer" resultType="User">
            select * from user where ID=#{v}
        </select>
        
        <select id="finduserbyname" parameterType="String" resultType="com.wang.mybatis.pojo.User">
            select * from user where name=#{v}
        </select>
        <select id="finduser" parameterType="String" resultType="com.wang.mybatis.pojo.User">
            SELECT * FROM user WHERE name LIKE "%"#{vaue}"%"
        </select>
        <!-- 插入数据并且返回其id -->
        <insert id="insertuser" parameterType="com.wang.mybatis.pojo.User">    
            insert into user(name,age,sex,birthday) values(#{name},#{age},#{sex},#{birthday})
            <selectKey keyProperty="ID" resultType="Integer" order="AFTER">
                select LAST_INSERT_ID()
            </selectKey>
        </insert>
        
        <update id="updateuser" parameterType="com.wang.mybatis.pojo.User">
            update user
            set name=#{name},sex=#{sex},age=#{age},birthday=#{birthday}
            where id=7{#ID}
        </update>
        
        
        <delete id="deleteuser" parameterType="Integer">
            delete from user where ID=#{v}
        </delete>
        
    </mapper>

    本例中的pojo示例,需要实现get和set方法,这样才能实现对数据库的操作

    public class User implements Serializable{       //注意实现序列化接口
        String name;
        int age;
        String sex;
        Date birthday;
        int ID;
        
        public int getID() {
            return ID;
        }
        public void setID(int iD) {
            ID = iD;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        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;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + "]";
        }
    }

    最后Junit测试

    @Test
        public void fun() throws IOException {
            
            //加载核心配置文件
            String resource="SqlMapConfig.xml" ;
            InputStream in=Resources.getResourceAsStream(resource);
            //获得工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //打开会话
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //执行mapper(写好的sql语句)
            User user = sqlSession.selectOne("user.finduerbyid", 1);   //找对应的mapper.xml文件,即user(namespace).finduserbyid(对应的sql语句)
    System.
    out.println(user); User user2 = sqlSession.selectOne("user.finduserbyname", "小王"); System.out.println(user2); List<User> userlist = sqlSession.selectList("user.finduser", ""); for (User user3 : userlist) { System.out.println(user3); }

    上面的test只是简单的测试,如果在dao开发中需要在每个dao实现类中声明sqlsessionfactory等一系列步骤,这样dao开发就会变得麻烦。所以下面的动态代理开发简化上面的步骤


    mapper动态代理开发

    四大原则:

    1接口名称和mapper.xml文件中的namespace一致

    2接口中方法名称和mapper文件中定义的操作语句的id一样

    3接口中方法名称和mapper文件中定义的操作语句入参一致

    4接口中方法名称和mapper文件中定义的操作语句返回值一致

    sqlMapConfig.xml文件

    <configuration>
        <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/hello?characterEncoding=utf-8" />
                    <property name="username" value="root" />
                    <property name="password" value="" />
                </dataSource>
            </environment>
        </environments>
        
        <mappers>
            <!-- <mapper resource="SqlMap/User.xml"/> -->
            <package name="com.wang.pojo"/>    <!-- 如果含有多个mapper文件就指定扫描包 -->
        </mappers>

    当含有多个mapper.xml文件时候(尽量放在一起)可以指定扫描包的形式

    对应接口和

    public interface UserMapper {
        public User FindUserByID(Integer i);
        public Integer count();
        public List<User> SelectAll();
    }

    mapper.xml文件

    <mapper namespace="com.wang.pojo.UserMapper">
        <select id="FindUserByID" parameterType="Integer" resultType="com.wang.pojo.User">
            SELECT *FROM USER WHERE ID=#{v};
        </select>
        <select id="count" resultType="Integer">
            SELECT COUNT(1) FROM USER
        </select>
        <select id="SelectAll" resultType="com.wang.pojo.User">
            SELECT * FROM USER
        </select>
    </mapper>

    pojo和上面的一样,这里就不在写上

    最后测试

        @Test
        public void testName() throws Exception {
            String Resource    ="SqlMapConfig.xml";
            //弄成输入流
            InputStream in = Resources.getResourceAsStream(Resource);
            //用builder创建sqlsession工厂
             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
             //打开会话
             SqlSession sqlSession = sqlSessionFactory.openSession();
             //获得接口
             UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
             //执行接口中的方法
             User user=userMapper.FindUserByID(3);
             System.out.println(user);
             System.out.println(userMapper.count());
             List<User> users=userMapper.SelectAll();
             for (User user2 : users) {
                System.out.println(user2);
            }    
        }

    前者使用sqlSession直接操作,后者用sqlSession获得接口,使用接口操作

  • 相关阅读:
    图片处理连环画特效
    卡片翻页算法
    android 自定义属性
    android 中捕获全局异常
    c++ 学习笔记
    图片怀旧特效处理
    Linux 网络配置
    指针参数传递
    python 读写文件
    PopupWindow 点击外面取消
  • 原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10397632.html
Copyright © 2011-2022 走看看