一、首先都是对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" 用) </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>foreach遍历,separator=“,”属性表示在拼接sql语句时会自动将末尾的逗号删除,保证sql语法正确-->
三、数据库连接工具类:(整合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接口实现的对象,直接调用接口中的方法*/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);}* IUser iUser=sqlSession.getMapper(IUser.class);//该方法底层的实现是通过泛型,传入什么类型对象(Object.class)返回的就是对应的Object对象
* users=iUser.queryUserList();
五、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); } }