1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
解决方案:使用数据库连接池管理数据库连接。
2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
解决方案:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
解决方案:将sql语句及占位符号和参数全部配置在xml中。
4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
解决方案:将查询的结果集,自动映射成java对象。
Object-Relationl Mapping : 对象关系映射
java中的对象 -->(映射) 数据库的表
java中的属性 -->(映射) 数据库的列(字段)
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,
只要像平时操作对象一样操作它就可以了 。
什么是关系型数据库:以表组织数据以及行列的组成
关系模型就是“一对一、一对多、多对多”等关系模型
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,
并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 现在托管到gitHub上,
下载:https://github.com/mybatis/mybatis-3/releases(点击版本号,就能下载到本地)
MyBatis架构图
1、导入mybatis的jar包
2、主配置文件 mybatis-config.xml
mybatis-config.xml主要用来配置mybatis的运行环境,数据源、事务等。
<?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> <!-- 和spring整合后 environments配置将废除--> <environments default="oracle"> <!-- 可以配置多个environment --> <environment id="oracle"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="scott" /> <property name="password" value="tiger" /> </dataSource> </environment> </environments> <!-- 加载映射文件 :包名/mapper名.xml --> <mappers> <mapper resource="UserDao.xml" /> </mappers> </configuration>
3、日志记录文件:log4j.properties (4叫for)
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal #在开发的环境下,日志级别要设置成DEBUG,生产环境设置成info或error log4j.rootCategory=debug, CONSOLE, LOGFILE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n log4j.appender.LOGFILE=org.apache.log4j.FileAppender #日志生成地址:需要路径存在才能生成 log4j.appender.LOGFILE.File=D:/workspace/frame/logs/myabtis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
4、sql映射文件
User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,
比如:UserMapper.xml、ItemsMapper.xml.在映射文件中配置sql语句。
<?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进行分类管理 注意:使用mapper代理方法开发时,namespace需要特殊设置 --> <mapper namespace="test"> <!-- 根据id获取用户信息 --> <select id="findUserById" parameterType="int" resultType="org.csmf.mybatis.entity.User"> select * from t_user where id = #{id} </select> </mapper>
注意:添加了mapping.xml文件后。需要在 mybatis-config.xml中添加映射文件
<mappers> <mapper resource="UserMapper.xml"/> </mappers>
1、parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
2、占位符: #{}, ${} 推荐的是#{}, 底层使用?
${} 底层的sql进行sql拼接, 有sql注入的风险
--排序: order by ‘列名’ 列名一定要使用 ${}
3、selectOne()和selectList()
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
常见错误:
找不到sql语句:namespace名字没找到、名字打错了
1、user表数据库
2、user实体类
3、导入mybatis.jar包
4、配置mybatis-config.xml文件
5、配置log4j.properties日志记录文件
6、配置userMapping配置文件
7、添加测试类
根据id查询
<select id="findUserById" parameterType="int" resultType="mybatis.entity.User" >
select * from t_user where id=#{id}
</select>
根据姓名模糊查询
<select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.entity.User" >
select * from t_user where username LIKE ‘%${value}%‘
</select>
查询所有对象
<select id="findAll" resultType="mybatis.entity.User"> select * from t_user </select>
增删改,不用resultType返回值
<!-- 添加 --> <insert id="insertUser" parameterType="mybatis.entity.User" > insert into t_user values(sep_user.nextval,#{username},#{password},#{sex},#{brithday},#{address}) </insert> <!-- 删除 --> <delete id="deleteUser" parameterType="int"> delete from t_user where id = #{id} </delete> <!-- 修改 --> <update id="updateUser" parameterType="mybatis.entity.User"> update t_user set username = #{username},password = #{password},sex = #{sex},brithday = #{brithday}, address = #{address} where id = #{id} </update>
测试类
public static void main(String[] args) throws IOException, ParseException { // 1.加载并解析mybatis的全局配置文件,创建SqlSessionFactory对象 //1.0加载mybatis的全局配置文件,变成输出流 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //1.1通过SqlSessionFactoryBuiler 构造者模式 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //1.2通过SqlSessionFactoryBuilder的build()方法创建SqlSessionFactory在整个目录唯一 SqlSessionFactory sqlSessionFactory = builder.build(in); //2.由SqlSessionFactory创建SqlSession 工厂模式 SqlSession不是唯一 openSession() SqlSession sqlSession = sqlSessionFactory.openSession(); //3.通过sqlSesion操作数据库 。。。执行代码
//增删改,需要手动提交事务: sqlSession.commit(); //4.关闭SqlSession sqlSession.close();
执行代码
//按id查询 /*User user = sqlSession.selectOne("xx.queryUserById",1); System.out.println(user);*/ //查询所有对象 /*List<User> list = sqlSession.selectList("xx.findAll"); for (User user : list) { System.out.println(user); }*/ //模糊查询 -- 使用#{name}、%三% /*List<User> list = sqlSession.selectList("xx.findListByName", "三"); for (User user : list) { System.out.println(user); }*/ //添加对象 /*User user = new User(); user.setUsername("胡洪军"); user.setPassword("666"); user.setSex("男"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); user.setBrithday(sdf.parse("1998-9-1")); user.setAddress("泰和"); int i= sqlSession.insert("xx.insertUser", user); sqlSession.commit(); System.out.println("执行了"+i);*/ //删除对象 /*int i = sqlSession.delete("xx.deleteUser",26); sqlSession.commit(); System.out.println("执行了"+i);*/ //修改对象 /* User user = new User(); user.setUsername("张三"); user.setPassword("666"); user.setSex("男"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); user.setBrithday(sdf.parse("1998-9-1")); user.setAddress("泰和"); user.setId(25); int i = sqlSession.update("xx.updateUser",user); sqlSession.commit(); System.out.println("执行了"+i); */ //4.关闭SqlSession sqlSession.close();
原文:https://www.cnblogs.com/64Byte/p/12989451.html