user.java
package cn.itcast.mybatis.po; import java.util.Date; public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }
uese.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"> <!-- namespace命名空间,为了分类管理sql语句,对sql语句进行隔离,方便管理 ,在后面采用mapper开发dao这种方式时使用namespace有特殊作用... mapper代理开发时将namespace指定为mapper接口的全限定名 --> <mapper namespace="test"> <!-- 在mapper.xml文件中配置很多的sql语句,每个sql语句封装为一个MappedStatement对象 mapper.xml(就是这里的User.xml) --> <!-- 根据id查询用户信息 --> <!-- id:唯一标识 一个statement #{}:表示 一个占位符(?也表示一个占位符),如果#{}中传入简单类型的参数,#{}中的名称随意 parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数 resultType:输出结果 类型,不管返回是多条还是单条,指定单条的pojo类型 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE id= #{id} </select> <!-- 根据用户名称查询用户信息,可能返回多条,模糊查询, ${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。 --> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> select * from user where username like '%${value}%' </select> <!-- 添加用户 parameterType:输入 参数的类型,User对象 包括 username,birthday,sex,address #{}是占位符可以把字符串的日期类型自动转换为Date类型 #{}接收pojo数据,可以使用OGNL解析出pojo的属性值(OGNL对象导航语言,struts2可以使用OGNL,如果username是一个对象,则可以用#{username.name}) #{username}表示从parameterType中获取pojo的属性值 需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值。 解决思路: 通过LAST_INSERT_ID()函数获取刚插入记录的自增主键值, selectKey:用于进行主键返回,里面定义了获取主键值的sql,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。 order:设置selectKey中sql执行的顺序,相对于insert语句来说,AFTER就是在insert语句执行后执行select LAST_INSERT_ID() keyProperty:将主键值设置到User对象的哪个属性, resultType:select LAST_INSERT_ID()的结果 类型,就是要插入User对象的id属性的类型,如果User对象的id属性是string则这里就是String。 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() <!-- 这条语句可以直接在sqldevelop运行 --> </selectKey> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert> <!-- mysql的uuid生成主键 --> <!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="string"> select uuid() <!-- 这条语句可以直接在sqldevelop运行 </selectKey> INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address}) </insert> --> <!-- oracle 在执行insert之前执行select 序列.nextval() from dual取出序列最大值((select 序列.nextval()得到oracle的序列值),将值设置到user对象 的id属性 --> <!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="int"> select 序列.nextval() from dual <!-- 这条语句可以直接在sqldevelop运行 --> </selectKey> INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address}) </insert> --> <!-- 用户删除 --> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <!-- 用户更新 要求:传入的user对象中包括 id属性值 --> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
SqlMapConfig.xml
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 属性定义 加载一个properties文件 在 properties标签 中配置属性值 --> <properties resource="db.properties"> <!-- <property name="" value=""/> --> </properties> <!-- 定义 别名 --> <typeAliases> <!-- 单个别名的定义 alias:别名,type:别名映射的类型 --> <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --> <!-- 批量别名定义 指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写) --> <package name="cn.itcast.mybatis.po"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <!-- 数据库连接参数 --> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--加载mapper映射 如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。 --> <mappers> <!-- resource是classpath,通过resource加载mapper的映射文件 --> <mapper resource="sqlmap/User.xml" /> <!-- <mapper resource="mapper/UserMapper.xml" /> --> <!-- 通过class引用mapper接口 class:配置mapper接口全限定名 要求:需要mapper.xml和mapper.java同名并且在一个目录 中 --> <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> --> <!-- 批量mapper配置 通过package进行自动扫描包下边的mapper接口, 要求:需要mapper.xml和mapper.java同名并且在一个目录 中 --> <package name="cn.itcast.mybatis.mapper"/> </mappers> </configuration>
Test.java
package cn.itcast.mybatis.first; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; 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 org.junit.Before; import org.junit.Test; import cn.itcast.mybatis.po.User; public class MybatisFirst { // 会话工厂 private SqlSessionFactory sqlSessionFactory; // 创建工厂 @Before //before注解 public void init() throws IOException { // 配置文件(SqlMapConfig.xml) String resource = "SqlMapConfig.xml"; // 加载配置文件到输入 流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 测试根据id查询用户(得到单条记录) @Test public void testFindUserById() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库 // 第一个参数:statement的位置,等于namespace+statement的id // 第二个参数:传入的参数 //返回user User user = null; try { user = sqlSession.selectOne("test.findUserById", 2); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭sqlSession sqlSession.close(); } System.out.println(user); } // 测试根据id查询用户(得到单条记录) @Test public void testFindUserByName() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库 // 第一个参数:statement的位置,等于namespace+statement的id // 第二个参数:传入的参数 List<User> list = null; try { list = sqlSession.selectList("test.findUserByName", "小明"); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭sqlSession sqlSession.close(); } System.out.println(list.get(0).getUsername()); } // 测试根据id查询用户(得到单条记录) @Test public void testInsertUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库 // 创建插入数据对象 User user = new User(); user.setUsername("浪子燕青"); user.setAddress("河南郑州"); user.setBirthday(new Date()); user.setSex("1"); try { sqlSession.insert("test.insertUser", user); // 因为没有设置成自动提交,所以需要提交事务,以后与spring 自动整合之后通过spring管理这些类就自动提交了。 //调试的时候把myeclips编译好的控制台打印的sql语句放入sqlserver软件中进行手动调试 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭sqlSession sqlSession.close(); } //打印主键,比如2个表关联,把副表插入数据库之后把外键插入主表中 //不用<selectKey/>就没有主键id返回(此时id为null), //需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值。 System.out.println("用户的id=" + user.getId()); } // 测试根据id删除用户(得到单条记录) @Test public void testDeleteUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库 try { sqlSession.delete("test.deleteUser", 35); // 需要提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭sqlSession sqlSession.close(); } } // 测试根据id更新用户(得到单条记录) @Test public void testUpdateUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库 // 创建更新数据对象,要求必须包括 id User user = new User(); user.setId(35); user.setUsername("燕青"); user.setAddress("河南郑州"); // user.setBirthday(new Date()); user.setSex("1"); try { sqlSession.update("test.updateUser", user); // 需要提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭sqlSession sqlSession.close(); } System.out.println("用户的id=" + user.getId()); } }