概述
本文介绍spring集成mybatis
在真实的项目中,并不完全是这种搭建,这里只是为了做演示
工程目录
创建maven工程
略
修改pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
mybatis全局配置文件
在 resources 文件夹下创建 mybatis-config.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置环境 。default名字随意起-->
<environments default="mysql">
<!-- id名字必须同上面default名 -->
<environment id="mysql">
<!-- 配置事务管理器类型,JDBC 是 JdbcTransactionFactory.class 的别名 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源。POOLED 是 PooledDataSourceFactory.class 的别名 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3308/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="top.malaoshi.mapper"/>
</mappers>
</configuration>
创建实体类
public class User {
private String id;
private String username;
private String password;
private Integer age;
private String sex;
private String status;
private Date createTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
实现mapper类
public interface IUserMapper {
@Insert("insert into user (id,username,password,age,sex,status,create_time) values (#{id},#{username},#{password},#{age},#{sex},#{status},#{createTime})")
public int save(User user);
@Select("select id,username,password,age,sex,status from user where username like #{username}")
public List<User> queryByName(String username);
}
实现service接口
public interface IUserService {
public int save(User user) throws Exception;
public List<User> queryByName(String username) throws Exception;
}
实现service实现类
@Service
public class UserSrvImpl implements IUserService{
@Autowired
private IUserMapper mapper;
public int save(User user) throws Exception {
return mapper.save(user);
}
public List<User> queryByName(String username) throws Exception {
return mapper.queryByName(username);
}
}
说明: 执行时,在 spring容器中,只有一个 IUserMapper 类对象,直接取出并注入
配置类
@Configuration
@ComponentScan("top.malaoshi")
public class ApplicationConfig {
@Bean
public SqlSessionFactory getSessionFactory() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
return new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 在spring容器中,只有一个SqlSession对象,所以直接取出注入到形参中
* @param sqlSessionFactory
* @return
*/
@Bean("session")
public SqlSession getSession(SqlSessionFactory sqlSessionFactory) throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 在spring容器中,只有一个SqlSession对象,所以直接取出注入到形参中
* @param sqlSession
* @return
*/
@Bean
public IUserMapper getUserMapper(SqlSession sqlSession){
IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
return mapper;
}
}
测试查询
public class Main {
public static void main(String[] args) throws Exception{
ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserService srv=(IUserService)ac.getBean("userSrvImpl");
List<User> list=srv.queryByName("李%");
for(User user:list){
System.out.println(user.getUsername());
}
}
}
测试保存
public class Main {
public static void main(String[] args) throws Exception{
ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserService srv=(IUserService)ac.getBean("userSrvImpl");
User user=new User();
user.setId(UUID.randomUUID().toString().replace("-",""));
user.setUsername("李现");
user.setPassword("123456");
srv.save(user);
}
}
保存失败
没有提交到数据库中
修改service实现类
@Service
public class UserSrvImpl implements IUserService{
@Autowired
private IUserMapper mapper;
//定义session
@Autowired
private SqlSession session;
public int save(User user) throws Exception {
int i=0;
try {
i = mapper.save(user);
session.commit();
}catch (Exception e){
session.rollback();
throw e;
}finally {
session.close();
}
return i;
}
public List<User> queryByName(String username) throws Exception {
List<User> list=null;
try{
list=mapper.queryByName(username);
}catch (Exception e){
throw e;
}finally {
session.close();
}
return list;
}
}
缺点
在增删改方法中,执行成功后,需要 手动 提交事务;执行报错时,需要 手动 回滚事务;执行后,最终要关闭session
如果每次都手写,代码量大,繁琐
如果忘写,会造成很大问题
