MyBatis
lombok
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址:https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok。
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的java类。
添加插件
plugins
pom.xml添加依赖
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
主要注解
@Data: 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Setter :注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter :使用方法同上,区别在于生成的是getter方法。
@requiredArgsConstructor: 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor: 注解在类,生成包含类中所有字段的构造方法。
@Slf4j: 注解在类,生成log变量,严格意义来说是常量。
@Cleanup:作用于变量,保证该变量代表的资源会被自动关闭,默认调用资源的close()方法,如果该资源有其它关闭方法,可使用 @C leanup(“methodName”)来指定。
下面两个通常一起用,以防覆盖无参构造
@EqualsAndHashCode: 注解在类,生成hashCode和equals方法。
@NoArgsConstructor: 注解在类,生成无参的构造方法。
@EqualsAndHashCode
- 此注解会生成equals(Object other) 和 hashCode()方法。
- 它默认使用非静态,非瞬态的属性
- 可通过参数exclude排除一些属性
- 可通过参数of指定仅使用哪些属性
- 它默认仅使用该类中定义的属性且不调用父类的方法
@Accessors: 里面有参数可以设置,例如“@Accessors(chain = true)”表示该类的set方法可以链式接下去
country.setName().setLocial();
//代码实现的原理是在一个set方法结束之后返回一个this对象
实现原理
MyBatis简介
属于ORM框架,负责项目中的持久层(DAO),负责项目中的CRUD,以及事务处理,负责数据库的增删改查,是ssm里面的M
创建项目
1. MyBatis的传入参数parameterType类型分两种
-
基本数据类型:int,string,long,Date
-
复杂数据类型:类和Map
多个参数传递,只管传回自动识别
<select id="getPage" resultType="MyBatis_千.com.Country">
select * from country limit #{arg0} , #{arg1}
</select>
<?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>
</configuration>
mapper文件头
映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的sql语句
<?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就是相当于DAO的实现类-->
<mapper namespace="MyBatis_千.DAO.CountryDao">
<select id="getCountryCount" resultType="int">
select count(1) from country;
</select>
<!--返回值可以不写
但是
参数类型必须写-->
<insert id="addCountry" parameterType="MyBatis_千.com.Country">
insert into country(cid,cname)
values(#{cId},#{cName});
-- //实体类名要和数据库名一样才可以映射
</insert>
<update id="updateCounter" parameterType="MyBatis_千.com.Country">
update country set cname = #{cName} where cid = #{cId}
-- //注意变量名cname是要与数据库里面一样,#{cName}是与实体类一样,注意大小写,数据库不分大小写但是实体类分
</update>
<delete id="deleteCountryById" parameterType="int">
delete from country where cid = #{id}
</delete>
</mapper>
测试代码
在测试里面除了select不需要commit提交事件,其余的都要提交事件
package Test_MyBatis_千.com;
import MyBatis_千.DAO.CountryDao;
import MyBatis_千.com.Country;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* @author BXO
* @version 1.0
* @description: Todo
* @date 2022/3/16 20:58
*/
public class TestCountry {
@Test
public void TestCountry()
{
Country country = new Country();
System.out.println(country);
}
@Test
public void Countrytest() {
try {
//读取配置文件 导的是ibatis的包
InputStream is = Resources.getResourceAsstream("mybatis_config.xml");
//获取实现类
sqlSessionFactoryBuilder builder = new sqlSessionFactoryBuilder();
//通过sqlSessionFactoryBuilder构建工厂
sqlSessionFactory factory = builder.build(is);
//通过工厂获取会话对象
sqlSession sqlSession = factory.openSession();
//通过sqlSession获取实现类
//两种方法获得
CountryDao countryDao = sqlSession.getMapper(CountryDao.class);
System.out.println(countryDao.getCountryCount());
int i = sqlSession.selectOne("getCountryCount");
System.out.println(i);
session.close();
}catch (IOException e)
{
e.printstacktrace();
}
}
}