mybatis入门程序-(二)
1. 添加配置文件
log4j.properties
# Global logging configuration
#开发环境下日志级别设置成DEBUG,生产环境设置成info或者error
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
db.properties
;;;;;;;;;;;;;;;;;;;;
;DataBaseConnection;
;;;;;;;;;;;;;;;;;;;;
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exam
jdbc.username=sa
jdbc.password=123456
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> <!-- 加载属性文件 --> <properties resource="db.properties"> <!--properties中还可以配置一些属性名和属性值 --> <!-- <property name="jdbc.driver" value=""/> --> </properties> <!-- 全局配置参数,需要时再设置 --> <!-- <settings> </settings> --> <!-- 别名定义 --> <typeAliases> <package name="cn.xm.pojo"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis--> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理--> <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> <package name="cn.xm.mapper"/> <!--引入分开的xml--> <mapper resource="sqlmap/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"> <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 --> <mapper namespace="test"> <!-- 在 映射文件中配置很多sql语句 --> <!-- 需求:通过id查询用户表的记录 --> <!-- 通过 select执行数据库查询 id:标识 映射文件中的 sql 将sql语句封装到mappedStatement对象中,所以将id称为statement的id parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 --> <!-- 开启二级缓存 --> <cache/> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE id=#{value} </select> <!-- 需求:通过username模糊查询用户表的记录 resultType:指定sql输出结果 的所映射的java对象类型(无论查出一条记录还是多条记录都是这样) ${}:Sql字符串拼接符,将接收到的参数不加任何修饰符拼接在sql中。如果参数类型是简单类型,${}中只能使用value ${}会引起sql注入,就是'%' or 1=1 or '%',客户输入其他sql语句让程序正常执行 --> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE username like '%${value}%' </select> <!-- 增加用户 (主键自增)--> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" > insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) <!--获取自增主键设置的主键值,利用mysql的SELECT last_insert_id() 返回上次插入数据的主键 (只适用于自增主键) keyProperty:将查询到的主键值映射到parameterType对应的对象的哪个属性 resultType:指定查询到的id返回的结果类型 order:指定相对insert语句的执行顺序 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT last_insert_id() </selectKey> </insert> <!-- 删除用户,根据Id删除 ,需要输入Id(int型) #{id}表示取一个参数,根据参数指定的类型 --> <delete id="deleteUserByTd" parameterType="int"> delete from user where id=#{id} </delete> <!-- 更新用户,根据Id更新 ,需要传入Id(int型)与更新信息 parameterType类型为User类型,指定需要修改的用户id和修改后的属性值,#{username}表示从传入的对象中取对应的username属性 #{id}表示从user对象中获取id --> <update id="updateUserByTd" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
2.入门代码测试:
(1)根据Id查询用户信息
(2)模糊查询代码测试
(3)添加用户
(4)删除用户
(5)更新用户
总结:
1. parameterType
在映射文件中通过parameterType指定输入 参数的类型。
2. resultType
在映射文件中通过resultType指定输出结果的类型。
3. #{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
实际可以这么理解,#{}会在里面加上单引号。${}不会加上单引号。比如:
如果变量的值是:safehatnum
(1)#{}加引号
select * from safehat order by #{order};
相当于
select * from safehat order by 'safehatnum';
(2)${}不加引号
select * from safehat order by ${order};
相当于
select * from safehat order by safehatnum;
参考:http://www.cnblogs.com/qlqwjy/p/7818579.html
4. selectOne和selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
如果使用selectOne报错:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
5. mybatis和hibernate本质区别和应用场景
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。
应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:
适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。