orm框架本质是简化操作数据库的编码,一个是不用写sql的hibernate,一个是灵活调试的mybatis,各自都有优缺点。
hibernate优点就是用java替代sql语句,发展到现在是用spring data jpa这个,根据方法名就可以生成对应sql,这个下次看情况可以学一学;
mybatisc一开始初期会比较麻烦,各种配置,还有xml文件,从generator根据表结果自动生成实体类、配置文件和dao(也就是mapper,那个接口文件啦)到后来使用注解,自动管理dao层和配置文件以及只用注解不用配置的形式。
这里我根据看过的博客总结一下这两种方法。一个无注解版和一个最简xml配置版。
主要用到的一个依赖就是这个
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
首先我们搭一个spring-boot框架(参考我的另一篇)
在这里我们不仅要mybatis,还要连数据库,数据库要添加表,添加的依赖还有
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
首先开始说一下无注解版
建需要的文件,controller,entity,mapper,service,enums(是因为表里男女枚举)
1.application.properties
配置mybatis以及数据库
server.port=8087
server.tomcat.uri-encoding=utf-8
mybatis.type-aliases-package=com.example.demo.entity
#springboot会自动加载spring.datasource.*相关配置,
#数据源就会自动注入到sqlSessionFactory中,sqlSessionFactory会自动注入到Mapper中,对了你一切都不用管了,直接拿起来使用就行了
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 1234
如果是yml的话数据库这样配的
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mytest
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
2.不要忘记在启动类扫描mapper包,所以还是先写好以便忘了
3.最重要的mapper
//最关键的一块,sql生产都在这里 这里的方法名都是自己定义的
public interface UserMapper {
@Select("SELECT * FROM users")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
List<UserEntity> getAll();
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
UserEntity getOne(int id);
//使用@Param传参
UserEntity findByName(@Param("nickName") String nickName);//id可以直接写
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})")
void insert(UserEntity user);
// 使用对象传参 只需要语句中的#{name}、#{age}就分别对应了User对象中的name和age属性
@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}")
void update(UserEntity user);
@Delete("DELETE FROM users WHERE id =#{id}")
void delete(int id);
}
其中涉及到mybatis的传参方式,使用@Param传参,使用对象传参,还有使用map传参
还有使用Map
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(" +
"#{name, jdbcType=VARCHAR}, #{password, jdbcType=VARCHAR}, #{phone, jdbcType=VARCHAR})")
int insertByMap(Map<String, Object> map);
如果用map传参,使用这个的方式
Map<String, Object> map = new HashMap<>();
map.put("name","王五");
map.put("password","23423");
map.put("phone", "13400000000");
userMapper.insertByMap(map);
4.controller的增删改查
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/getUsers")
public List<UserEntity> getUsers(){
List<UserEntity> users = userMapper.getAll();
return users;
}
@RequestMapping("/getUser")
public UserEntity getUser(int id){
UserEntity user = userMapper.getOne(id);
// userMapper.findByName()
return user;
}
@RequestMapping("/add")
public void add(UserEntity user){
userMapper.insert(user);
}
@RequestMapping("/update")
public void update(UserEntity user){
userMapper.update(user);
}
@RequestMapping(value = "/delete/{id}")
public void delete(@PathVariable("id") int id){
userMapper.delete(id);
}
}
注意上面传参的方式哈。
5.我们test一下
@RunWith(SpringRunner.class)
@SpringBootTest
//回滚,即测试不会对数据库造成影响
//@Transactional
public class UserMapperTest {
@Autowired
private UserMapper UserMapper ;//会报错无碍
@Test
public void testInsert() throws Exception {
UserMapper.insert(new UserEntity("aa", "a123456", UserSexEnum.MAN));
UserMapper.insert(new UserEntity("bb", "b123456", UserSexEnum.WOMAN));
UserMapper.insert(new UserEntity("cc", "b123456", UserSexEnum.WOMAN));
Assert.assertEquals(3, UserMapper.getAll().size());
}
@Test
public void testQuery() throws Exception{
List<UserEntity> users = UserMapper.getAll();
System.out.println(users.toString());
}
@Test
public void testUpdate() throws Exception{
UserEntity user = UserMapper.getOne(1);
System.out.println(user.toString());
user.setNickName("Cassie");
UserMapper.update(user);
Assert.assertTrue("Cassie".equals(UserMapper.getOne(1).getNickName()));
}
}
无注解版这样就ok了,感觉很方便,主要都在那个mapper的java文件里了。
具体可以看我的源码