MyBatis - 基础学习2 - CRUD
1.namespace中的包名要和接口包名一致(namespace在xml文件中,接口包名,就是xml的实例化对象)
2.resultType:返回的参数类型(如果返回值是int,可以不用写)
3.parameterType:传入参数或对象类型
我们在配置好了项目的核心配置文件以后(mybatis-config.xml),以及编写好了我们的工具类(MybatisUtils)
完成了这些操作,我们的mybtis程序就只用写三步就可以操作数据库了
第一步:编写接口在我们的Dao包中
public interface UserMapper { //编写查询接口 List<User> getUserList(); //编写插入接口 int insertuser(User user); //编写修改数据库记录接口 int update(User user); //编写删除接口 int delete(int id); }
第二步:编写sql语句,在mapper.xml中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--绑定一个mapper接口--> <mapper namespace="top.lostyou.dao.UserMapper"> <!--编写查询的sql代码 id=“那个方法可以使用这个sql” resultType=“返回值类型”--> <select id="getUserList" resultType="top.lostyou.pojo.User"> SELECT * from mybatis.user WHERE id=3 </select> <!--编写插入的sql语句,parameterType=“传入参数或对象的数据类型”--> <!--对象中的属性可以直接取出来,使用 #{} 取值--> <insert id="insertuser" parameterType="top.lostyou.pojo.User"> INSERT INTO mybatis.user(id, name, pwd) VALUE(#{id},#{name},#{pwd}) </insert> <!--编写修改的sql语句--> <update id="update" parameterType="top.lostyou.pojo.User"> update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id} </update> <!--编写删除的sql语句--> <delete id="delete" parameterType="int"> DELETE FROM mybatis.user WHERE id=#{id} </delete> </mapper>
第三步:测试
public class UserDaoTest { @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //第一种执行sql方式:getMapper try { UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); }}catch (Exception e){ System.out.println("出错了"); e.fillInStackTrace(); }finally { //关闭sqlsession sqlSession.close(); } } //增删改都需要提交事务在mybatis中 @Test public void testinsert(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int key = mapper.insertuser(new User(6,"马明","123789")); System.out.println("插入成功!"+key); sqlSession.commit(); sqlSession.close(); } @Test public void testupdate(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int key = mapper.update(new User(4, "maming", "654321")); if (key>0) { System.out.println("修改成功!"); } sqlSession.commit(); sqlSession.close(); } @Test public void testdelete(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int key = mapper.delete(6); if(key>0) { System.out.println("删除成功!"); } sqlSession.commit(); sqlSession.close(); } }
二.强大的Map
- Map传参,直接在sql中取出key
- 对象传参,直接在sql中取对象的属性即可
- 只有一个基本类型,可以直接在sql语句中拿到
相比与对象传参,map传参的优势在于它可以自定义传入的数据个数是多少,
如果是利用对象传参,我们使用查询语句时,where后面跟着的条件如果只需一个id,但是对象传参,必须要把其它的参数全部传入,相比于利用效率,非常的低
而map传参的自定义程度高,条件需要几个参数就可以只传入几个参数,提高代码的利用效率
三步举例map传参:
第一步:创建一个接口,但是传入参数是键值对
User getuser(Map<String,Object> map);
第二步:编写sql语句,此时的传入对象类型就可以直接写map(parameterType="map"),然后调用的方法会自动去找到我们map.put的值
<select id="getuser" resultType="top.lostyou.pojo.User" parameterType="map"> SELECT * from mybatis.user WHERE id=#{hhh} </select>
第三步:测试,并且put健值对的值
@Test public void testgetuser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<String, Object>(); map.put("hhh",2);//与xml的sql语句中的,key名字对应,然后设置值 User user = mapper.getuser(map); System.out.println(user); sqlSession.close(); }
三.mybatis中的模糊查询的拓展
mybatis中也有 sql注入的问题,我们在使用LIKE这类关键字的时候,我们应该在xml中把这句sql写死,让用户可操作的,传入的只能是一个变量
以下是一种实现方式:
<select id="getuser" resultType="top.lostyou.pojo.User" parameterType="map"> SELECT * from mybatis.user where name LIKE "%"#{name}"%" </select>
它的解决思路是把通配符写到了sql语句中,而不是在实现类中