Mybatis -study

Mybatis

1.搭建Mybatis程序

1.1搭建环境

构建数据库环境

1.2.创建一个模块

  • 编写一个mybatis的核心配置文件

    <?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>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>
    
  • 编写mybatis工具类

    package com.xz.utils;
    
    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 java.io.IOException;
    import java.io.InputStream;
    
    //SqlSessionFactory
    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
        static {
            InputStream inputStream = null;
    
            try {
                //获取SqlSessionFactory对象
                String resource = "mybatis-config.xml";
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    }
    
    

1.3编写代码

  • 接口类
package com.xz.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = 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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}
  • Dao接口
package com.xz.dao;

import com.xz.pojo.User;

import java.util.List;

public interface UserDao {
    List<User> getUserList();
}
  • 接口实现类由原来的UserDaoImpl转变为Mapper配置文件
<?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 namespace="com.xz.dao.UserDao">
    
    <select id="getUserList" resultType="com.xz.pojo.User">
        select * from mybatis.user
    </select>
    
</mapper>

2.配置解析

1.核心配置文件

configuration(配置)

2.环境配置(Environment)

MyBatis:可以配置成适应多种环境

但是,可以配置多个环境,SqlSessionFactory实例只能选择一种环境

Mybatis默认的事务管理器是JDBC , 连接池: POOLED

3.属性(Properties)

我们可以通过Properties属性来实现引用配置文件

这些属性都是可以外部配置且可动态替换的,既可以在典型的Java文件属性文件中配置,亦可通过Properties元素的子元素来传递【db.Properties】

在db.properties和内置标签中,外部文件优先级较高

3.*Mapper.xml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yoZfid36-1665909695473)(mybatis.assets/image-20220822231259248.png)]

4.多对一

CREATE TABLE student(
id INT(10) NOT NULL PRIMARY KEY,
NAME VARCHAR(30) DEFAULT NULL,
tid INT(10) DEFAULT NULL,
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY(`tid`) REFERENCES `teacher` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

外键关联语句

 KEY `fktid` (`tid`),
 CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)

5一对多

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXa0Qbo2-1665909695474)(mybatis.assets/image-20220824101424048.png)]

6、Bean的自动装配

6.1ByName自动装配

通过set后面的name查询,寻找对应的beanid

6.2ByType自动装配

通过类型进行自动装配,但是具有全局唯一性

6.3使用注解自动装配

  1. 导入约束
  2. 配置注解的支持context:annotation-config/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

@Autowired

直接在属性上使用即可!也可以在set上使用

使用@Autowired我们可以不用编写set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byname!

小结:

@Resource和@Autowired的区别:

  • 都是用来自动装配的,都可以放在属性字段上
  • .Autowired通过byname的方式实现,而且必须要求这个对象存在!
  • @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错![常用]
  • 执行顺序不同:@AutoWired 通过byType的方式实现,@Resource默认通过byname的方式实现,

7、使用注解开发

1、从属性注入

@component
public class user i

public string name;

	//相当于<property name="name" value="kuangshen" />
@value("XZ")
public void setName(string name) {

    this.name = name;
	}
}

2.衍生的注解

@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!

  • dao 【@Repository]

  • service 【@service】

  • controller 【@controller】

    这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean

3.自动装配

  • @Autowired :自动装配通过类型。名字
    如果Autowired不能唯一自动装配上属性,则需要通过@Qualifier(value=“xxx”)
  • @Nullable字段标记了这个注解,说明这个字段可以为null;
  • @Resource:自动装配通过名字。类型。

8.配置类开发

package com.xz.config;
import com.xz.pojo.user;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.componentscan;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation . Import;

//这个也会Spring容器托管,注册到容器中,因为他本来就是一个@component

//Rconfiguration代表这是一个配置类,就和我们之前看的beans.xml
@configuration
@componentscan("com.xz.pojo")
@Import(xzconfig2.class)
public class xzfig {

 //注册一个bean ,就相当于我们之前写的一个bean标签/这个方法的名字,就相当于bean标签中的id属性

//这个方法的返回值,就相当于bean标签中的c1ass属性
@Bean 
public user user({

    return new user(;//就是返回要注入到bean的对象!
                    
	}
}

事务

<! --配置声明式事务-->
<bean id= "transactionManager" class="org .springframework. jdbc.datasource.DataSourceTransactionManager">
<property name="datasource" ref="dataSource" / >
</bean>
<!--结合AOP实现事务的织入-->< ! --配置事务通知; -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给那些方法配置事务-->
<!--配置事务的传播特性: newpropagation= -->
    <tx:attributes>
		<tx :method name="add" propagation="REQUIRED"/>
    	<tx :method name="delete" propagation="REQUIRED"/>
    	<tx :method name="update" propagation="REQUIRED" />
    	<tx :method name="query" read-only="true" / >
		<tx :method name="*" propagation="REQUIRED"/>
        </ tx:attributes>
</tx:advice>
<!--配置事务切入--><aop:config>
	<aop:pointcut id="txPointCut" expression="execution(* com.kuang.mapper.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
< / aop:config>

万能Map

int addUser2(Map<String,Object> map);
<insert id="addUser2" parameterType="map">
    insert into mybatis.user (id,pwd) values (#{userid},#{password});
</insert>
    @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Map<String, Object> map = new HashMap<>();

        map.put("userid",5);
//      map.put("username","AA");
        map.put("password","123456");

        mapper.addUser2(map);
        System.out.println(map);

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

Maven静态资源过滤问题

在pom.xml加入

  <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值