zoukankan      html  css  js  c++  java
  • Mybatis的mapper代理开发方法

    一.开发规范

    1.映射文件中的namespase等于mapper接口类路径

    2.statement的id与mapper中的方法名一致

    3.让mapper的接口方法输入参数类型与statement中的parameterType指定的参数类型一致

    4.让mapper的接口方法返回值类型和statement的resultType指定参数类型一致

    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.xml --> <mappers> <!-- 指定classpath下的文件 --> <mapper resource="sqlmap/User.xml"/> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
    UserMapper.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映射文件是以sql语句为单位进行配置,最终将sql语句封装到MappedStatement对象中 namespace命名空间作用是更好对sql语句进行隔离,方便管理sql 注意:后期讲mybatis的mapper代理开发方式时namespace有特殊的作用,如下: namespace等于mapper接口类路径,这样实现通过映射文件找到对应的mapper接口是哪个 --> <mapper namespace="cn.itcast.mybatis.mapper.UserMapper"> <!-- 根据用户id查询一个用户信息 select:用于查询,主要配置sql语句、输入参数类型、输出结果类型 最终该 select 标签 中所配置的内容会封装到MappedStatement对象,可以将该 select称为是一个Statement id:唯 一标识 namespace下的一个sql语句,将id称为Statement的id parameterType:指定输入参数的类型(简单类型、自定义pojo) #{}:表示一个占位符号,占位符号可以防止sql注入 #{value}:value表示接收输入参数的值,如果接收的输入参数是简单类型,#{}里边可以写value或其它的名称 resultType:将sql查询结果集映射成java对象 将多个列的值映射到一个对象中,需要定义的pojo,resultType映射规则是sql查询列名和pojo的属性名必须一致方可完成映射 resultType 指定单条记录所映射的java对象 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT id,username,birthday,sex,address FROM USER WHERE id = #{id} </select> <!-- 根据用户名称模糊查询用户信息列表 resultType:不管结果集记录的数量有多少,resutType指定单条记录所映射的java对象 resultType映射规则是sql查询列名和pojo的属性名必须一致方可完成映射 ${}:表示一个sql拼接符号,相当于字符串的拼接: “SELECT * FROM USER WHERE username LIKE '%” + ${}表示的串 + “%'” ${}:如果接收输入参数是一个简单类型,${} 中只能写value ${}实现sql拼接是无法防止sql注入的。 --> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <!-- 添加用户 需要输入参数是多个值,如果传入简单类型是无法满足要求。 输入参数类型可以定义为pojo(cn.itcast.mybatis.po.User包括多个属性) #{}如何获取对象的值? #{}是通过OGNL读取对象的值,OGNL的表达式方式:属性.属性.属性。。。。直到把对象中的属性值读取过来 过止 mysql数据库通过select LAST_INSERT_ID();获取自增主键的值,在insert语句执行之后去执行LAST_INSERT_ID()获取新记录的主键 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <!-- keyProperty:将主键值设置到输入参数的哪个属性,设置到user的id属性中 order:selectkey中的sql语句在insert语句执行的前或后,这里要设置成"AFTER" resultType:select LAST_INSERT_ID()查询出的值 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}); </insert> <!-- 使用mysql的uuid生成主键 --> <!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> keyProperty:将主键值设置到输入参数的哪个属性,设置到user的id属性中 order:select uuid()在insert执行之前去执行得到uuid作为主键,将主键值设置到user的属性中 resultType:select uuid()查询出的值 <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> select uuid() </selectKey> insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address}); </insert> --> <!-- 修改用户--> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <!-- 删除用户 --> <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete> </mapper>
    UserMapper接口
    package cn.mybatis.mapper;
    
    import java.util.List;
    
    import cn.mybatis.po.User;
    
    public interface UserMapper {
        //根据用户id查询用户信息
        public User findUserById(int id);
        //根据用户名模糊查询
        public List<User> findUserByName(String username);
        
        public void insertUser(User user);
        public void updateUser(User user);
        public void deleteUser(User user);
    }

    //sqlSessionFactory以单例方式,可以在全局.   sqlSession是线程不安全的,面向程序员的接口,当放在多线程容易造成数据冲突,适合在方法体内作为局部变量.

    测试类
    public
    class UserMapperTest { private SqlSessionFactory sqlSessionFactory; // @Before注解标识 的方法在测试方法执行之前去执行 @Before public void setUp() throws Exception { // 创建sqlSessionFactory,单例方式. // mybatis全局配置文件 String resource = "SqlMapConfig.xml"; // 根据mybatis的全局配置文件构造 一个流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //生成代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //调用mapper User user = mapper.findUserById(1); System.out.println(user); sqlSession.close(); } @Test public void testFindUserByName() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //生成代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //调用mapper List<User> list = mapper.findUserByName("张"); System.out.println(list); sqlSession.close(); } @Test public void testInsertUser() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //生成代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //构造 输入参数,就是插入的用户信息 User user = new User(); user.setUsername("赵六"); user.setBirthday(new Date()); user.setAddress("北京"); //调用mapper mapper.insertUser(user); sqlSession.commit(); sqlSession.close(); }
    @Test//修改
        public void testUpdateUser(){
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = new User();
            user.setId(1);
            user.setUsername("田桑");
            user.setAddress("西安");
            mapper.updateUser(user);
            sqlSession.commit();
            sqlSession.close();
        }
        @Test//删除
        public void testdeleteUser(){
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = new User();
            user.setId(22);
            
            mapper.deleteUser(user);
            sqlSession.commit();
            sqlSession.close();
        }
    }
  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/wwwzzz/p/8269066.html
Copyright © 2011-2022 走看看