Mybatis使用注解进行增删改查
我们可以在工具类创建的时候实现自动提交事务!
utils包
/**
* sqlSessionFactory(构建sqlSession的)
* 定义一个工具类 把资源加载进来 创建一个能执行sql的对象 整个对象可以想象成一个Connection对象
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;//提升作用域
//使用Mybatis第一步:获取sqlSessionFactory对象
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//通过build把这个流加载进来
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
//我们可以在工具类创建的时候实现自动提交事务! 不用再手动提交了
SqlSession sqlSession = sqlSessionFactory.openSession(true);//会返回一个SqlSession(里面有操作数据库的方法 相当于之前的statement对象)
return sqlSession;
//优化代码
//sqlSessionFactory这个东西一直为空
}
}
可以看到获取连接的方法getSqlSession openSession参数为true!
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
分析源码发现有很多方法的重载,其中一个重载方法的参数为boolean autoCommit
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(boolean autoCommit);
SqlSession openSession(Connection connection);
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType, Connection connection);
Configuration getConfiguration();
}
1.编写接口 添加注解
这里已经不需要再写Mapper.xml文件了
Mapper接口:
package com.hang.dao;
import com.hang.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
/**
* 操作数据库的
* Dao==Mapper
*/
public interface UserMapper {
/**
* 注解开发
* @return
*/
@Select("select * from user")
List<User> getUsers();
/**
*根据id查询用户
* 基本类型都可以加上@param注解 规范引用类型不用 方法存在多个参数的时候所有参数前面必须加上@Param注解 @Param("id")对应#{id}
* @param id
* @return
*/
@Select("select * from user where id = #{id} ")
User getUserById(@Param("id") int id);//是从@Param中取的 把int id 改成 int id2也可以 但是把@Param里的id改了就不行了
/**
* 添加用户
* @param user
* @return
*/
@Insert("insert into user (id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);//引用对象不需要写@Param
/**
* 修改用户
* @param user
* @return
*/
@Update("update user set name=#{name} ,pwd=#{password} where id = #{id}")
int updateUser(User user);
/**
* 删除用户
* @param id
* @return
*/
@Delete("delete from user where id = #{uid}")
int deleteUser(@Param("uid") int id);
/**
* #{} ${} 区别 #防止sql注入
*/
}
2编写测试类
import com.hang.dao.UserMapper;
import com.hang.pojo.User;
import com.hang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//底层主要应用反射 得到这个类的所有东西
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//底层主要应用反射 得到这个类的所有东西
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void test3(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//debug一下 发现configuration里的autoCommit变成true了
int i = mapper.addUser(new User(8, "wowowo", "2154235"));//现在不需要手动提交事务了
if (i>0){
System.out.println("添加成功!!!");
}
sqlSession.close();
}
@Test
public void test4(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int to = mapper.updateUser(new User(8, "to", "35423534"));
if (to>0){
System.out.println("修改成功!!!");
}
}
@Test
public void test5(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(8);
if (i>0){
System.out.println("删除成功!!!");
}
}
}
**注意:**我们必须要将接口绑定到核心配置文件之中!
例:
<!--绑定接口-->
<mappers>
<mapper class="com.hang.dao.UserMapper"/>
</mappers>
关于@Param()注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略,但是建议都加上
- 我们在SQL中引用的就是我们这里的@Param()中设定的属性名
#{} ,${}区别 #{}可以防止sql注入