MyBatis初体验(一)
-
- 准备工作
-
- 数据库建表
- 目录结构
- POJO类
- pom文件
- 全局配置文件SQLMapConfig.xml
- 测试
-
- 映射文件UserMapper.xml
- 测试类
这里先简单搭建一个基于MySQL数据库的MyBatis框架,只要照抄,就能体验MyBatis的增删改查,话不多说,直接上干货(详细的以后慢慢讲)
准备工作
数据库建表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '张三', '2018-07-10', '男', '北京');
INSERT INTO `user` VALUES ('2', '李四', '2018-07-10', '男', '上海');
INSERT INTO `user` VALUES ('3', '王五', '2018-07-10', '男', '广州');
INSERT INTO `user` VALUES ('4', '王六', '2018-07-10', '男', '深圳');
目录结构
先创建一个空(不使用骨架)的maven项目
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL5EzM2ETOzcTM5AzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
POJO类
POJO(plain old java object):(译)普通的java对象,一般只有属性和get、set方法。
public class User {
private Integer id;
private String username;
private String birthday;
private String sex;
private String address;
//get、set方法自行添加
}
pom文件
<dependencies>
<!--mybatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--单元测试的jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
全局配置文件SQLMapConfig.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybase?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kouankeji/mapper/UserMapper.xml"/>
</mappers>
</configuration>
测试
映射文件与测试类对应着看
映射文件UserMapper.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="userMapper">
<!--查询全部-->
<select id="findAll" resultType="com.kouankeji.domain.User">
select * from user;
</select>
<!--通过id查询-->
<select id="findById" parameterType="java.lang.Integer" resultType="com.kouankeji.domain.User">
<!--也可以使用${value},但括号里只能写value;#{}可以防注入,自动转换类型,里面随便写也能对应上(所以我写abc没有写id)-->
select * from user where id = #{abc};
</select>
<!--通过用户名模糊查询-->
<select id="findByUserNameLike" parameterType="java.lang.String" resultType="com.kouankeji.domain.User">
select * from user where username like "%"#{username}"%"
</select>
<!--添加用户-->
<insert id="save" parameterType="com.kouankeji.domain.User">
-- 主键映射===>将主键自增长的列映射到要添加的数据中,否则获取不到数据
-- keyProperty: 映射的pojo中的属性
-- keyColumn: 映射数据库中的主键
-- resultType: 返回值类型
-- order: 在insert之前获取还是在insert之后获取
<selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER">
select last_insert_id();
</selectKey>
insert into user values (null,#{username},#{birthday},#{sex},#{address})
</insert>
<!--更新用户-->
<update id="update" parameterType="com.kouankeji.domain.User">
update user set username = #{username} ,address = #{address},sex = #{sex},birthday = #{birthday} where id = #{id};
</update>
<!--删除用户-->
<delete id="del" parameterType="java.lang.Integer">
delete from user where id = #{abc};
</delete>
</mapper>
测试类
private SqlSession sqlSession;
@Before
public void init() {
/**
* InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
* 通过此方法也可以获得输入流,与下面方法的区别:会抛出异常
*/
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("SqlMap
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream
sqlSession = sqlSessionFactory.openSession();
}
@Test//查询全部
public void testFindAll(){
List<User> list = sqlSession.selectList("userMapper.findAll");
for (User user : list) {
System.out.println(user);
}
}
@Test//通过id查询
public void findById() {
User user = sqlSession.selectOne("userMapper.findById", 2);
System.out.println(user);
}
@Test//通过姓名模糊查询
public void findByUserNameLike() {
List<User> list = sqlSession.selectList("userMapper.findByUserNameLike", "王");
for (User user : list) {
System.out.println(user);
}
}
@Test//新增用户
public void save() {
User user = new User();
user.setUsername("王老二");
user.setAddress("中国");
user.setBirthday("2013-08-23");
user.setSex("男");
sqlSession.insert("userMapper.save", user);
System.out.println(user);//如果不进行主键映射,打印出的user没有id
sqlSession.commit();//对表进行修改后记得提交事务,否则无效
}
@Test//修改用户
public void update() {
User user = new User();
user.setId(5);
user.setSex("女");
user.setUsername("王强");
user.setBirthday("2003-08-23");
user.setAddress("吉林");
sqlSession.update("userMapper.update", user);
System.out.println(user);
sqlSession.commit();//对表进行修改后记得提交事务,否则无效
}
@Test//删除用户
public void delete() {
int delete = sqlSession.delete("userMapper.del", 5);
sqlSession.commit();//对表进行修改后记得提交事务,否则无效
System.out.println(delete);//1\0;删除成功\失败
}
@After//释放资源
public void close() {
sqlSession.close();
}
这里简单说一下Junit的几个常用注解
- @BeforeClass : 表示在类中的任意public static void方法执行之前执行
- @AfterClass : 表示在类中的任意public static void方法执行之后执行
- @Before : 表示在任意使用@Test注解标注的public void方法执行之前执行
- @After : 表示在任意使用@Test注解标注的public void方法执行之后执行
- @Test : 使用该注解标注的public void方法会表示为一个测试方法