maven工程,mybatis,spring

maven

        简介:Maven主要用于解决导入依赖于Java类的jar和编译Java项目的主要问题,其使用pom文件将自动管理下载的jar包

创建maven工程

1.

        maven工程,mybatis,spring_第1张图片

groupid:包名
artifactid:工程名
location:存放位置

2.结构

 maven工程,mybatis,spring_第2张图片

工程目录结构:
    src
        main主程序区
            java后端代码
                com包
                    类
            resources类路径---配置文件
                db.properties
        test测试程序区
    pom.xml ====project工程 object对象 model模型
        依赖的管理,例:***.jar文件
        插件管理

3. 在idea中关联maven

解压maven压缩文件;
在idea中settings-->build execution deployment-->build tools-->maven
    设置三项:
        maven的安装根目录;
        配置文件:maven的安装根目录/conf/settings.xml
        关联本地仓库的目录:

 maven工程,mybatis,spring_第3张图片

 maven工程,mybatis,spring_第4张图片

 在安装的地方创建repository,存放maven工程下载的依赖

4.修改配置

配置文件:maven的安装根目录/conf/settings.xml

    本地文件夹:C:\tools\maven\repository
    设置国内镜像地址:从国内仓库下载资源
        
          alimaven
          aliyun maven
          https://maven.aliyun.com/repository/public
          central
        
    编译环境:设置为jdk8
             
            jdk88   
                    
                  true    
                  1.8      
               
               
                  1.8 
                  1.8 
                  1.8   
             
         
     设置有效的编译环境:
         
            jdk88  ---设置profile的id
          

         junit单元测试

        添加依赖:pom.xml


    junit
    junit
    4.13.2
    test

添加注解:

公共类/公共方法/无参/无返回值

public class 类{
    @Test
    public void teest(){

    }
}

maven工程,mybatis,spring_第5张图片

使用时在其左边点启动就行

简化实体类的lombok

idea插件

在idea中安装插件:settings-->plugin

        搜索 lombok
                install
                重启idea

pom.xml引入依赖:


    org.projectlombok
    lombok
    1.18.22

使用:生成实体类中的相关方法/构造 

getter/setter
toString
equals
无参/有参构造

@Data //生成get/set equals 、 hashCode 、toString 方法。
@AllArgsConstructor //全参构造
@NoArgsConstructor //无参构造
@RequiredArgsConstructor //个别参数构造,与@NonNull注解对应
public class User {
     @NonNull
    private String name; //属性
}

这样使用时,需要添加属性,直接写就行,省区了更改get,set,构造函数...更改

常用依赖:

 
            mysql
            mysql-connector-java
            5.1.48
        

//mysql引入

            junit
            junit
            4.13.2
            test
          //测试

    org.projectlombok
    lombok
    1.18.22


//简化实体类的

        
            org.mybatis
            mybatis
            3.4.6
        

//mybatis
 
            com.github.pagehelper
            pagehelper
            5.1.2
        

//分页插件


            javax.servlet
            javax.servlet-api
            3.1.0
        

//java service
war
打war包的

mybatis

框架:半成品

实现了与数据库的交互

免除了jdbc的代码,但是可以实现CRUD,并且可以实现映射(数据--类),使用XML配置和注解两种方式实现;

使用步骤

配置

                在pom.xml里导入mysql依赖

   
            mysql
            mysql-connector-java
            5.1.48
        

             核心文件在resources下创建mybatis.xml,使用其管理映射元文件




    
        
            
            
                
                      //数据库账号
                    //数据库密码
            
        
    
    
            //从resources路径下读取到的映射元文件的路径
    

        配置映射元文件 **Mapper.xml,例如UserMapper.xml

                resources/mapper目录/ **Mapper.xml

maven工程,mybatis,spring_第6张图片



     //接口所在地
           //sql语句书写
        DELETE FROM users WHERE u_id=6;
    

 mybatis核心文件的配置信息

1.加入properties文件:

作用类似于:原来的工具类properties所填写的配置文件

maven工程,mybatis,spring_第7张图片  

在mybatis.xml中配置


    
注:在数据源的值里直接使用${properties中的键值名}



        
            
            
                
                
                
                
            
        
    
首先读取在 properties 元素体内指定的属性。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

settings设置

第一种:给类定义别名,别名自行定义
      
第二种:引入包名,此时别名默认为类的首字母小写方式
    ,例:com.entity.User-->user
第三种:java内建类型的别名,查表;
    例:java.util.Map;-->map

 设定日志:

 
        
        
    

SQL使用

  Java程序中步骤 

1. 将类路径下的xml文件以输入流形式读入到程序中:

Inputstream is=Resources.getResourceAsStream("mybatis.xml");

   2. 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();

3.创建SqlSessionFactory对象:创建mybatis实例的核心

SqlSessionFactory factory=builder.build();
使用接口与接口结合

代替了原本的dao层

maven工程,mybatis,spring_第8张图片

 4.执行

SqlSession:会话对象:

Sqlsession sqlSession=factory.openSession();


.openSession(true)为自动提交

获得接口对象:通过mybatis实例获得

 Users mapper = sqlSession.getMapper(Users.class);

执行接口中的方法:

int delete = mapper.delete();//删除一条数据

提交:  

sqlSession.commit();

关闭:

 sqlSession.close();

 sql参数的传递

语法:

#{参数名}


    insert into tb_user values(null,#{参数名},#{参数名},#{参数名})

序号传参

arg0,arg1,arg2....
param1,param2,param3.....

接口:
    public interface UserMapper{
        int insert(String name,String pass,String tel,String mail);
    }
映射元文件:xml文件
    
        insert into tb_user values(null,#{arg0},#{arg1},#{arg2},#{arg3})
    


     
        insert into tb_user values(null,#{param1},#{param2},#{param3},#{param4})
    

注:不能混用两种序号;必须从起始序号开始顺序递增;必须与接口中的参数一一对应;

实体传参

用实体类的属性名作为参数名;

实体类:
    public class User{
        //属性,例:name--u_name
        private String name;
        private String tel;
        private String mail;
        private String pass;
    }

接口:
    public interface UserMapper{
        int insert(User user);
    }

映射元文件:xml文件
    
        insert into tb_user values(null,#{name},#{pass},#{tel},#{mail})
    

 传一个参数:

        当参数只有一个值时,可任何命名参数名

接口:int deleteById(int id);
    User selectOne(String name);

sql: delete from tb_user where u_id=#{uid}
    select * from tb_user where u_name like concat('%',#{username},'%')

注解传参:

@Param---mybatis提供的

// name表示方法的形参名
// uname表示传给mybatis的sql里的参数名
接口:User selectOne(@Param("uname")String name,@Param("upass")String pass);

sql: select * from tb_user where u_name=#{uname} and u_pass=#{upass}

 map传参

将#{key},传入

   @Test
    public void test10() throws IOException {//排序
        Users mapper = sqlSession.getMapper(Users.class);
        HashMap map = new HashMap<>();

        map.put("name","巴尔");
        map.put("password","123");

        User user = mapper.selectpassword(map);
        System.out.println(user);
    }



    @Before
    public void before()throws Exception{
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
        sqlSession=factory.openSession(true);//自动提交
    }
    //在执行单元测试之后执行的方法
    @After
    public void after(){
        sqlSession.close();
    }
User selectpassword(Map map);
  

xml文件中

在resources下创建一个一个使用sql的xml文件

*Mapper。xml文件配置




  
  
  
  


注:名空间namespace----与对应接口全类名称一致;
    id----与接口中方法名相同

查询的结果如何封装?

查询结果的字段名必须与实体类的属性名相同:
    select u_id ,u_name ,u_pass from tb_user;

    public class User{
        private Integer uid;
        private String uname;
        private String upass;
    }

    可通过字段别名的方式将结果集的字段名与实体类的属性名定义一致;
        select u_id uid ,u_name uname,u_pass upass from tb_user;
resultType 代表返回类型
parameterType 传入类型 ,一般实体传参会用                   

                 基本数据类型:int,string,long,Date;

                 复杂数据类型:类和Map

                #{参数} 获取参数中的值

                #{属性名}  ,map中则是#{key}

 
        u_id uid,u_name uname,u_pass upass,u_tel tel,u_mail mail
         //将上面的部分包裹
    
             

    

    
    

mybatis实现增删改查

增,主键回填

        主键回填一般用于增加操作中,把插入数据时插入为null的主键id数据填回去,存入到java对象和主键对应的属性中(数据库主键字段为id则回填的是实体类的id属性),实现添加+查询主键一步到位。

   

自增主键中

        select LAST_INSERT_ID()  :mysql 中的函数,获取最后插入的自增id值

 
            select LAST_INSERT_ID()
        

2. < selectKey > sql语句 < /selectKey >:选择主键的标签,嵌套在插入语句中属性:

        order:sql语句在插入中的执行顺序,order="AFTER",表示先执行插入再执行查询

        resultType:sql语句执行的结果,在此处也是主键的结果

        keyProperty:sql语句执行后回填到哪个属性,在此处为用户id,因为插入时它是null

例:

实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users {
    private int u_id;
    private String u_name;
    private String u_password;
    private String u_age;
}

dao包

Integer insertUser(Users users);

UsersMapper.xml


            
                    select last_insert_id()
            
            insert into users values (null,#{u_name},#{u_password},#{u_age})
    

测试类

    @Test
    public void test() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = build.openSession();
        Userdaolmpl mapper = sqlSession.getMapper(Userdaolmpl.class);
        Users users = new Users(-1,"巴尔","123","女");
        Integer integer = mapper.insertUser(users);
        System.out.println(integer);

        sqlSession.commit();
        sqlSession.rollback();
        sqlSession.close();
    }

maven工程,mybatis,spring_第9张图片

 可以看到先进行了插入操作,再进行了查询操作,

       2. 非自增主键

测试类:

 InputStream is = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = build.openSession();
        Ordgslmpl mapper = sqlSession.getMapper(Ordgslmpl.class);
        Ordgs ordgs = new Ordgs("-1",2,3);
        Integer ordgs1 = mapper.insertOrdgs(ordgs);
        System.out.println(ordgs1);

        sqlSession.commit();
        sqlSession.rollback();
        sqlSession.close();

        接口类

public interface Ordgslmpl {
    Integer insertOrdgs(Ordgs ordgs);//添加订单
}

  xml中



        
                
                    select REPLACE(uuid(),'-','')
                
                                  --     添加订单表
                insert into ordgs values (#{o_id},#{o_u_name},#{o_goods})
        
    

        上面的order=“before”表示mybatis将取得序列的下一个值作为主键值,并且在执行insert sql语句之前将值设置到studId属性上。

resultMap

标签建立SQL查询结果字段与实体属性的映射关系信息

可加extends,简化步骤



 







         //表示主键字段
  


         //表示非主键字段

  




     
    

对多   用 

 用户实体类:User  
        private Integer uid;
        private String uname;
        ...用户基本信息

        private List ordereList;//用于表示一对多的关系;表示一个用户有多个订单信息;
  订单实体类:Orders
        private String oid;
        private String oname;
        .....订单基本信息;

resultMap标签:
        
            
            
            ....
            
                ...订单c表和订单实体类之间的映射关系
            
        
用户的映射元文件:UserMapper.xml-->以用户表为主,返回实体是User类
        //多表联合查询:左外/右外/内连接/等值连接。。。
        

对一     

用户实体类:User
        private Integer uid;
        private String uname;
        ...用户基本信息
用户实体类:User
        private Integer uid;
        private String uname;
        ...用户基本信息

resultMap标签:
        
            
            
            ....
            
                ..用户基本信息的映射
            
        
resultMap标签:
        
            
            
            ....
            
                ..用户基本信息的映射
            
        

动态sql

@注解使用sql

mybatis的分页插件

mybatis缓存

       缓存:

                从数据库中加载的数据缓存到内存中,是不少应用程序为了提升性能而采起的一向

                作法。MyBatis对经过映射的SELECT语句加载的查询结果提供了内建的缓存支持。

                默认状况下,启用一级缓存

                        优点:为下次的同构查询(相同查询)提供查询结果,降低与数据库的交互

                        缺点:可能因为缓存查询不到自己需要的结果

一级缓存:SqlSession

                两次同构查询之间,进行一次提交操作(增删改),也会清空缓存;重新创建SqlSession对象,也会清空缓存;

 SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
        SqlSession sqlSession=factory.openSession();

        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user1=userMapper.selectOne(1);//test1

        User user1=userMapper.selectOne(1);

两次查询,查看日志只有一次连接数据库,
          sqlSession.commit();//清空缓存后会重新连接

二级缓存:SqlSessionFactory 

是全局缓存,能够被全部SqlSession共享


      默认开启为true

在 xxxmapper.xml文件中 配置 标签

  开启缓存

                开启二级缓存 

例:

   

Spring     

存在的部分问题:

        1.传统web开发,存在硬解码过度耦合,功能较单一,例:在Service层中有一个属性为dao对象

        解决:使用工厂模式可以减少硬编码,不用new,spring只需要声明一个接口就行,其它的交给spring

        2.javaee 的API较为复杂,使用效率低下,比如jdbc

        3.移植性较差,

 Spring简介

Spring是个项目管理框架,也是一套JAVAEE解决方案

Spring是众多优秀设计模式的组合(单例,工厂,代理....)

Spring没有替代已有的框架,而是把众多框架进行整合,简化开发,所以它也被称为胶水框架

使用准备工作

1.在maven项目中,pom.xml中导入核心依赖:记得要版本适配


        org.springframework
        spring-context
        5.1.6.RELEASE
    

 例:

maven工程,mybatis,spring_第10张图片

2.还是存到resources文件夹下

创建配置文件:spring.xml


    
    





    

maven工程,mybatis,spring_第11张图片

Spring创建工厂

完成准备阶段后在spring.xml文件夹下配置管理对象


     

ApplicationContext接口---加载spring.xml文件
    将需要由spring管理的对明定义在spring工厂中;
        

获得spring中的对象:
    getBean("id名称");//获得Object
    getBean(类对象);//获得的是真实类型;但是要求工厂中不能有相同类型的对象
    getBean("id名称",类对象); //获得的是真实类型

例: 


   
 ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");

Users getlogin = ac.getBean("getlogin", Userslmpl.class);
        //Userslmpl getlogin2 = ac.getBean("getlogin", Userslmpl.class);

 可以声名类接收,也可以声名其接口接收

maven工程,mybatis,spring_第12张图片

 maven工程,mybatis,spring_第13张图片

 可以调用其方法了

反转控制IOC

        初始化工厂后,spring工厂将管理的对象创建好,用时取出

依赖注入DI

使用Spring管理mybatis

1.导入依赖


            org.mybatis
            mybatis-spring
            1.3.2
        

 双击Shift查询,成功找到SqlSessionFactoryBean对象

maven工程,mybatis,spring_第14张图片

2.Spring文件设置

导入数据源druid依赖
 
            com.alibaba
            druid
            1.2.8
        

 druid设置


    
        
        
        
        
    
spring管理整合mybatis对象

    


        


        


        
    

扫描mapper接口的包


         

           
    

修改业务层:增加set方法

    UserMapper userMapper;

    public void setMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    {
//        try {
//            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
//            SqlSession sqlSession = factory.openSession(true);
//            userMapper = sqlSession.getMapper(Users.class);
//        }catch(Exception e){
//            e.printStackTrace();
//        }
    }
    
         
    

你可能感兴趣的:(初顾茅庐,maven,java,数据库)