MyBatis CRUD
CRUD建立在已经写好的第一个MyBatis项目上
1.namespace
namespace中的包名要和Dao/mapper接口的包名一致!
2.select 查
select选着查询语句:
-
id:就是对应的namespace中的方法名;
-
resultType:Sql语句执行的返回值
-
parameterType:参数类型!
1.编写接口
//根据id查询用户 User getUserByid(int id);
2.编写对相应的mapper中的Sql语句
<select id="getUserByid" parameterType="int" resultType="org.westor.pojo.User"> select * from mybatis2.user where id = #{id}; </select>
3.测试
@Test public void getUserByid(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User userByid = mapper.getUserByid(1); System.out.println(userByid); sqlSession.close(); }
3.insert 增
- id:就是对应的namespace中的方法名;
- resultType:Sql语句执行的返回值
- parameterType:参数类型!
1.编写接口
//insert插入一个用户
int addUser(User user);
2.编写对相应的mapper中的Sql语句
<insert id="addUser" parameterType="org.westor.pojo.User">
insert into mybatis2.user(id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
3.测试
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.addUser(new User(5, "哈哈哈", "65612523"));
if (i>0){
System.out.println("插入成功");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
4.updale 改
- id:就是对应的namespace中的方法名;
- resultType:Sql语句执行的返回值
- parameterType:参数类型!
1.编写接口
//修改用户
int updateUser(User user);
2.编写对相应的mapper中的Sql语句
<update id="updateUser" parameterType="org.westor.pojo.User">
update mybatis2.user set name=#{name},pwd=#{pwd} where id=#{id};
</update>
3.测试
@Test
public void updeteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(3,"呵呵","652432"));
//提交事务
sqlSession.commit();
sqlSession.close();
}
5.delete 删
- id:就是对应的namespace中的方法名;
- resultType:Sql语句执行的返回值
- parameterType:参数类型!
1.编写接口
//删除一个用户
int deleteUser(int id);
2.编写对相应的mapper中的Sql语句
<delete id="deleteUser" parameterType="int">
delete from mybatis2.user where id=#{id};
</delete>
3.测试
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(2);
sqlSession.commit();
sqlSession.close();
}
总结:
- 注意点: 增删改 需要提交事务 sqlSession.commit();
6.分析错误
- 标签不要匹配错
- resource绑定mapper,需要使用路径
- 程序配置文件必须符合规范
- NullPointerException,没有注册到资源
- 输出xml文件中存在中文乱码问题
- maven资源没有导出问题!
7.万能的map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
//万能的map插入一个用户
int addUser2(Map<String,Object> map);
<!--对象中的属性,可以直接取出来 传递一个Map的Key值-->
<insert id="addUser2" parameterType="map">
insert into mybatis2.user(id,name,pwd) values (#{userid},#{username},#{password});
</insert>
//测试
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("userid",2);
map.put("username","王思");
map.put("password","6565453");
mapper.addUser2(map);
sqlSession.close();
}
Map传参数,直接在sql中取出key即可! parameterType=“map”
对象传参数,直接在sql中取对象的属性即可! parameterType=“Object”
只有一个基本类型参数的情况下,可以直接在sql中取到!可以不写
多个参数用map 或者用注解!
8.思考
1.java代码执行的时候,传递通配符% %
select * from mybatis2.user where name like #{value}
List<User> like = mapper.getUserLike("%哈%");
2.在sql中使用通配符
select * from mybatis2.user where name like "%"#{value}"%"
List<User> like = mapper.getUserLike(%哈%);
配置解析之属性优化
1.核心配置文件,
- mybatis-config.xml
- MyByatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
2.environment(环境变量)
MyBatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每一个SqlsslonFactory实例只能选着一种环境
学会使用配置多套运行环境
Myatis默认就是事物管理器JDBC,连接池POOLED
3.properties(属性)
我们可以通过properties属性来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。【db.properties 】
编写一个配置文件
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis2?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123
在配置文件中插入
- 可以直接引入外部文件
<!--引入外部配置文件-->
<properties resource="db.properties"/>
- 可以在其中增加一些属性配置
- 如果两个有同一字段,优先使用外部配置文件!
<!--引入外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123"/>
</properties>
配置之别名优化
-
typeAliases(类型别名)
-
类型别名是为java类型设置一个短的名字
-
存在的意义仅在于用来减少类完全限定名的冗余
<!--可以给实体类取别名-->
<typeAliases>
<typeAlias type="org.westor.pojo.User" alias="User"/>
</typeAliases>
第一种:也可以指定一个包名,MyBatis会在包名下面搜索需要的java Bean包,比如:
第二种:扫描实体类的包,它的默认别名就为这个类的类名,首字母小写
<!--可以给实体类取别名-->
<typeAliases>
<package name="org.westor.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式,实体类十分多,建议使用第二种
第一种可以DIY(自定义)别名,第二种则不行(可以通过注解去取别名)