关于使用Mybatis的使用说明(一)【未完善待更新】
(一)搭建Mybatis环境
(1)先导入常用的jar包:并且需要将lib文件夹下的包导入到项目中
(2)创建config文件夹,配置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
(3)配置数据库连接文件db.properties
jdbc.driver=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@localhost:1521:cmskf jdbc.username=cmskf jdbc.password=cmskf
(4)配置Mybatis的核心配制文件SqlMapConfig.xml:先暂时配置事务管理器和数据库连接,并加载配制文件:比如db.properties和映射文件mapper.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> <!-- 引用配置 文件 --> <properties resource="db.properties"/> <environments default="development"> <!-- 配制该标签的时候要有一定的顺序:事务管理器、数据库连接 --> <environment id="development"> <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> <!-- 加载映射配置文件 --> <mappers> <mapper resource="User.xml"/> </mappers> </configuration>
注意:此核心配制文件中标签有一定的顺序呢,在标签<environment></environments>中需要先加载事务管理器,在连接数据库。
(5)配制pojo对象类:User.java
package com.dbzhand.pojo; import java.util.Date; public class User { private int id; @Override public String toString() { return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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; } private String sex; private Date birthday; private String address; }
(6)配制映射文件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="test"> <!-- 根据用户ID查询用户信息 ,注意返回类型在没有定义别名的时候,使用包.类--> <!-- id :sql语句唯一标识符, parameterType是传入参数类型,resultType是返回结果集的类型, #{}占位符,起到占位符的作用,当传入的参数类型是基本数据类型的时候,占位符中的变量名可以顺便写 --> <!-- <select id="findUserByID" parameterType="int" resultType="com.dbzhand.pojo.User"> select * from user1 where id=#{id} </select> --> <!--(1) 如果输出结果为集合,则可以使用selectList方法 (2)若果输入的参数为基本类型,在${}中的值必须为value (3)${}为拼接符,有sql注入的风险 --> <!-- <select id="findUserByName" parameterType="String" resultType="com.dbzhand.pojo.User"> select * from user1 where name like '%${value}%' </select> --> <!-- #{}占位符,如果传入的是占位符,那么#{}中的变量名必须是pojo中对应的属性,属性。。。。。 如果要返回数据库自增的主键,可以使用SELECT LAST_INSERT_ID() --> <insert id="insertUser" parameterType="com.dbzhand.pojo.User"> <!-- 执行SELECT LAST_INSERT_ID()数据库函数,返回自增的主键,注意这个函数是MySql数据库的函数,oracle中不能使用 keyProperty:将返回的主键放入传入参数ID中保存。 order:当前函数相对于insert语句的执行顺序,在insertt前执行before,在insert之后执行AFTER resultType:id的类型,也就是keyproperties中属性的类型 --> <!-- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> --> insert into user1 (name,birthday,sex,address) values(#{name},#{birthday},#{sex},#{address}) </insert> <!-- <delete id="delUserById" parameterType="int"> delete from user where id=#{id} </delete> <update id="updateUserById" parameterType="cn.itheima.pojo.User"> update user set username=#{username} where id=#{id} </update> --> <delete id="delUserById" parameterType="int"> delete from user1 where id=#{id} </delete> <!-- 更新时,传入参数为pojo,而不是id --> <update id="updateUserById" parameterType="com.dbzhand.pojo.User"> update user1 set name=#{name} where id=#{id} </update> </mapper>
(7)测试类UserTest.java
package com.dbzhang.test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; import oracle.net.ns.SessionAtts; 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.Test; import com.dbzhand.pojo.User; /** * 关于该类中需要注意的事项: * (1)操作数据库的方法中参数:namespace.id * (2)关于更新时传参应为:pojo对象 * (3)Mybatis中默认不会自动提交事务,因此最好手工提交 * @author Administrator * */ public class UserTest { /*@Test public void findUserByID() throws IOException { String resource = "SqlMapConfig.xml"; // 1.通过流加载配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); System.out.println("\n\n\n"+inputStream); // 2.通过核心配置文件输出流创建回话工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 3.通过 会化工厂创建回话 SqlSession sqlSession = sqlSessionFactory.openSession(); // 4.开始执行映射文件中国的select //此处写法的注意:namespace.id User user = (User) sqlSession.selectOne("test.findUserByID", 1); System.out.println("\n\n输出:" + user); sqlSession.close(); }*/ /*@Test public void findUserByName() throws IOException{ String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); //此处写法的注意:namespace.id List<User> list = session.selectList("test.findUserByName", "A"); System.out.println("\n\nlist集合="+list); session.close(); }*/ /*@Test public void testInsertUser() throws Exception{ String resource = "SqlMapConfig.xml"; //通过流将核心配置文件读取进来 InputStream inputStream = Resources.getResourceAsStream(resource); //通过核心配置文件输入流来创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //通过工厂创建会话 SqlSession openSession = factory.openSession(); User user = new User(); user.setUsername("赵四"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("北京昌平"); System.out.println("====" + user.getId()); //此处写法的注意:namespace.id openSession.insert("test.insertUser", user); //提交事务(mybatis会自动开启事务,但是它不知道何时提交,所以需要手动提交事务) openSession.commit(); System.out.println("====" + user.getId()); }*/ /*插入pojo对象,手动提交事务,针对oracel中,暂时没有实现主键自增,所以插入数据时没有id暂时为空*/ /*@Test public void testInsertUser() throws IOException{ String resource = "SqlMapConfig.xml"; //通过流将核心配置文件读取出来 InputStream inputStream = Resources.getResourceAsStream(resource); //通过核心配置文件输入流来创建会话工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //创建会话 SqlSession sqlSessions = sqlSessionFactory.openSession(); //创建pojo对象User User user = new User(); user.setName("张三丰"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("男"); System.out.println("id1======"+user.getId()); sqlSessions.insert("test.insertUser", user); //提交事务(mybatis会自动提交事务,但不知道何时提交,所以需要手动提交事务) sqlSessions.commit(); System.out.println("id2======"+user.getId()); }*/ /*执行删除操作,手动提价事务**/ /*@Test public void delUserById() throws IOException{ String resource = "SqlMapConfig.xml"; //1.通过流将核心配置文件读取出来 InputStream inputStream = Resources.getResourceAsStream(resource); //2.通过核心输入流创建会话工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.打开会话 SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("test.delUserById", 1); //提交事务(mybatis不会自动提交事务,因此需要手动提交) sqlSession.commit(); }*/ /*是更新操作,根据Id去更新name,需要传入pojo对象**/ /*@Test public void updateUserById() throws IOException{ String resource = "SqlMapConfig.xml"; //1.通过流读取配制文件 InputStream inputStream = Resources.getResourceAsStream(resource); //2.通过核心配制文件输入流创建会话工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.打开会话 SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(1); user.setName("李小龙"); sqlSession.update("test.updateUserById", user); //4.提交事务 sqlSession.commit(); //5.关闭会话 sqlSession.close(); } */ }
初步完成!!!
(二)总结:
(1)区别占位符#{}和拼接符${}的区别:
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
(2)关于parameterType和resultType的区别
parameterType时传入参数的类型,mybatis根据ognl从输入对象中获取参数值并拼接在sql中;
resultType指定输出类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
(3)关于selectOne和selectList的区别:
selectOne是查询一条记录;selectList是查询一条或多条记录。