CRUD
增删改操作,执行完sql后,需要提交事务,否则不生效。
查询不需要提交事务。
通过SqlSession对象提交事务。
参数格式
sql语句中填写参数的格式:#{}
在sql语句中填写参数时,如果接口中的参数是类,那么可以直接写类中的属性,如果不是类,接口中的方法参数是什么,就写什么。
select
- id:对应namespace中的方法名
- resulteType:sqlj返回值结果的数据类型
- parameterType:sql参数类型
步骤:
- 在接口中定义方法。
- 在mapper.xml中定义sql语句。
接口中的方法:
List<User> getUserList();
sql语句
<select id="getUserList" resultType="top.jarvaniv.pojo.User">
select * from test.temp
</select>
执行:
// 查询所有用户
@Test
public void getUserListTest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close(); // 一定要关闭资源
}
insert
接口中的方法:
// 插入数据,User类型,返回值是插入了多少数据
int insertUser(User user);
sql语句
<insert id="insertUser" parameterType="top.jarvaniv.pojo.User">
--填参数时,可以直接使用user对象中的属性名进行调用
insert into test.temp (id,name) values (#{id},#{name})
</insert>
执行
// 插入用户
@Test
public void insertUserTest(){
// 在工具类中获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 加载mapper类型,获取UserMapper接口类型的对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insertUser(new User(101,"张三"));
sqlSession.commit(); // 增删改 要提交事务
sqlSession.close(); //最后一定记得要关闭资源
}
update
接口中的方法:
// 修改数据,根据id值,将数据库中对应id值的数据改成参数user中的数据,返回值是修改了多少条数据
int updataUser(User user);
sql语句
<update id="updataUser" parameterType="top.jarvaniv.pojo.User">
-- 根据参数user,修改数据表中的数据
update test.temp set name=#{
name} where id=#{
id}
</update>
执行
// 修改用户名字
@Test
public void updataUserTest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.updataUser(new User(100, "李四"));
sqlSession.commit();
if (result > 0 ){
System.out.println("修改成功");
}
sqlSession.close();
}
delete
接口中的方法:
// 删除数据,根据User的id值删除,返回值是删除了多少条数据
int deleteUser(int id );
sql语句
<delete id="deleteUser" parameterType="int">
-- 根据用户id值删除
-- 直接将方法中的参数传入进来
delete from test.temp where id=#{
id}
</delete>
执行
// 根据id删除用户
@Test
public void deleteUserTest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.deleteUser(24);
sqlSession.commit();
if (result > 0){
System.out.println("删除成功");
}
sqlSession.close();
}
万能map
如果实体类或者数据库表字段太多,那么在插入、修改等操作时,即使仅仅需要修改一个字段,那么也需要写很多不需要的字段,很麻烦,因此,可以用map集合,把需要使用的字段存入到map集合中,在执行sql语句时,通过取map集合中的数据,来向sql语句中插入数据。
由多个参数不好操作时,可以用map。
接口中方法:
// 使用map集合修改temp表数据
int updataOfMapTemp(Map map);
sql语句:
<update id="updataOfMapTemp" parameterType="map">
--可以直接调用map集合中的键
update test.temp set name=#{name} where id=#{id}
</update>
执行:
// 通过map修改temp表数据
@Test
public void updataOfMapTempTest() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,String> map = new HashMap<>();
map.put("id","23");
map.put("name","王五");
userMapper.updataOfMapTemp(map);
sqlSession.commit();
sqlSession.close();
}
模糊查询问题
模糊查询时,模糊的部分(字符)在sql语句中写死(类似于预编译),防止sql的依赖注入。
实体类属性名与数据库字段名不匹配的问题
问题:
将数据库中查询结果存放的数据库中时,如果类中的属性名和数据库字段名不一致(例如:pws与password),那么,读取出来的password就是null。
解决方式:
方法一:
在SQL查询语句中,将数据库字段起别名为实体类的属性名。
将数据库字段pwd,设置别名password,与实体类的属性名一致。
<select id="selectUserById" resultType="User">
select id , name , pwd as password from user where id = #{id}
</select>
这种方式不建议使用。不方便。
方法二:结果集映射(resultMap)
映射实体类与数据库表字段之间的关系
<!-- 要将查询的结果映射成一个User对象-->
<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<!-- resultMap设置使用哪个resultMap映射 -->
<select id="selectUserById" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>
对于字段名与属性名相同的字段,可以不用在映射中写,只需要写字段名与属性名不一致的部分。例如:上个例子中的id
与name
,字段名与属性名是一样的,就可以在resultMap省略不写,只映射不同的pwd与password。