一:环境搭建
- 引入jar包
- 在classpath(本文所指的classpath一律为src目录下)新建
SqlMapConfig.xml
<?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>
</configuration>
- 添加log4g日志配置(关于日志的添加方式在mybatis开发文档中有详细说明)
在classpath下新增log4j.properties文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在sqlMapConfig.xml中配置使用log4j日志文件
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- 添加数据源配置
在classpath下新增jdbcInfo.properties数据库链接配置文件,名称可任意(注意这里可能需要导入驱动包)
jdbc.driverName = oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@localhost:1521:XE
jdbc.user = tiketsystem
jdbc.password =a7633050
在sqlMapConfig.xml中加载数据源properties
<!-- 加载jdbc配置文件-->
<properties resource="jdbcInfo.properties"></properties>
配置数据源信息
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${bdcj.driverName}"/>
<property name="url" value="${bdcj.url}"/>
<property name="username" value="${bdcj.user}"/>
<property name="password" value="${bdcj.password}"/>
</dataSource>
</environment>
</environments>
二:接口开发
mybatis有多种形式的使用方式,这里仅列出实际开发中的接口开发方式
- 开发规范
1、 mapper接口的全限定名要和mapper映射文件的namespace的值相同。
2、 mapper接口的方法名称要和mapper映射文件中的statement的id相同;
3、 mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。
4、 mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致;
通过规范式的开发mapper接口,可以解决原始dao开发当中存在的问题:
1、 模板代码已经去掉;
2、 剩下去不掉的操作数据库的代码,其实就是一行代码。这行代码中硬编码的部分,通过第一和第二个规范就可以解决。
- 基础配置
别名配置(配置了别名的包,在mapper文件中引用该包中的pojo类的时候可以不用写具体的包路径,另外忽略大小写):
<!--配置可用别名的包目录-->
<typeAliases>
<package name="com.let.ano.mapper"></package>
<package name="pojo"></package>
</typeAliases>
引入mapper文件(写在该路径下的mapper文件,将会自动被引入)
<!--引入mapper文件的包路径-->
<mappers>
<package name="com.let.ano.mapper"></package>
</mappers>
- 增删改查实例代码
接口类:
package com.let.ano.mapper;
import pojo.GridExt;
import pojo.User;
import java.util.List;
/**
* Created by Administrator on 2017-12-26.
*/
public interface UsersMapper {
/**
*通过id查询用户
* @param users
* @return Users
*/
public Users getUserById(Users users);
/**
*通过用户名模糊查询用户
* @param users
* @return Users
*/
public List<Users> getUsersByUserName(Users users);
/**
* 通过用户id查询用户
* @param users
*/
public void deleteUserById(Users users);
/**
* 更新用户信息
* @param users
*/
public void updateUser(Users users);
/**
* 通过条件查询用户
* @param users
* @return
*/
public Users getUserByCondition(Users users);
/**
* 根据用户ids查询所有满足条件的用户
* @param usersEx
* @return User
*/
public List<Users> getUserInIds(UsersEx usersEx);
/**
* 通过网格id获取网格信息及其下的建筑物信息
* @param gridExt
* @return GridExt
*/
public GridExt getGridAndAllJzwByGridId(GridExt gridExt);
}
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 namespace="com.let.ano.mapper.UsersMapper">
<sql id="select_users_where">
<if test="id!=null">
and id = #{id}
</if>
<if test="username!=null">
and username like '%${username}%'
</if>
<if test="sex !=null">
AND sex = #{sex}
</if>
</sql>
<!--定义users的映射mapper,用于在sql查询过程中匹配修改了或增加了列名的字段-->
<resultMap id="userMap" type="users">
<id column="id" property="id"></id>
<result column="username_" property="username"></result>
<result column="sex_" property="sex"></result>
</resultMap>
<!--通过用户id获取用户-->
<select id="getUserById" parameterType="users" resultMap="userMap">
select username username_,sex sex_ from users where id = #{id}
</select>
<!--通过用户名模糊查询用户,在这里如果参数为简单类型 则需要写死username为value,另外这里是#不是$是按原样输出-->
<select id="getUsersByUserName" resultType="users" parameterType="users">
select * from users where username LIKE '%${username}%'
</select>
<!--通过用户id删除用户-->
<delete id="deleteUserById" parameterType="users">
DELETE FROM users WHERE id = #{id}
</delete>
<!--更新用户新i-->
<update id="updateUser" parameterType="users" keyColumn="id">
UPDATE users set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
</update>
<!--新增用户-->
<insert id="insertUser" parameterType="users">
/*在插入前先获取索引值*/
<selectKey keyProperty="id" resultType="String" order="BEFORE">
select sec_users.nextval from dual
</selectKey>
insert into users (id,username,birthday,sex,address) values (#{id}, #{username}, #{birthday}, #{sex}, #{address})
</insert>
<!--根据条件查询用户-->
<select id="getUserByCondition" resultType="users" parameterType="users">
SELECT * FROM USERS
<where>
<include refid="select_users_where"></include>
</where>
</select>
<!-- 查询所有id在ids中的用户列-->
<select id="getUserInIds" parameterType="usersEx" resultType="users">
select * from users
<where>
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
<resultMap id="gridAndJzws" type="gridExt">
<id column="land_pre_grid_id" property="land_pre_grid_id"></id>
<result column="lcs_task_id" property="lcs_task_id"></result>
<result column="grid_code" property="grid_code"></result>
<result column="grid_no" property="grid_no"></result>
<association property="landTask" javaType="LandTask">
<id column="lcs_task_id" property="lcs_task_id"></id>
<result column="task_name" property="task_name"></result>
</association>
<collection property="jzwList" ofType="Jzw">
<id property="lpw_id" column="lpw_id"></id>
<result column="bldg_no" property="bldg_no"></result>
<result column="land_pre_grid_id" property="land_pre_grid_id"></result>
<result column="survey_type" property="survey_type"></result>
</collection>
</resultMap>
<select id="getGridAndAllJzwByGridId" parameterType="gridExt" resultMap="gridAndJzws" >
select * from land_pre_grid grid,land_pre_jzw jzw where grid.land_pre_grid_id = jzw.land_pre_grid_id and grid.land_pre_grid_id = #{land_pre_grid_id}
</select>
</mapper>
这里包含了增删改查的基本示例,多对一,一对多的查询示例包括collection ,和association的使用方式,动态sql中where if foreach的基本使用。
这里推荐一种编码风格,可以吧各个表需要显示的列名,已sql片段的形式单独拿出来,这样每次写sql的时候直接引用即可
username,password,sex
<select id="getUsersByUserName" resultType="users" parameterType="users">
select
<include refid="users"></include>
from users where username LIKE '%${username}%'
</select>
java调用
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
Users users = new Users();
users.setAddress("怀化");
users.setUsername("王六");
users.setBirthday(new Date());
users.setSex("2");
users.setId("13");
Users findUser = session.selectOne("getUserById",users);
System.out.println("getUserById***********"+findUser);
三:逆向工程
个人觉得逆向工程这个东西可谓是大大简化了开发成本,也降低了人工可能产生的错误率。不过机器的东西也有不足,它只是完成了单表查询的基本配置,对于关系型查询,多表查询它的sql并不能完成,还需要人工书写。
http://blog.csdn.net/h3243212/article/details/50778937