MyBatis的CRUD
一、关于namespace
在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。
命名空间的作用有两个,一个是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。
命名解析:为了减少输入量,MyBatis 对所有具有名称的配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名。
所以配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
二、CRUD
环境的准备跟上一篇文章一样,可以去看看
select
1、使用
select标签是mybatis中最常用的标签之一,select语句有很多属性可以详细配置每一条SQL语句
SQL语句返回值类型。【完整的类名或者别名】
传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】,命名空间中唯一的标识符
<select id="selectUser" parameterType="int" resultType="hashmap">
SELECT * FROM User WHERE ID = #{id}
</select>
这个语句名为 selectUser,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。
<select id="selectUserById" resultType="user" parameterType="int">
select * FROM user WHERE id=#{id}
</select>
这个语句名为 selectUserById,接受一个 int(或 Integer)类型的参数,并返回一个 user类型的对象。
在接口编写方法
List<User> selectUser();
//根据id查询用户
User selectUserById(int id);
在UserMapper.xml编写语句
<select id="selectUser" resultType="user" >
select * from user
</select>
<select id="selectUserById" resultType="user" parameterType="int">
select * FROM user WHERE id=#{id}
</select>
测试
@Test
public void TestUser() {
// 定义SqlSession变量
SqlSession sqlSession = null;
try {
// 创建SqlSession实例
sqlSession = MyFactroySqlsession.getSqlSession();
//方式一
Object o = sqlSession.selectOne("Mapper.UserMapper.selectUserById", 1);
System.out.println(o);
//方式二
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.selectUserById(1));
// 提交事务
sqlSession.commit();
} catch (Exception e) {
// 回滚事务
sqlSession.rollback();
e.printStackTrace();
}finally {
// 关闭SqlSession
if(sqlSession != null)
sqlSession.close();
}
}
问题:(1)如果实体类跟数据库字段名不一致可能导致查询不出来所以我们在接口的参数如果是普通类型都加上@Param属性,不是基本类型不用加,相当于取别名。
User selectUsernp(@Param("na") String name, @Param("p") String pw);
<select id="selectUsernp" resultType="user">
SELECT * FROM user WHERE name=#{na} or password=#{p}
</select>
(2)如果参数过多可以使用map
User selectUsernp2(Map<String,String> map);
<select id="selectUsernp2" resultType="user" parameterType="map">
SELECT * FROM user WHERE name=#{name} or password=#{password}
</select>
使用时记得传入map就行
Map<String, String> map = new HashMap<String, String>();
map.put("name","map");
map.put("password","123456");
关于模糊查询like
<select id=”selectlike”>
select * from user where username like #{value}
</select>
<select id=”selectlike”>
select * from user where username like "%"#{value}"%"
</select>
第1种:在Java代码中添加sql通配符。
string name = “%c%”;
list<User> names = mapper.selectlike(name);
string name = “c”;
list<User> names = mapper.selectlike(name);
第2种:在sql语句中拼接通配符,会引起sql注入
2、select属性
<select
id="selectUser"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="userResultMap"
flushCache="false"
useCache="true"
timeout="10"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
insert
1、使用
insert的使用与select基本一样,直接上测试用例了。
在接口编写方法
int addUser(User user);
在UserMapper.xml编写语句
<insert id="addUser" parameterType="user">
insert into user(id,name,password) VALUES (
#{id},#{name},#{password}
)
</insert>
然后跟上面一样测试就行。
不同点:如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。例如,如果上面的 user表已经在 id 列上使用了自动生成,那么语句可以修改为:
<insert id="addUser" parameterType="user" useGeneratedKeys="true"
keyProperty="id">
insert into user(id,name,password) VALUES (
#{id},#{name},#{password}
)
</insert>
如果你的数据库还支持多行插入, 你也可以传入一个 user 数组或集合,并返回自动生成的主键。
<insert id="addUser" useGeneratedKeys="true"
keyProperty="id">
insert into user(id,name,password) VALUES
<foreach item="item" collection="list" separator=",">
(#{item.id}, #{item.name}, #{item.password}
</foreach>
</insert>
对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 JDBC 驱动,MyBatis 有另外一种方法来生成主键。
这里有一个的示例,它可以生成一个随机 ID(不建议实际使用):
<insert id="addUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
insert into Author
insert into user(id,name,password) VALUES (
#{id},#{name},#{password}
)
</insert>
selectKey 元素描述如下:
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED">
2、insert、update 和 delete属性
由于这三个属性几乎一样,就放一起说了
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id="updateAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
update
同上
int update(User user);
<update id="update" parameterType="user">
UPDATE user set name=#{name},password=#{password} where id = #{id}
</update>
delete
同上
int dedate(@Param("id") int id);
<delete id="dedate" parameterType="int">
DELETE FROM user WHERE id=#{id}
</delete>