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&useUnicode=true&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(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
2.环境配置(Environment)
MyBatis:可以配置成适应多种环境
但是,可以配置多个环境,SqlSessionFactory实例只能选择一种环境
Mybatis默认的事务管理器是JDBC , 连接池: POOLED
3.属性(Properties)
我们可以通过Properties属性来实现引用配置文件
这些属性都是可以外部配置且可动态替换的,既可以在典型的Java文件属性文件中配置,亦可通过Properties元素的子元素来传递【db.Properties】
在db.properties和内置标签中,外部文件优先级较高
3.*Mapper.xml
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一对多
6、Bean的自动装配
6.1ByName自动装配
通过set后面的name查询,寻找对应的beanid
6.2ByType自动装配
通过类型进行自动装配,但是具有全局唯一性
6.3使用注解自动装配
- 导入约束
- 配置注解的支持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>