精华内容
下载资源
问答
  • mybatis注解

    2016-05-23 11:35:26
    mybatis注解
  • mybatis 注解

    2019-12-17 23:15:51
    mybatis注解: 作用:简化配置文件 1.mybatis的注解是为了简化mapper.xml的配置文件 注意: 如果涉及动态SQL依然使用mapper.xml 2.mapper.xml和注解可以共存 3.使用注解时mybatis.xml中的配置如下 3.1 3.2 ...

    mybatis 注解

    作用:简化配置文件

    1.mybatis的注解是为了简化mapper.xml的配置文件
    注意: 如果涉及动态SQL依然使用mapper.xml

    2.mapper.xml和注解可以共存

    3.使用注解时mybatis.xml中的配置如下
    3.1 < package name=" “/>
    3.2 < mapper class=” "/>

    如下 在mapper接口中使用注解实现增删改查

    查询

    @Select("select *from people")
     List<People> selAll();

    新增

    @Insert("insert into people values(default,#{name})")
    int insPeople(Peoplepeople);

    修改

    @Update("update people  set name=#{name} where id=#{id}")
    int updPeople(People people);

    删除

    @Delete("delete from people  where id=#{0}")
    int delByid(int id);
    展开全文
  • MyBatis 注解

    2017-04-28 13:50:53
    MyBatis 注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。但是比较复杂的 SQL 和 动态 SQL 还是建议采用映射文件。在这里使用 MyBatis 最基本的注解,完成常见的 CRUD(增删改查)SQL 语句映射。

    MyBatis 注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。但是比较复杂的 SQL 和 动态 SQL 还是建议采用映射文件。

    在这里使用 MyBatis 最基本的注解,完成常见的 CRUD(增删改查)SQL 语句映射。

    环境

    • JDK1.7
    • MySQL 5.5.50
    • mybatis 3.3.0

    注:MyBatis 下载地址https://github.com/mybatis/mybatis-3/releases

    需要的 jar 包

    • MyBatis jar 包: mybatis-3.3.0.jar
    • MySQL 驱动 jar 包: mysql-connector-java-xxx.jar
    • 日志记录 jar 包: log4j-xxx.jar

    项目结构

    这里写图片描述

    1.数据库准备

    程序使用的是 MySQL 数据库。

    登录 MySQL 后新建一个数据库并取名 mybatis ,创建表 user ,并插入数据:

    mysql> create table user(
        -> id int primary key auto_increment,
        -> name varchar(20),
        -> sex varchar(10),
        -> age int);
    
    insert into user(name,sex,age) values('Tom','male',20),('Jack','male',19),('Rose','female',18),('Lucy','female',19);
    

    2.常用注解

    MyBatis 的常用的注解包括:

    注解 描述
    @Insert @Update @Delete @Select 映射增改删查 SQL 语句
    @InsertProvider @UpdateProvider @DeleteProvider @SelectProvider 映射增改删查动态 SQL 语句
    @Result 在列和属性或字段之间的单独结果映射
    @Results 结果映射的列表, 包含了一个特别结果列如何被映射到属性或字段的详情
    @One 复杂类型的单独属性值映射,相当于 <association>
    @Many 映射到复杂类型的集合属性,相当于 <collection>
    @Options 提供配置选项的附加值
    @Param 当映射方法需要多个参数, 这个注解可以被应用于映射器的方法 参数来给每个参数一个名字。否则,多 (不包括任何 RowBounds 参数),如 #{param1} , #{param2} 等。 使用 @Param(“id”),参数应该被命名为 #{id}
    @ResultMap 给@Select或者@SelectProvider提供在XML映射中的的id
    @ResultType 当使用结果处理器时启用此注解

    更多关于 Annotation 注解的介绍请参考 MyBatis 中文文档

    3.新建工程项目

    (1)首先在 Eclipse 里新建一个动态 Web 工程(Dynamic Web Project),命名为 AnnotationTest
    (2)将前面提到的三个 jar 包拷贝到工程的/WebContent/WEB-INF/lib/ 目录下,如下:
    这里写图片描述

    4.实体类

    Java Resources/src 的包 gler.mybatis.annotation.model 下新建类 User.java,一个用户具有 id、name、sex、age 属性。

    User.java 的代码如下:

    package gler.mybatis.annotation.model;
    
    public class User {
        private Integer id;
        private String name;
        private String sex;
        private Integer age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer 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 Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
    }

    5.创建方法接口

    新建包 gler.mybatis.annotation.mapper ,并在包下新建方法接口 UserMapper.java。

    UserMapper 接口的代码如下:

    package gler.mybatis.annotation.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Options;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    
    import gler.mybatis.annotation.model.User;
    
    public interface UserMapper {
    
        /*
         * 新增用戶
         * @param user
         * @return
         * @throws Exception
         */
        @Insert("insert into user(name,sex,age) values(#{name},#{sex},#{age})")
        @Options(useGeneratedKeys=true,keyProperty="id")
        public int insertUser(User user) throws Exception;
    
        /*
         * 更新用戶
         * @param user
         * @throws Exception
         */
        @Update("update user set age=#{age} where id=#{id}")
        public void updateUser(User user) throws Exception;
    
        /*
         * 删除用戶
         * @param id
         * @return
         * @throws Exception
         */
        @Delete("delete from user where id=#{user_id}")
        public int deleteUser(@Param("user_id") Integer id) throws Exception;
    
        /*
         * 根据id查询用戶
         * @param id
         * @return
         * @throws Exception
         */
        @Select("select * from user where id=#{id}")
        @Results({
            @Result(id=true,property="id",column="id"),
            @Result(property="name",column="name"),
            @Result(property="sex",column="sex"),
            @Result(property="age",column="age"),
        })
        public User selectUserById(Integer id) throws Exception;
    
        /*
         * 查询所有用戶
         * @return
         * @throws Exception
         */
        @Select("select * from user")
        public List<User> selectAllUser() throws Exception;
    }

    6.配置文件 mybatis.cfg.xml

    在项目目录 Java Resources/src 下新建 MyBatis 配置文件 mybatis.cfg.xml ,用来配置 Mybatis 的运行环境、数据源、事务等。

    mybatis.cfg.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>    
        <!-- 配置mybatis运行环境 -->
        <environments default="development">
            <environment id="development">
               <!-- type="JDBC" 代表直接使用 JDBC 的提交和回滚设置 -->
                <transactionManager type="JDBC" />
    
                <!-- POOLED 表示支持JDBC数据源连接池 -->
                <!-- 数据库连接池,由 Mybatis 管理,数据库名是 mybatis,MySQL 用户名 root,密码为 root -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments> 
        <mappers>
            <!-- 通过 mapper 接口包加载整个包的映射文件 -->
            <package name="gler/mybatis/annotation/mapper" />
    </mappers>
    </configuration>

    7.日志记录 log4j.properties

    使用日志文件是为了查看控制台输出的 SQL 语句。

    在项目目录 /Java Resources/src 下新建 MyBatis 日志记录文件
    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

    8.测试类 Test

    在包 gler.mybatis.annotations.test 下新建测试类 Test.java ,代码如下:

    package gler.mybatis.annotation.test;
    
    import java.io.IOException;
    import java.io.InputStream;
    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 gler.mybatis.annotation.mapper.UserMapper;
    import gler.mybatis.annotation.model.User;
    
    public class Test {
        private static SqlSessionFactory sqlSessionFactory;
    
        public static void main(String[] args) {
            // Mybatis 配置文件
            String resource = "mybatis.cfg.xml";
    
            // 得到配置文件流
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            // 创建会话工厂,传入 MyBatis 的配置文件信息
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            insertUser();
            // updateUser();
            // deleteUser();
            // selectUserById();
            // selectAllUser();
    
        }
    
        // 新增用户
        private static void insertUser(){
            // 通过工厂得到 SqlSession
            SqlSession session = sqlSessionFactory.openSession();
    
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = new User();
            user.setName("Anne");
            user.setSex("female");
            user.setAge(23);
            try {
                mapper.insertUser(user);
    
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            }
    
            // 释放资源
            session.close();
        }
    
        // 将id为1的用户的年龄更新为25
        private static void updateUser(){
            SqlSession session = sqlSessionFactory.openSession();
    
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = null;
            try {
                user = mapper.selectUserById(1);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            user.setAge(25);
            try {
                mapper.updateUser(user);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            }
    
            session.close();
        }
    
        // 将id为5的用户删除
        private static void deleteUser(){
            SqlSession session = sqlSessionFactory.openSession();
    
            UserMapper mapper = session.getMapper(UserMapper.class);
            try {
                mapper.deleteUser(5);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            }
    
            session.close();
        }
    
        // 查询id为1的用户信息
        private static void selectUserById(){
            SqlSession session = sqlSessionFactory.openSession();
    
            UserMapper mapper = session.getMapper(UserMapper.class);
            try {
                User user = mapper.selectUserById(1);
                session.commit();
                System.out.println(user.getId() + " " + user.getName()  + " " + user.getSex() + " "
                        + user.getAge());
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            }
    
            session.close();
        }
    
        // 查询所有用户信息
        private static void selectAllUser(){
            SqlSession session = sqlSessionFactory.openSession();
    
            UserMapper mapper = session.getMapper(UserMapper.class);
            try {
                List<User> userList = mapper.selectAllUser();
                session.commit();
                for (User user : userList) {
                    System.out.println(user.getId() + " " + user.getName()  + " " + user.getSex() + " "
                            + user.getAge());
                }
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            }
    
            session.close();
        }
    }
    

    9.运行测试

    分别调用 Test 类中的增删改查方法

    结果如下:

    (1)insertUser()

    插入一条用户数据:

    1>控制台输出

    这里写图片描述

    2>查看数据库
    这里写图片描述

    (2)updateUser()

    将 id 为1的用户的 age 修改为 25:

    1>控制台输出

    这里写图片描述

    2>查看数据库

    这里写图片描述

    (3)deleteUser()

    将 id 为5的用户删除:

    1>控制台输出

    这里写图片描述

    2>查看数据库

    这里写图片描述

    (4)selectUserById()

    查询 id 为1的用户信息:

    这里写图片描述

    (5)selectAllUser()

    查询所有用户信息:

    这里写图片描述

    参考链接

    展开全文
  • Mybatis 注解

    千次阅读 2020-09-09 11:05:42
    Mybatis 如何使用注解开发

    1.1 基本使用

    1.1.1 常用注解

    注解 描述
    @Insert 实现新增
    @Update 实现更新
    @Delete 实现删除
    @Select 实现查询
    @Result 实现结果集封装
    @Results 可以与 @Result 一起使用,封装多个结果集
    @One 实现一对一结果集封装
    @Many 实现一对多结果集封装

    1.1.2 MyBatis 增删改查

    ☞ 实体类

    public class Student {
        private Long sId;
        private String sName;
        private Long sAge;
        private String sSex;
    	
    	// set and get
    
    }
    

    ☞ DAO

    /**
     * Created with IntelliJ IDEA.
     *
     * @author Demo_Null
     * @date 2020/9/9
     * @description Mybatis 注解
     */
    public interface StudentDao {
    
        @Select("select * from student")
        public List<Student> findAll();
    
        @Select("select * from where s_id = #{id} ")
        public Student findOne(Long id);
    
        @Insert("insert into student values (#{sId}, #{sName}), #{sAge}, #{sSex}")
        public int insert(Student student);
    
        @Update("update from student set s_id = #{sId}, s_name = #{sName}, s_age = #{sAge}, s_sex = #{sSex}")
        public int update(Student student);
        
        @Delete("delete from student where s_id = #{id} ")
        public int delete(Long id);
    }
    

    ☞ 配置文件

    <typeAliases>
        <package name="com.software.mybatis.entity"/>
    </typeAliases>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
    	<!-- 指定接口所在的包 -->
        <package name="com.software.mybatis.dao"/>
    	<!-- 指定接口 -->
        <mapper class="com.software.mybatis.dao.StudentDao"/>
    </mappers>
    

    ☞ 测试

    /**
     * Created with IntelliJ IDEA.
     *
     * @author Demo_Null
     * @date 2020/9/9
     * @description
     */
    public class MybatisDemo {
    
        private StudentDao studentDao;
    
        @Before
        public void before() throws IOException {
            // 加载核心配置文件
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
            // 获得 sqlSession 工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            // 获得 sqlSession 对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 获取 mapper
            studentDao = sqlSession.getMapper(StudentDao.class);
        }
    
        @Test
        public void TestA() throws IOException {
            List<Student> studentList = studentDao.findAll();
    
            System.out.println(studentList);
        }
    
    }
    

    在这里插入图片描述
      我们可以看到,明明结果已经查询出来了,为什么打印出来却是空的。这个是因为属性名和列名不一致造成的,类似于我们这种 sId ☞ s_id 可以打开驼峰之自动转换。如果二者之间没有任何联系就需要使用 @Results 一一映射。

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    @Select("select * from student")
    @Results(value = {
                    @Result(property = "sId", column = "s_id"),
                    @Result(property = "sName", column = "s_name"),
                    @Result(property = "sAge", column = "s_age"),
                    @Result(property = "sSex", column = "s_sex")
    })
    public List<Student> findAll();
    

    在这里插入图片描述





    1.2 复杂映射

    1.2.1 注解详解

    注解 说明
    @Results 代替的是标签该注解中可以使用单个@Result注解,也可以使用@Result集合
    使用格式:@Results({@Result(),@Result()})或@Results(@Result())
    @Result 代替了标签和标签
    @Result中属性介绍:
    column:数据库的列名
    property:需要装配的属性名
    one:需要使用的@One 注解(@Result(one=@One)()))
    many:需要使用的@Many 注解(@Result(many=@many)()))
    @One(一对一) 代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
    @One注解属性介绍:
    select:指定用来多表查询的sqlmapper使用格式:@Result(column="",property="".one=@One(select="))
    @Many(一对多) 代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
    使用格式:@Result(property="".column=",many=@Many(select="))

    1.2.2 一对一

    ☞ 实体类

    public class Student {
        private Long sId;
        private String sName;
        private Long sAge;
        private String sSex;
        private Class class;
    
        // set and get
    }
    
    public class Class {
        private Long cId;
        private String cName;
        private String cAddr;
    
        // set and get
    }
    

    ☞ DAO

    public interface ClassDao {
        @Select("select * from class where c_id = #{id} ")
        public Class findById(Long id);
    }
    
    public interface StudentDao {
    
        @Select("select * from student")
        @Results({
                @Result(property = "sId", column = "s_id"),
                @Result(property = "sName", column = "s_name"),
                @Result(property = "sAge", column = "s_age"),
                @Result(property = "sSex", column = "s_sex"),
                // 类似于先查询出 student 然后拿 c_id 再去查 class
                @Result(property = "class", column = "c_id", javaType = Class.class,
                		one = @One(select = "com.software.mybatis.dao.ClassDao.findById"))
        })
        public List<Student> findAll();
    }
    

    1.2.3 一对多

    ☞ 实体类

    public class Student {
        private Long sId;
        private String sName;
        private Long sAge;
        private String sSex;
        private Long cId;
    
        // set and get
    }
    
    public class Class {
        private Long cId;
        private String cName;
        private String cAddr;
        private List<Student> students;
    
        // set and get
    }
    

    ☞ DAO

    public interface StudentDao {
        @Select("select * from where c_id = #{id} ")
        public List<Student> findByCid(Long id);
    }
    
    public interface ClassDao {
        @Select("select * from class")
        @Results({
                @Result(property = "cId", column = "c_id"),
                @Result(property = "cName", column = "c_name"),
                @Result(property = "cAddr", column = "c_addr"),
                // 类似于先查询 class 然后使用 c_id 查询 student
                @Result(property = "students", column = "c_id", javaType = List.class,
                        many = @Many(select = "com.software.mybatis.dao.StudentDao.findByCid")),
        })
        public List<Class> findAll();
    }
    

    1.2.4 多对多

    ☞ 实体类

    public class Course {
        private Integer cId;
        private String cName;
        private List<Student> students;
        
        // set and get
    }
    
    public class Student {
        private Integer sId;
        private String sName;
        private Long sAge;
        private String sSex;
        private List<Course> courses;
            
        // set and get
    }
    

    ☞ DAO

    public interface CourseDao {
        @Select("select * from course c, s_c sc where c.c_id = sc.c_id and sc.s_id = #{id} ")
        public List<Course> findBySid(Long id);
    }
    
    public interface StudentDao {
        @Select("select * from student")
        @Results({
                @Result(property = "sId", column = "s_id"),
                @Result(property = "sName", column = "s_name"),
                @Result(property = "sAge", column = "s_age"),
                @Result(property = "sSex", column = "s_sex"),
                // 类似于先查询 student 然后连接查询 course 和 s_c 表条件为 c.c_id = sc.c_id and s_id = sc.s_id
                @Result(property = "Courses", column = "s_id", javaType = List.class,
                		many = @Many(select = "com.software.mybatis.dao.CoursesDao.findBySid"))
        })
        public List<Student> findAll();
    }
    



    展开全文
  • 三、MyBatis注解开发MyBatis编写SQL除了使用Mapper.xml还可以使用注解完成。当可以使用Auto Mapping时使用注解非常简单,不需要频繁的在接口和mapper.xml两个文件之间进行切换。但是必须配置resultMap时使用注解将会...

    a443bcb0cdd53359aa1e19656a1e7eb8.png

    三、MyBatis注解开发

    MyBatis编写SQL除了使用Mapper.xml还可以使用注解完成。当可以使用Auto Mapping时使用注解非常简单,不需要频繁的在接口和mapper.xml两个文件之间进行切换。但是必须配置resultMap时使用注解将会变得很麻烦,这种情况下推荐使用mapper.xml进行配置。

    MyBatis支持纯注解方式,支持纯mapper.xml方式,也支持注解和mapper.xml混合形式。当只有接口没有mapper.xml时在mybatis.cfg.xml中可以通过<mapper class=””></mapper>加载接口类。如果是混合使用时,使用<package name=””/>。此方式一直是官方推荐方式。

    如果某个功能同时使用两种方式进行配置,XML方式将覆盖注解方式。

    3.1使用注解完成对Emp的CRUD操作

    public 

    1.使用注解没有实现Java代码和SQL语句的解耦

    2.无法实现SQL语句的动态拼接

    3.进行多表的查询时定制ResultMap比较麻烦

    注解和XML的优缺点

    f69bd520da0cd4e7de57a6455bebfa26.png

    作业

    1. 使用注解完成对单表CRUD操作

    框架的使用:

    1简化我们的代码

    2框架底层复杂,难,各种设计模拟和原理 … …

    3框架底层难理解但是不耽误我们使用框架

    4导入jar包 书写配置文件 加入注解完毕

    2. #{}和${}的区别是什么?

    3. 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法能重载吗?

    4. 动态代理

    5. Mybatis动态SQL是做什么的?有哪些动态 SQL?动态SQL的执行原理

    6. 一对一、一对多、多对多的关联查询映射如何实现

    7. 一级和二级缓存分别是什么

    展开全文
  • 多表联合分页查询(Mybatis注解)/多表联合分页查询(Mybatis注解)/applicationContext.xml多表联合分页查询(Mybatis注解)/entity/多表联合分页查询(Mybatis注解)/entity/Classes.java多表联合分页查询(Mybatis注解)/...
  • Mybatis注解用法

    万次阅读 多人点赞 2019-09-10 11:21:02
    MyBatis(八) mybatis注解 一、mybatis简单注解 1、@Select、@Results、@Result 2、@Delete、@Param、@ResultMap 3、@Insert、@SelectKey 4、@Delete、@Param 5、@Update 二、动态SQL 1、简单...
  • Mybatis注解开发(超详细)

    千次阅读 多人点赞 2021-02-17 02:19:25
    Mybatis注解开发mybatis的常用注解使用 Mybatis 注解实现基本 CRUD项目目录结构编写实体类使用注解方式开发持久层接口编写 SqlMapConfig.xml 配置文件编写测试代码使用注解实现复杂关系映射开发复杂关系映射的注解...
  • mybatis注解记录

    2020-12-26 23:03:04
    目录mybatis注解有感1.了解2.利用注解开发3.分析4.mybatis执行过程 mybatis注解有感 1.了解 mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,338
精华内容 11,335
关键字:

mybatis注解