(三)、CURD
1.Mapper实现类
首先我们我们要去写一个接口-----》 然后去.xml配置接口的具体用法-----》最后我们在测试类中进行测试.
写一个接口
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import java.util.List; public interface UserMapper { // 查询全部用户 List<User> getUserList(); // 根据ID查询用户 User getUserById(int id); // 增加一个用户 int addUser(User user); // 删除一个用户 int removeUser(int id); // 更改一个用户的信息 int updateUser(); }
配置.xml文件,对其进行具体化的实现
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace绑定一个对应的Dao/Mapper接口--> <mapper namespace="Com.Jsxs.Dao.UserMapper"> <!-- 查询语句全部用户--> <select id="getUserList" resultType="Com.Jsxs.pojo.User"> select *from mybatis.user </select> <!-- 根据ID查询用户--> <select id="getUserById" parameterType="int" resultType="Com.Jsxs.pojo.User"> select *from mybatis.user where id=#{id} </select> <!-- 增加一个用户,对象中的可以直接取出来--> <insert id="addUser" parameterType="Com.Jsxs.pojo.User"> insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd}) </insert> <!-- 删除一个用户--> <delete id="removeUser" parameterType="int"> delete from mybatis.user where id=#{id} </delete> <!-- 更改用户的信息--> <update id="updateUser" > update mybatis.user set pwd="123456789" </update> </mapper>
进行测试的操作
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import Com.Jsxs.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class UserDaoTest { /** * 查询全部的用户信息 */ @Test public void test(){ // 第一步: 获取sqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 方式一: 执行SQL // UserDao userDao = sqlSession.getMapper(UserDao.class); // List<User> userList = userDao.getUserList(); // 方式二: List<User> userList = sqlSession.selectList("Com.Jsxs.Dao.UserMapper.getUserList"); for (User user : userList) { System.out.println(user); } // 关闭sqlSession sqlSession.close(); } /* * 根据用户的id进行查询用户 * */ @Test public void test2(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User userById = mapper.getUserById(1); System.out.println(userById); sqlSession.close(); } // 增删改需要提交事务 /** * 添加数据 */ @Test public void test3(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int addUser = mapper.addUser(new User(4, "傻子", "258987")); if (addUser>0){ System.out.println("插入成功!"); } // 提交事务 sqlSession.commit(); // 关闭 sqlSession.close(); } /** * 删除用户的信息 */ @Test public void test4(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.removeUser(4); if (i>0){ System.out.println("已经删除了ID为"+i+"的用户"); } sqlSession.commit(); sqlSession.close(); } /** * 更改用户的信息 */ @Test public void test5(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.updateUser(); if (i>0){ System.out.println("修改密码成功"); } sqlSession.commit(); sqlSession.close(); } }
(1).namespace
namespce中的包名要和接口的包名一致
(2).select
id : 就是对应namespace中的方法名
resultType: Sql执行语句的返回值(增删改没结果返回类型)
parameterType: 参数类型。如果没有参数类型的话(此处可以省略)
(3).insert
(4)update
(5).delete
2.增删改的注意事项
(1).占位符号
#{参数}
(2).增删改必须要提交事务
sqlSession.commit(),不提交事务的话,我们实际的操作就不会生效。
(四)、错误排查指导
中文错误解决办法: 在xml配置文件中把最上面的UTF-8改为UTF8即可
标签不要写错
在映射路径的时候,我们要用/而不是.
(五)、万能的Map(切记类型别名)
1.Map的公要
定义一个Map数组: Map<String,Object> map
在测试类中定义Map,定义的是HashMap()
然后利用map.put()进行追加
最后进行元素的追加
假设我们的实体类,或则数据库的表,字段或则参数过多,我们应当考虑使用Map!如果不使用Map那么我们的添加的字段名要和实体类的属性值应该一一对应,否则会报错。第一个参数一定要是: String,第二个参数可以是Obiect/具体的
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import java.util.List; import java.util.Map; public interface UserMapper { // 查询全部用户 List<User> getUserList(); // 根据ID查询用户 User getUserById(int id); // 增加一个用户 int addUser(User user); // 增加一个用户 int addUser2(Map<String,Object> map); // 删除一个用户 int removeUser(int id); // 更改一个用户的信息 int updateUser(); }
Map的key值
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace绑定一个对应的Dao/Mapper接口--> <mapper namespace="Com.Jsxs.Dao.UserMapper"> <!-- 查询语句全部用户--> <select id="getUserList" resultType="Com.Jsxs.pojo.User"> select *from mybatis.user </select> <!-- 根据ID查询用户--> <select id="getUserById" parameterType="int" resultType="Com.Jsxs.pojo.User"> select *from mybatis.user where id=#{id} </select> <!-- 增加一个用户,对象中的可以直接取出来--> <insert id="addUser" parameterType="Com.Jsxs.pojo.User"> insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd}) </insert> <!-- 删除一个用户--> <delete id="removeUser" parameterType="int"> delete from mybatis.user where id=#{id} </delete> <!-- 更改用户的信息--> <update id="updateUser" > update mybatis.user set pwd="123456789" </update> <!-- 利用Map增加一个用户 --> <insert id="addUser2" parameterType="map"> <!-- map的key值--> insert into mybatis.user(id,name,pwd) values(#{userid},#{username},#{password}); </insert> </mapper>
@Test public void test6(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<>(); map.put("userid",4); map.put("username","小直筒啊"); map.put("password","1234566"); int i = mapper.addUser2(map); if (i>0){ System.out.println("添加成功"); } sqlSession.commit(); sqlSession.close(); }
2.Map和对象传递参数的区别
(1).Map传递参数,直接在sql中取出key值即可. 【parameterType=“map”】
(2).对象传递参数,直接在sql中取出对象的属性即可(实体类的数据)【parameterType=“Object”】
(3).如果接口中只有一个基本类型参数的情况下,利用对象属【parameterType=“Object/不写”】
(4).如果接口中有多个基本类型参数的情况下,;利用Map/注解
@Test public void test7(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<>(); map.put("id_one",1); map.put("name_one","吉士先生"); User uer = mapper.getUer(map); System.out.println(uer); sqlSession.close(); }
<!-- 利用Map根据两个条件进行数据的查找--> <select id="getUer" parameterType="map" resultType="Com.Jsxs.pojo.User"> select *from mybatis.user where id=#{id_one} and name=#{name_one}; </select>
// 根据ID和用户名查找数据 User getUer(Map<String,Object> map);
(六)、模糊查询
1.模糊查询 like(通配符放在java代码中)有注入问题
// 进行模糊查询 List<User> getUserLike(String name);
<!-- 进行模糊查询的操作--> <select id="getUserLike" resultType="Com.Jsxs.pojo.User" > select *from mybatis.user where name like #{name}; </select>
@Test public void test8(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userLike = mapper.getUserLike("%吉%"); for (User user : userLike) { System.out.println(user); }
注入问题
2.通配符放在sql语句中,可以防止SQL注入问题
@Test public void test8(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userLike = mapper.getUserLike("吉"); for (User user : userLike) { System.out.println(user); } }
<!-- 进行模糊查询的操作--> <select id="getUserLike" resultType="Com.Jsxs.pojo.User" > select *from mybatis.user where name like "%" #{name} "%"; </select>