栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis学习

mybatis 1、第一个mybatis程序 1.1、搭建环境
 
        org.mybatis
        mybatis
        3.5.4
  
1.2、创建一个模块 创建配置文件(在resource文件下添加mybatis-config.xml,db.properties文件)
  1. db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&userSSL=true&userUnicode=true&characterEncoding=UTF-8
username=root
password=root
  1. mybatis-config.xml





    
    

    
        
    
    

    
        
    

    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

xml中URL需要转义

jdbc:mysql://localhost:3306/mybatis?erverTimezone=GMT%2B8&userSSL=true&
userUnicode=true&characterEncoding=UTF-8
编写mybatis工具类(由SqlSessionFactory获取SqlSession实例)
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static{
        try {
            //获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //由SqlSessionFactory获取SqlSession实例
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}
1.3、编写代码
  • 实体类

    package com.kuang.pojo;
    
    public class User {
        private int id;
        private String name;
        private String pwd;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public User() {
        }
    
        public User(int id, String name, String pwd) {
            this.id = id;
            this.name = name;
            this.pwd = pwd;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + ''' +
                    ", pwd='" + pwd + ''' +
                    '}';
        }
    }
    
  • Dao接口

    public interface UserDao {
        List getUserList();
    }
    
  • 接口实现类

    
    
    
    
        
            select * from mybatis.user
        
    
    
1.4、测试

资源过滤问题解决

                        src/main/resources                            ***.xml                                        src/main/java                            ***.xml                        true            

数据库连接失败

     select * from mybatis.user
  • 测试

        @Test    public void test(){        SqlSession sqlSession = MybatisUtils.getSqlSession();        UserDao userDao = sqlSession.getMapper(UserDao.class);        List userList = userDao.getUserList();        for (User user : userList) {            System.out.println(user);        }//        关闭sqlSession        sqlSession.close();    }
    
  • 2.3、Insert
        insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd});
    
    2.4、update
        update mybatis.user set name = #{name},pwd=#{pwd} where id=#{id};
    
    2.5、delete
        delete from mybatis.user where id =#{id};
    
    2.6、万能的Map

    假设,我们的实体类,或者数据库中的表,字段或者参数过多,应当考虑使用Map!

    int addUser2(Map map);
    
        insert into mybatis.user (id,name,pwd) value (#{userid},#{username},#{password});
    
    @Testpublic void addUser2(){    SqlSession sqlSession = MybatisUtils.getSqlSession();    UserDao mapper = sqlSession.getMapper(UserDao.class);    Map map = new HashMap<>();    map.put("userid",7);    map.put("username","xiaohua");    map.put("password","15544");    mapper.addUser2(map);    sqlSession.commit();    sqlSession.close();}
    
    2.7、模糊查询
    1. Java代码执行的时候,传递通配符% %

      List userList = mapper.getUserLike("%李%")
      
    2. 在sql拼接中使用通配符

      select * from mybatis.user where name like "%"#{value}"%"
      

    3、配置解析
    • MyBatis 的配置文件(mybatis-config.xml)包含了会深深影响 MyBatis 行为的设置和属性信息。
    - configuration(配置)  - [properties(属性)]  - [settings(设置)]  - [typeAliases(类型别名)]  - [typeHandlers(类型处理器)]  - [objectFactory(对象工厂)]  - [plugins(插件)]  - environments(环境配置)    - environment(环境变量)      - transactionManager(事务管理器)      - dataSource(数据源)  - [databaseIdProvider(数据库厂商标识)]  - [mappers(映射器)
    

    Mybatis 默认transactionManager(事务管理器):JDBC , dataSource(数据源):POOLED

    3.1 类型别名(typeAliases)

    类型别名可为 Java 类型设置一个缩写名字。

                   
    

    也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,默认会使用首字母小写的类名作为别名

        
    

    也可通过在实体类上添加注解自定义别名

    @Alias("user")
    
    3.2、映射器

    MapperRegistry:注册绑定我们的Mapper文件

    方式一【推荐使用】

        
    

    方式二:使用class文件注册绑定

        
    

    方式三:使用扫描包进行绑定

        
    

    方式2、3的注意点:

    • 接口和他的Mapper配置文件必须同名
    • 接口和他的Mapper配置文件必须在同一包下
    3.3、生命周期和作用域

    不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。

    SqlSessionFactoryBuilder:

    • 一旦创建了 SqlSessionFactory,就不再需要它了 。
    • 局部变量

    SqlSessionFactory:

    • 就是数据库连接池。
    • 一旦被创建就应该在应用的运行期间一直存在 ,没有任何理由丢弃它或重新创建另一个实例 。
    • 因此 SqlSessionFactory 的最佳作用域是应用作用域。
    • 最简单的就是使用单例模式或者静态单例模式。

    SqlSession:

    • 每个线程都应该有它自己的 SqlSession 实例。
    • 连接到连接池的请求!
    • SqlSession 的实例不是线程安全的,因此是不能被共享的 ,所以它的最佳的作用域是请求或方法作用域。
    • 用完之后赶紧关闭,否则资源被占用。

    这里面的每个Mapper,就代表一个具体的业务!

    3、属性名与字段名不一致

    User

    package com.hou.pogo;public class User {    private int id;    private String name;    private String password;}
    

    问题:

    User{id=2, name=‘wang’, password=‘null’}

    解决方法:

    • 起别名
            select id,name,pwd as password from mybatis.user where id = #{id}
    
    • resultMap 结果集映射
        
    

    test类

    @Testpublic void getByLimit(){    SqlSession sqlSession = MybatisUtils.getSqlSession();    UserMapper mapper = sqlSession.getMapper(UserMapper.class);    Map map = new HashMap();    map.put("startIndex", 1);    map.put("pageSize", 2);    List userList = mapper.getUserByLimit(map);    for(User user:userList){        System.out.println(user);    }    sqlSession.close();}
    
    2. RowBounds分页

    @Test

    @Testpublic void getUserByRow(){    SqlSession sqlSession = MybatisUtils.getSqlSession();    //RowBounds实现    RowBounds rowBounds = new RowBounds(1, 2);    //通过java代码层面    List userList = sqlSession.selectList        ("com.hou.dao.UserMapper.getUserByRowBounds",         null,rowBounds);    for (User user : userList) {        System.out.println(user);    }    sqlSession.close();}
    
    3. 分页插件
    • pageHelper
    6、Mybatis详细执行流程:
    1. Resource获取全局配置文件
    2. 实例化SqlsessionFactoryBuilder
    3. 解析配置文件流XMLCondigBuilder
    4. Configration所有的配置信息
    5. SqlSessionFactory实例化
    6. trasactional事务管理
    7. 创建executor执行器
    8. 创建SqlSession
    9. 实现CRUD
    10. 查看是否执行成功
    11. 提交事务
    12. 关闭
    7、 Lombok

    @Data:无参构造,get,set,toString,hashCode

    @AllArgsConstructor :有参构造

    @NoArgsConstructor:无参构造

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/292356.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号