Mybtais入门---IDEA创建MyBatis项目,实现简单的增删改查
前期准备 新建一个数据库表
CREATE TABLE person(
id int(11) NOT NULL auto_increment,
name VARCHAR(50) NOT NULL,
age int(6) NOT NULL,
PRIMARY KEY(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO person VALUES(1,"张三",20);
INSERT INTO person VALUES(2,"李四",22);
INSERT INTO person VALUES(3,"王五",26);
新建一个maven项目,整个项目的目录结构如下:
待我一一给你分析,没有的文件夹可以自行创建。
第一步:在pom中添加如下依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<!-- 配置以下信息,可以避免mapper.xml加载不成功-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
第二步:创建实体类
在package[bean]下新建实体类Person,用于映射表person
@Data
public class Person {
private Integer id;
private String name;
private Integer age;
public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
}
第三步:编写Mapper接口与Mapper映射文件
在com.diligentkong.mybatis.dao下编写PersonMapper接口,代码如下:
public interface PersonMapper {
public Person getPersonById(Integer id);
}
在resource下的mapper文件夹下新建PersonMapper.xml,代码如下:
<?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.diligentkong.mybatis.dao.PersonMapper">
<!-- namespace:命名空间,指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值-->
<select id="getPersonById" resultType="com.diligentkong.mybatis.bean.Person">
select id,name,age from person where id = #{id}
</select>
</mapper>
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
第四步:编写配置文件 mybatis-config
其主要作用是连接数据库,配置xml映射文件 mybatis-config.xml内容如下:
<?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>
<!--
1.mybatis可以使用properties引入外部properties配置文件的内容,
resource:引入类路径下的资源
url: 引入网络路径或者磁盘路径下的资源
-->
<properties resource="config/dbconfig.properties"></properties>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--将我们写好的sql映射文件一定要注册到全局配置文件-->
<mappers>
<mapper resource="mapper/PersonMapper.xml"></mapper>
</mappers>
</configuration>
其中dbconfig.properties 的内容如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=1234
编写测试方法
MybatisTest内容:
/**
* 1.接口式编程
* 原生 Dao ====> DaoImpl
* mybatis Mapper ====> XXMapper.xml
*
* 2.SqlSession代表和数据库的一次会话,用完必须关闭
* 3.SqlSession和connection一样都是非线程安全,每次使用都应该获取新的对象
* 4.mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象,将接口和xml进行绑定
* PersonMapper mapper = openSession.getMapper(PersonMapper.class);
* 5. 两个重要的配置文件
* mybatis的全局配置文件: 包含数据库连接池信息,事务管理器信息等, 系统运行环境信息
* sql映射文件: 保存了每一个sql语句的映射信息,将sql抽取出来
*/
public SqlSessionFactory getSqlSeeionFactory() throws IOException {
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void myTest() throws IOException {
// 1.获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getSqlSeeionFactory();
// 2、获取sqlSession对象
SqlSession openSession = sqlSessionFactory.openSession();
try {
// 3、获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
PersonMapper mapper = openSession.getMapper(PersonMapper.class);
Person person = mapper.getPersonById(1);
System.out.println(mapper.getClass());
System.out.println(person);
} finally {
openSession.close();
}
}
运行结果:
就这样,一个简单的mybatis项目就这样成功。
接着我们再继续做添加、修改、删除的操作.
在PersonMapper编写如下代码:
public Person getPersonByNameAndAge(@Param("name") String name,@Param("age") Integer age);
public int addPerson(Person person);
public boolean updatePerson(Person person);
public void deletePerById(Integer id);
在PersonMapper.xml中编写如下代码:
<!-- public Person getPersonByNameAndAge(@Param("name") String name,@Param("age") Integer age);-->
<select id="getPersonByNameAndAge" resultType="com.diligentkong.mybatis.bean.Person">
select * from person where name = #{name} and age = #{age}
</select>
<!-- public int addPerson(Person person);-->
<insert id="addPerson" parameterType="com.diligentkong.mybatis.bean.Person" useGeneratedKeys="true" keyProperty="id">
insert into person(name,age)values (#{name},#{age})
</insert>
<!-- public boolean updatePerson(Person person);-->
<update id="updatePerson">
update person set name = #{name}, age = #{age} where id = #{id}
</update>
<!-- public void deletePerById(Integer id);-->
<delete id="deletePerById">
delete from person where id = #{id}
</delete>
测试方法
@Test
public void myTestcrud() throws IOException {
// 1.获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getSqlSeeionFactory();
// 2、获取sqlSession对象
SqlSession openSession = sqlSessionFactory.openSession();
try {
// 3、获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
PersonMapper mapper = openSession.getMapper(PersonMapper.class);
//Person person = mapper.getPersonById(1);
// 通过name和age 查找
//Person person = mapper.getPersonByNameAndAge("李四",22);
// 添加person
/* Person person = new Person(null,"kong",18);
mapper.addPerson(person);
*/
// 测试修改
/*Person person = new Person(1,"kk",16);
boolean updatePerson = mapper.updatePerson(person);
System.out.println(updatePerson);*/
// 测试删除
mapper.deletePerById(2);
//System.out.println(person);
//System.out.println(mapper.getClass());
// System.out.println(person);
//手动提交数据 ,如果不加这个,在addPerson和updatePerson的时候会不成功
openSession.commit();
} finally {
openSession.close();
}
}
需要注意的是:
1、mybatis允许增删改直接定义以下类型返回值
Integer、Long、Boolean、void
2、我们需要手动提交数据
sqlSessionFactory.openSession();===》手动提交
sqlSessionFactory.openSession(true);===》自动提交