MyBatis是支持普通sql查询、存储过程和高级映射的持久层框架。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。
MyBatis可以使用 简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects 普通的Java对象)映射成数据库中的记录。
每一个Mybatis应用程序都以一个sqlSessionFactory对象的实例为核心。
sqlSessionFactory对象的实例可以通过sqlSessionFactoryBuilder对象来获得。sqlSessionFactoryBuilder对象可以通过xml配置文件,或从以往使用管理中准备好的Configuration类实例中来构建sqlSessionFactory对象。
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//环境
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
//映射器类
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意这种情况下配置是添加映射器类。映射器类是Java类,这些类包含SQL映射语句的注解从而避免了xml文件的依赖,但是xml映射仍然在 大多数高级映射(比如:嵌套join映射)时需要。
出于这样的原因,如果存在xml配置文件的话,MyBatis将会自动查找和加载一个对等的XML文件(这种情况下,基于类路径下的BlogMapper.class类的类名,那么BlogMapper.xml将会被加载–即class 与 XML在同一个文件目录下。如果非,则需要手动配置加载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 namespace="com.web.mapper.userMapper">
<!-- 可以解决model属性名与数据表中column列名不一致问题 jdbcType一定要大写 -->
<resultMap type="User" id="UserMap">
<id property="id" column="id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="username" javaType="string" jdbcType="VARCHAR"/>
<result property="age" column="age" javaType="int" jdbcType="INTEGER"/>
</resultMap>
<!--
注意这里的result,如果column == property 则可以直接返回Java object。
如果属性名与列名不一致,解决方法如下:
1. 使用resultMap;
2.返回hashmap ;
3.查询语句使用别名
-->
<select id="getUser" parameterType="int" resultMap="UserMap">
select * from t_user where id=#{id}
</select>
<delete id="deleteUser" parameterType="int" >
delete from t_user where id=#{id}
</delete>
<update id="updateUser" parameterType="User" >
update t_user set username=#{name},age=#{age} where id=#{id}
</update>
<insert id="insertUser" parameterType="User" >
insert into t_user(username,age) values(#{name},#{age})
</insert>
<!-- model's attr(name) different from column(username), so the result use UserMap -->
<select id="getUsers" resultMap="UserMap">
select * from t_user
</select>
</mapper>
注册到mybatis.xml [当与spring结合时,将不需要这个配置文件]
mybatis的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<!-- 配置实体类的别名 -->
<typeAliases>
<!-- <typeAlias type="com.web.model.User" alias="User"/> -->
<package name="com.web.model"/>
</typeAliases>
<!--
development : 开发模式
work : 工作模式
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/web/mapper/userMapper.xml"/>
<mapper resource="com/web/mapper/orderMapper.xml"/>
<mapper class="com.web.mapperClass.UserMapper"/>
</mappers>
</configuration>
这里使用xml文件获取sqlSessionFactory和sqlSession。
public static SqlSessionFactory getFactory(){
/* flow the src dir*/
String resource = "mybatis.xml";
/*MybatisUtils.class.getResourceAsStream(resource)----- it's wrong !!!!
* please distinguish the two up and down
* */
InputStream inputStream = MybatisUtils.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
return factory;
}
SqlSession session = factory.openSession(true);
//默认手动提交;
/*
两种解决方式:
1.factory.opensession(true);
2.session.commit();
*/
/*use sql xml not annotation*/
@Test
public void testAdd(){
SqlSession session = MybatisUtils.getFactory().openSession();
String statement = "com.web.mapper.userMapper.insertUser";
/*return the effect rows*/
int insert= session.insert(statement, new User("tom5", 15));
/*default is not auto commit*/
session.commit(true);
session.close();
System.out.println("effect rows.."+insert);
}
@Test
public void testSelect(){
/*set auto commit ,which equals to the above*/
SqlSession session = MybatisUtils.getFactory().openSession(true);
String statement = "com.web.mapper.userMapper.getUser";
/*return the effect rows*/
User user = session.selectOne(statement, 3);
System.out.println("effect rows.."+user);
}
@Test
public void testUpdate(){
SqlSession session = MybatisUtils.getFactory().openSession(true);
String statement = "com.web.mapper.userMapper.updateUser";
/*return the effect rows*/
int update= session.update(statement, new User(3,"tom4", 13));
System.out.println("effect rows.."+update);
}
@Test
public void testDelete(){
SqlSession session = MybatisUtils.getFactory().openSession();
String statement = "com.web.mapper.userMapper.deleteUser";
/*return the effect rows*/
int delete= session.delete(statement, 6);
/* commit by yourself*/
session.commit();
System.out.println("effect rows.."+delete);
session.close();
}
@Test
public void testGetUsers(){
SqlSession session = MybatisUtils.getFactory().openSession();
String statement = "com.web.mapper.userMapper.getUsers";
/*return the List<User>*/
List<User> users= session.selectList(statement);
session.commit();
System.out.println("effect rows.."+users);
session.close();
}
parameterType 和 resultType 为 hashmap :
<select id="getUserForMap" parameterType="hashmap" resultType="hashmap">
select * from c_user where id=#{id};
</select>
@Test
public void getUserForMap(){
SqlSession session = MybatisUtils.getFactory().openSession();
String statement = "com.web.mapper.userMapper.getUserForMap";
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
/*return the effect rows*/
Object selectOne = session.selectOne(statement, map);
/*default is not auto commit*/
session.commit(true);
session.close();
System.out.println("effect rows.."+selectOne+" ,class :"+selectOne.getClass());
}
effect rows..{id=1, age=12, name=luli} ,class :class java.util.HashMap
综上可知:mybatis 会根据参数类型和结果类型,自动进行解析封装。
<select id="getListPage" parameterType="hashmap" resultMap="siteExtendDaoMap">
select id,site_id,site_name,site_number,province,city,area,address,internal_number,longitude,latitude
from tb_site
--使用动态sql
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="checkState!= null and checkState!=''">
and check_state = #{checkState,jdbcType=INTEGER}
</if>
<if test="siteId!= null and siteId!=''">
and site_id like concat('%',#{siteId},'%')
</if>
<if test="siteName!= null and siteName!=''">
and site_name like concat('%',#{siteName},'%')
</if>
<if test="siteNumber!= null and siteNumber!=''">
and site_number like concat('%', #{siteNumber},'%')
</if>
<if test="province!= null and province!=''">
and province = #{province}
</if>
<if test="city!= null and city!=''">
and city = #{city}
</if>
<if test="area!= null and area!=''">
and area = #{area}
</if>
</trim>
--添加排序
<if test="sortname!= null and sortname!='' and sortorder!= null and sortorder!=''">
order by ${sortname} ${sortorder}
</if>
--添加分页
limit ${(page-1)*pagesize},${pagesize}
</select>
如果参数为pojo,mybatis会自动从对象里面获取id ;
<delete id="delete" parameterType="User">
delete from tb_user
where
id = #{id}
</delete>
<delete id="deleteById" parameterType="long">
delete from tb_user
where
id = #{id}
</delete>
<delete id="deleteByIds">
delete from tb_user
where id in
--使用foreach
<foreach collection="list" item="id" open="(" separator=","close=")"> #{id}
</foreach>
</delete>
通常与getListPage联合使用。
<select id="getRows" parameterType="hashmap" resultType="long">
select count(*) from tb_sys_role
<if test="keySysRole!= null">
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="keySysRole.id!= null">
and id = #{keySysRole.id}
</if>
<if test="keySysRole.name!= null and keySysRole.name!=''">
and name = #{keySysRole.name}
</if>
<if test="keySysRole.available!= null and keySysRole.available!=''">
and available = #{keySysRole.available}
</if>
</trim>
</if>
</select>
以上就是本文关于mybatis使用xml进行增删改查代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。