MyBatis的配置请参考我的上一篇文章,在上一篇文章的基础上我们实现数据的增删查改。
创建实现增删查改的xml文件,这里才是真正实现增删查改的文件。
创建完后要在配置文件中注册创建好的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<!-- 所支持的事物类型不多,记住这个即可 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据库连接信息 -->
<!-- 类型POOLED UNPOLED JNDI -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/learnmybatis?useSSL=false&serverTimezone=UTC&"/>
<property name="username" value="ffy"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 注册userMapper.xml文件,
userMapper.xml位于com.ffy.mapping这个包下,
所以resource写成com/ffy/mapping/userMapping.xml
-->
<mappers>
<mapper resource="com/ffy/mapping/userMapper.xml"/>
<mapper resource="com/ffy/mapping/objectMapper.xml"/>
</mappers>
</configuration>
在新建的xml文件中增加增删查改标签:
mybatis增删查改##
1.插入数据
- 先创建实体类entity,有些地方叫POJO,或者VO,或者Bean,一般来说,尽量和数据库里的字段一一对应。
- 我们需要另外准备一个mapper.xml,一般来说,对应于一个实体entity,我们会准备一个mapper
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
keyProperty=""
useGeneratedKeys=""
>
在userMapper.xml中添加插入标签
<!--
第一行的code name password对应的是数据库里的字段
而第二行的带# {}的code name password,对应的反而是POJO里的属性
-->
<insert id="insertOne" parameterType="com.ffy.POJO.User"
keyProperty="userId" useGeneratedKeys="true">
insert into user(code,name,password) values
(#{code},#{name},#{password})
</insert>
<insert id="insertNoUserId" parameterType="com.ffy.POJO.User"
keyProperty="userId" useGeneratedKeys="true">
insert into user(user_id,code,name,password) values
(#{userId},#{code},#{name},#{password})
</insert>
<insert id="insertNoUserIdFull" parameterType="com.ffy.POJO.User"
>
insert into user(user_id,code,name,password) values
(#{userId},#{code},#{name},#{password})
</insert>
测试代码:
package com.ffy.Test;
import java.io.InputStream;
import java.util.Random;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.ffy.POJO.User;
public class App {
public static void main(String[] args) {
//mybatis的配置文件
String resource="mybaties_conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
//下面这个方式,值得琢磨琢磨
InputStream is=App.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂,mybatis的类,给予输入流去构建
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader=Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//sqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
//创建能执行映射文件中sql的sqlSession
SqlSession session=sessionFactory.openSession();
/**
* 映射sql的表示字符串
* me.gocl.mapping.userMapper是userMapper.xml文件中mapper标签的namesapce属性
* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
//无论有没有设置id都是按数据库的现有id自增
// String statement="com.ffy.mapping.userMapper.insertOne";//映射sql的标识符字符串
// User user=new User();
// user.setUserId(100);
// user.setCode("UC"+(new Random()).nextInt(100));
// user.setName("ffy");
// user.setPassword("ffyffy");
// int count=session.insert(statement,user);
// session.commit();
// System.out.println("isnert count:"+count+"as"+user);
//若设置了id就按设置的id存储,若没有设置id则按数据库的id自增
// String statement2="com.ffy.mapping.userMapper.insertNoUserId";
// User user2=new User();
// user2.setCode("UC2"+(new Random()).nextInt(100));
// user2.setName("ffy2");
// user2.setPassword("ffy2ffy2");
// int count2=session.insert(statement2,user2);
// session.commit();
// System.out.println("isnert count:"+count2+"as"+user2);
//没有设置id的话数据库存储的是数据库现有id自增后的id,返回的id为该类型的默认值(int型则返回0)
//若设置了id数据库存储的就是自己设置的id,返回的也是自己设置的id
String statement3="com.ffy.mapping.userMapper.insertNoUserIdFull";
User user3=new User();
user3.setUserId(200);
user3.setCode("UCC"+(new Random()).nextInt(100));
user3.setName("ffy2");
user3.setPassword("ffyffy2");
int count1=session.insert(statement3,user3);
session.commit();
System.out.println("count1"+count1+":"+user3);
session.close();
}
}
2.删除数据
在userMapper.xml中加入以下标签:
<delete
id="deleteAuthor"
parameterType="domain.blog.Author"
>
代码:
xml:
<delete id="deleteById" parameterType="int">
delete from user where user_id=#{id}
</delete>
测试代码:
public class TestDelete {
public static void main(String[] args) {
String resource="mybaties_conf.xml";
InputStream is=TestDelete.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=sessionFactory.openSession();
String statement="com.ffy.mapping.userMapper.deleteById";
int id=8;
int count=session.delete(statement,id);
session.commit();
System.out.println("delete count"+count);
session.close();
}
}
3.更新
在userMapper.xml中加入以下标签:
<update
id="updateAuthor"
parameterType="domain.blog.Author"
>
代码:
xml标签
<update id="updateById" parameterType="com.ffy.POJO.User">
update user set code=#{code},
name=#{name},
password=#{password}
where user_id=#{userId}
</update>
测试代码:
public class TestUpdate {
public static void main(String[] args) {
String resource="mybaties_conf.xml";
InputStream is=TestUpdate.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=sessionFactory.openSession();
String statement="com.ffy.mapping.userMapper.updateById";
User user=new User();
user.setUserId(200);
user.setName("fhy");
user.setCode("fhy");
user.setPassword("fhy88fhy88");
int count=session.update(statement,user);
session.commit();
System.out.println("delete count"+count+" as "+user);
session.close();
}
}
4.查询(三种方式):
第一种:返回值可以是HashMap或者map,这种方式适合一条记录。实现方式如下:
<!-- 查询的第一种方式,返回一个值 -->
<select id="selectById" parameterType="int" resultType="hashmap">
select * from user where user_id=#{userId}
</select>
第二种:这种方式可以查询单个记录,也可以多个记录,就看查询结果。但是对于resultType里面的类型,有一个要求,就是属性名要和数据库字段名相吻合。如果不一致,会导致数据无法返回回来。实现方式如下:
<!-- 查询的第二种方式,返回一个结果集,缺点是实体类属性名字必须与数据库列名一致 -->
<select id="selectAllUser" resultType="com.ffy.POJO.User">
select * from user
</select>
第三种:返回值为resultMap,resultMap是一个标签,需要自己定义,这种方式改善了前两种方式的缺陷。之前一直用resultType,不管是用hashmap,还是我们自己定义的类,看起来都有点小缺陷,遇事mybatis引入了resultMap.利用这个东西,我们就可以把数据库里面的字段,映射成我们的POJO的属性,比resultType灵活多了。实现方式如下:
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namesapce,namespace的值习惯上设置成包名+sql映射文件名,
例如:namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(us?)
-->
<mapper namespace="com.ffy.mapping.userMapper">
<!--
resultMap,查询的返回的类型
type:查询结果返回的实体类的类型
column:与数据库的字段名相对于
property:与实体类的属性名相对应
column与property相互对应
jdbcType:数据库该字段的类型
-->
<resultMap type="com.ffy.POJO.User" id="BaseResultMap">
<id column="user_id" property="userId" jdbcType="INTEGER"/>
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
</resultMap>
<!--
查询的第三种方式
resultMap="BaseResultMap"对应上文定义的resultMap
-->
<select id="getAllUsers" resultMap="BaseResultMap">
select * from user
</select>
</mapper>
完整的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namesapce,namespace的值习惯上设置成包名+sql映射文件名,
例如:namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(us?)
-->
<mapper namespace="com.ffy.mapping.userMapper">
<resultMap type="com.ffy.POJO.User" id="BaseResultMap">
<id column="user_id" property="userId" jdbcType="INTEGER"/>
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
</resultMap>
<!--
第一行的code name password对应的是数据库里的字段
而第二行的带# {}的code name password,对应的反而是POJO里的属性
-->
<insert id="insertOne" parameterType="com.ffy.POJO.User"
keyProperty="userId" useGeneratedKeys="true">
insert into user(code,name,password) values
(#{code},#{name},#{password})
</insert>
<insert id="insertNoUserId" parameterType="com.ffy.POJO.User"
keyProperty="userId" useGeneratedKeys="true">
insert into user(user_id,code,name,password) values
(#{userId},#{code},#{name},#{password})
</insert>
<insert id="insertNoUserIdFull" parameterType="com.ffy.POJO.User"
>
insert into user(user_id,code,name,password) values
(#{userId},#{code},#{name},#{password})
</insert>
<delete id="deleteById" parameterType="int">
delete from user where user_id=#{id}
</delete>
<update id="updateById" parameterType="com.ffy.POJO.User">
update user set code=#{code},
name=#{name},
password=#{password}
where user_id=#{userId}
</update>
<!-- 查询的第一种方式,返回一个值 -->
<select id="selectById" parameterType="int" resultType="hashmap">
select * from user where user_id=#{userId}
</select>
<!-- 查询的第二种方式,返回一个结果集,缺点是实体类属性名字必须与数据库列名一致 -->
<select id="selectAllUser" resultType="com.ffy.POJO.User">
select * from user
</select>
<!-- 查询的第三种方式 -->
<select id="getAllUsers" resultMap="BaseResultMap">
select * from user
</select>
</mapper>
三种方式的测试代码:
package com.ffy.Test;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.ffy.POJO.User;
public class TestSelect {
public static void main(String[] args) {
String resource="mybaties_conf.xml";
InputStream is=TestSelect.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=sessionFactory.openSession();
// String statement="com.ffy.mapping.userMapper.selectById";
//执行查询返回一个唯一user对象的sql
// Map<String, Object> map=session.selectOne(statement,200);
// for(String key:map.keySet()){
// System.out.println(key+"="+map.get(key));
// }
// String statement2="com.ffy.mapping.objectMapper.getAllObjects";
// List<Object> objects=session.selectList(statement2);
//
// for(Object obj:objects){
// System.out.println(obj);
// }
// String statement3="com.ffy.mapping.userMapper.selectAllUser";
// List<User> users=session.selectList(statement3);
// for(User u:users){
// System.out.println(u);
// }
String statement4="com.ffy.mapping.userMapper.getAllUsers";
//执行查询返回一个唯一user对象的sql
List<User> users=session.selectList(statement4);
for(User u:users){
System.out.println(u);
}
session.close();
}
}