一、首先都是对jar包进行加载: https://github.com/mybatis/mybatis-3/releases
mybatis-3.4.4.jar (mybatis jar包)
mysql-connector-java-5.1.7-bin.jar (链接数据库Jar包)
二、核心配置文件的创建:
模板在下载的mybatis源码包中有:路径如下:
E:\download\mybatis-3-mybatis-3.4.5\src\test\java\org\apache\ibatis\submitted\complex_property\Configuration.xml
以及改目录下的javabean模型映射文件:User.xml
Configuration.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> <settings> <setting name="useGeneratedKeys" value="false"/> <setting name="useColumnLabel" value="true"/> </settings> <typeAliases> <typeAlias alias="UserAlias" type="com.lin.model.User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis01?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/lin/model/User.xml"/> <!--引入映射文件--> </mappers> </configuration>
User.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.lin.dao.IUser"> <!--为避免多人开发时namespace命名冲突,这里用接口IUser来实现--> <!--resultMap是对javabean对象的映射 该对象就id、userName、Password三个属性--> <resultMap type="UserAlias" id="UserResult"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="USERNAME" jdbcType="VARCHAR" property="userName"/> <result column="PASSWORD" jdbcType="VARCHAR" property="Password"/> </resultMap> <!--查询全部--> <select id="queryUserList" parameterType="long" resultMap="UserResult"> SELECT * FROM user WHERE id != 0 </select> <!--查询一条--> <select id="queryOne" parameterType="long" resultMap="UserResult"> select <include refid="value"/> from USER where id=1 </select> <sql id="value">id,userName,Password</sql> <!--sql标签可以用于设置常量,提供给多出调用--> <!--模糊查询--> <!--parameterType表示这里传入了改类型的参数 resultMap是返回值类型--> <select id="queryUsers" parameterType="com.lin.model.User" resultMap="UserResult"> SELECT * FROM USER <where> <if test="userName !=null and !"".equals(userName.trim())"> and userName LIKE '%' #{userName} '%' </if> <if test="password !=null and !"".equals(password.trim())"> and password like '%' #{Password} '%' </if> </where> /*where标签在最后拼接时会把最前面的and 删除,保证sql语句是正确的*/ <!-- <trim prefix="where" prefixOverrides="and/or"> 这样trim标签就相当于where标签 </trim> --> </select> <!--删除一条--> <delete id="deleteOne" parameterType="int" > DELETE FROM USER where ID = #{_parameter} <!--int类型统一写法 #{_parameter} 传入的是个int型参数--> </delete> <!--批量删除--> <delete id="deleteBatch" parameterType="java.util.List"> DELETE FROM USER WHERE ID IN ( <foreach collection="list" item="item" separator=","> #{item} </foreach>
<!--传入的是个List数组类型 parameterType="java.util.List" 用
foreach遍历,separator=“,”属性表示在拼接sql语句时会自动将末尾的逗号删除,保证sql语法正确-->
)
</delete>
<!--
插入
-->
<insert
id
="insertUser"
parameterType
="com.lin.model.User"
>
insert into USER (username,password) values (#{userName},#{Password});
</insert>
<!-- <insert id="insertUser" parameterType="com.lin.model.User" useGeneratedKeys="true" >
INSERT INTO USER
(
userName,
Password
)
VALUES
(
#{userName},
#{Password}
)
</insert>-->
<update
id
="updateUser"
keyProperty
="com.lin.model.User"
>
update User set userName=#{userName},password=#{password} where id=#{id}
<set>
<!-- <if test="userName!=null and !"".equals(userName.trim())">
userName=#{userName},
</if>
<if test="Password!=null and !"".equals(Password.trim())">
Password=#{password}
</if>-->
</set>
<!--set
标签在最后拼接时会把最后一个逗号删除
-->
<!--
<trim prefix="set" prefixOverrides=",">
</trim>
这样的
trim
标签就相当于
set
标签
-->
</update>
<!-- <select id="version" parameterType="long" resultType="int">
SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}
</select>-->
<!-- <delete id="delete" parameterType="UserAlias">
DELETE FROM user WHERE id = #{id:INTEGER}
</delete>-->
<!-- <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">
INSERT INTO user
( id,
username,
password,
administrator
)
VALUES
( #{id},
#{username,jdbcType=VARCHAR},
#{password.encrypted:VARCHAR},
#{administrator,jdbcType=BOOLEAN}
)
</insert>-->
<!-- <update id="update" parameterType="UserAlias">
UPDATE user SET
username = #{username,jdbcType=VARCHAR},
password = #{password.encrypted,jdbcType=VARCHAR},
administrator = #{administrator,jdbcType=BOOLEAN}
WHERE
id = #{id,jdbcType=INTEGER}
</update>-->
<!-- Unique constraint check -->
<!-- <select id="isUniqueUsername" parameterType="map" resultType="boolean">
SELECT (count(*) = 0)
FROM user
WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS
NULL) <!– other than me –>
AND (username = #{username,jdbcType=VARCHAR})
</select>-->
</mapper>
三、数据库连接工具类:(整合Spring后可以通过spring来管理该对象)
package com.lin.DButil; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.Reader; /** * Created by lin on 2017/9/19. */ public class DbAccess { public SqlSession getSqlSession() throws IOException { //通过配置文件得到Reader对象 Reader reader=Resources.getResourceAsReader("com/lin/config/Configuration.xml"); //通过reader获取SqlSessionFactory SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader); //通过SqlSessionFactory打开一个数据库会话 SqlSession sqlSession=factory.openSession(); return sqlSession; } }
四、IUser接口具体代码实现:
package com.lin.dao; import com.lin.model.User; import java.util.List; /** * Created by lin on 2017/9/22. * 实现接口,接口中函数名就是User.xml配置文件中对应那个CRUD操作ID值 * 返回值类型就是操作数据库返回值类型 参数就是操作数据库需要的参数 * *myBatis自动实现user.xml配置文件和该接口之间的对接,所有不需要我们自己写实现类去实现该接口,
在Dao层中通过sqlSession.getMapper(IUser.class)就可以得到IUser接口实现的对象,直接调用接口中的方法
* IUser iUser=sqlSession.getMapper(IUser.class);//该方法底层的实现是通过泛型,传入什么类型对
象(Object.class)返回的就是对应的Object对象
* users=iUser.queryUserList();
*/
public interface
IUser {
//
对应的是
user.xml
中
id
为
queryUserList
的
select
标签语句
public
List<User>
queryUserList
()
;
public
User
queryOne
(User user)
;
public
List<User>
queryUsers
(User user)
;
//
模糊查询
public int
deleteOne
(
int
id)
;
public int
deleteBatch
(List<String> list)
;
public int
insertUser
(User user)
;
public int
updateUser
(User user)
;
}
五、Dao层调用代码和测试代码:
package com.lin.dao; import com.lin.DButil.DbAccess; import com.lin.model.User; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class userDao { public List<User> getUser(){ List<User> users=new ArrayList<>(); DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try { sqlSession =dbAccess.getSqlSession(); //sqlSession执行操作 //users=sqlSession.selectList("User.queryUserList"); IUser iUser=sqlSession.getMapper(IUser.class); //通过接口实现对配置文件中的查询进行操作,这样有利于避免多人开发是namespace冲突问题 users=iUser.queryUserList(); sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally { if(sqlSession!=null) sqlSession.close(); } return users; } public User selectOne(){ User user=new User(); DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try { sqlSession =dbAccess.getSqlSession(); User u=new User(); u.setId(1); //sqlSession执行操作 //在不通过IUser接口来代替namespace时,直接给namespace取值User时的执行方式: //user=sqlSession.select("User.queryOne"); //通过接口实现对配置文件中的查询进行操作,这样有利于避免多人开发是namespace冲突问题 IUser iUser=sqlSession.getMapper(IUser.class); user=iUser.queryOne(u); sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally { if(sqlSession!=null) sqlSession.close(); } return user; } public List<User> selectUser(String name,String password){ //模糊查询 List<User> users=new ArrayList<>(); DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try { sqlSession =dbAccess.getSqlSession(); //sqlSession执行操作 User u=new User(); u.setUserName(name); u.setPassword(password); //users=sqlSession.selectList("User.queryUsers",u); //当namespace不用结果实现,而直接起名为User时的写法 //面向接口编程,将上面一行换成下面两行 IUser iUser=sqlSession.getMapper(IUser.class); //面向接口编程 通过接口实现 users=iUser.queryUsers(u); sqlSession.commit(); System.out.println("查询数量"+users.size()); if(users.size()>0){ for(int i=0;i<users.size();i++){ System.out.println(users.get(i).getId()+" "+users.get(i).getUserName()+" "+users.get(i).getPassword()); } } } catch (IOException e) { e.printStackTrace(); }finally { if(sqlSession!=null) sqlSession.close(); } return users; } public void deleteOne(int id){ //单条删除 DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try{ sqlSession=dbAccess.getSqlSession(); //int a=sqlSession.delete("User.deleteOne",id); IUser iUser=sqlSession.getMapper(IUser.class); int a=iUser.deleteOne(id); sqlSession.commit(); System.out.println("删除情况:"+a); }catch(IOException e){ e.printStackTrace(); }finally { if(sqlSession!=null) sqlSession.close(); } } public void deleteBatch(List<String> list){ //批量删除 DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try{ sqlSession=dbAccess.getSqlSession(); //int a=sqlSession.delete("User.deleteBatch",list); IUser iUser=sqlSession.getMapper(IUser.class); int a=iUser.deleteBatch(list); System.out.println("批量删除:"+a); sqlSession.commit(); }catch (IOException e){ e.printStackTrace(); }finally { sqlSession.close(); } } public void insertUser(User user){ DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try{ sqlSession=dbAccess.getSqlSession(); //int a=sqlSession.insert("User.insertUser",user); IUser iUser=sqlSession.getMapper(IUser.class); int a=iUser.insertUser(user); System.out.println("插入user:"+a); sqlSession.commit(); }catch (IOException e){ e.printStackTrace(); }finally { sqlSession.close(); } } public void updateUser(User user){ DbAccess dbAccess=new DbAccess(); SqlSession sqlSession=null; try{ sqlSession=dbAccess.getSqlSession(); //int a=sqlSession.update("User.updateUser",user); IUser iUser=sqlSession.getMapper(IUser.class); int a=iUser.updateUser(user); System.out.println("修改人数:"+a+"个"); sqlSession.commit(); }catch (IOException e){ e.printStackTrace(); }finally { sqlSession.close(); } } @Test public void testUser(){ List<User> users=getUser(); System.out.println("人数"+users.size()); for(User u:users){ System.out.println(u.getUserName()); } } @Test public void selectone(){ User user=selectOne(); System.out.println(user.getId()+" "+user.getUserName()); } @Test public void testSelectUser() { selectUser("c","12"); } @Test public void testDeleteOne(){ //deleteOne(18); List<String> list=new ArrayList<>(); list.add("20"); list.add("17"); list.add("19"); deleteBatch(list); } @Test public void testInsert() { User user=new User(); // user.setId(7); user.setUserName("8cscs上传"); user.setPassword("123456"); insertUser(user); } @Test public void testUpdate() { User u=selectUser("5","38").get(0); System.out.println("修改用户"+u.getId()); u.setUserName("update执行"); updateUser(u); } }